當我為 CloudFront 分佈設定 CNAME 別名時,如何解決 "CNAMEAlreadyExists" 錯誤?

3 分的閱讀內容
0

我為 Amazon CloudFront 分佈設定正規名稱記錄 (CNAME) 別名時,我會收到 "CNAMEAlreadyExists" 錯誤。

簡短說明

您不能在一個以上的 CloudFront 分佈中使用相同的 CNAME 別名。您要新增的 CNAME 別名已與另一個 CloudFront 分佈產生關聯時,您會收到錯誤:

"One or more of the CNAMEs you provided are already associated with a different resource.(Service: AmazonCloudFront; Status Code: 409; Error Code: CNAMEAlreadyExists; Request ID: a123456b-c78d-90e1-23f4-gh5i67890jkl*"

如果您同時擁有來源和目標分佈的存取權,則請從現有的 CloudFront 分佈中手動移除 CNAME 關聯。然後,將 CNAME 與新的 CloudFront 分佈產生關聯。

注意:若要手動關聯 CNAME,則您可能需要等待舊分佈的狀態為已部署時才能繼續。

如果您不知道分佈 ID,則請使用 ListConflictingAliases CloudFront API。這可讓您尋找有關分佈的部分資訊,以及與 CNAME 別名相衝突的 AWS 帳戶 ID。然後,使用 AssociateAlias API 將您的 CNAME 從現有的分佈 (來源分佈) 移至新分佈 (目標分佈)。

根據您的情況使用下列其中一項解決方法:

  • 對於同一帳戶中的來源分佈和目標分佈,請參閱使用 AssociateAlias API 移動 CNAME 這一節。
  • 對於跨帳戶來源分佈與目標分佈,請參閱停用衝突 CNAME 的來源分佈區段。
  • 如果因為現有流量的停機時間而無法停用來源分佈,則請參閱使用萬用字元來移動替代網域名稱
    **注意:**您無法使用萬用字元來移動 Apex 網域 (example.com)。若要在來源分佈和目標分佈位於不同的帳戶時移動 Apex 網域,請參閱聯絡 AWS Support 來移動替代網域名稱

解決方法

使用 AssociateAlias API 來移動您的 CNAME

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,則請參閱對 AWS CLI 進行錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

若要移動 CNAME,請完成下列步驟:

  1. 在提出 API 請求之使用者或角色的 AWS Identity and Access Management (IAM) 政策中,新增下列資源層級的許可:
    **注意:**將 SourceAcccount 取代為來源分佈的帳號。將 SourceDistroID 取代為來源分佈 ID。將 TargetAccountID 取代為目標分佈的帳號。使用目標發佈 ID 取代。

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "CloudFrontCnameSwapSameAcc",
          "Effect": "Allow",
          "Action": [
            "cloudfront:GetDistribution",
            "cloudfront:ListConflictingAliases",
            "cloudfront:AssociateAlias",
            "cloudfront:UpdateDistribution"
          ],
          "Resource": [
            "arn:aws:cloudfront::SourceAcccount:distribution/SourceDistroID",
            "arn:aws:cloudfront::TargetAccount:distribution/TargetDistroID"
          ]
        }
      ]
    }

    重要: 提出請求的 IAM 使用者或角色在來源分佈和目標分佈中必須具有資源層級許可。

  2. 識別衝突 CNAME 的分佈。如果您不知道哪個分佈具有衝突的 CNAME,則請使用 ListConflictingAliases API 來尋找該分佈:
    **注意:**將 YourDistributionID 取代為分佈的 ID,並且將 YourCNAME 取代為衝突的 CNAME 別名。

    $ aws cloudfront list-conflicting-aliases --distribution-id YourDistributionID --alias YourCNAME
  3. 若要驗證網域的擁有權,您必須擁有 YourDistributionID 的讀取權。您也必須擁有與 CloudFront 分佈關聯的 SSL/TLS 憑證,該憑證會保護衝突 CNAME。您準備好驗證擁有權時,請為 CNAME 建立 DNS TXT 記錄,以解析目標分佈的正規名稱。您的 TXT 記錄必須在 CNAME、Apex 或萬用字元之前包括底線:

    _.example.com.         900   IN   TXT     "dexample123456.cloudfront.net"_cname.example.com.    900   IN   TXT     "dexample123456.cloudfront.net"
    _*.example.com.        900   IN   TXT     "dexample123456.cloudfront.net"
  4. 驗證目標分佈是否具有有效的 SSL/TLS 憑證。
    **注意:**主旨名稱或主旨替代名稱必須與 CNAME 別名相符或重疊。最佳實務是擁有列在 Mozilla 的 CA 憑證清單中的 AWS Certificate Manager 或信任的 CA 所核發的有效憑證。如需詳細資訊,請參閱 Mozilla 的 CA 憑證計劃 (在 Mozilla 網站上)。

  5. 從擁有目標分佈的帳戶執行 AssociateAlias API 請求:

    $ aws cloudfront associate-alias --target-distribution-id YourTargeDistributiontID --alias your_cname.example.com

停用衝突 CNAME 的來源分佈

對於位於不同帳戶中的來源分佈和目標分佈,請關閉與衝突網域相關聯的來源分佈。然後,使用 AssociateAlias API 移動 CNAME。

使用 associate-alias 命令來移動不同帳戶之間的 Apex 網域:

  1. 開啟 CloudFront 主控台
  2. 在導覽窗格中,選擇分佈
  3. 選取來源分佈,然後選擇停用
    **注意:**如果您不知道哪個分佈具有衝突的 CNAME,請使用 ListConflictingAliases API 來尋找該分佈。將 YourDistributionID 取代為您的分佈 ID,並且將 YourCNAME 取代為衝突 CNAME 的名稱:
    $ aws cloudfront list-conflicting-aliases --distribution-id YourDistributionID --alias YourCNAME

注意ListConflictingAliases API 需要 GetDistributionListConflictingAliases 權限。

停用來源分佈之後,請遵循使用 AssociateAlias API 來移動 CNAME 區段中的步驟。

如果您沒有包含來源分佈的帳戶存取權,或您無法停用來源分佈,則請聯絡 AWS Support

使用萬用字元來移動替代網域名稱

如果來源分佈和目標分佈位於不同的帳戶中,但您無法停用來源分佈,則請使用萬用字元來移動 CNAME。您必須同時擁有來源分佈和目標分佈的存取權來移動 CNAME。

此程序會涉及來源分佈和目標分佈的多項更新。等待每個分佈完全部署最新的變更後,才能繼續下一步。

若要移動替代網域名稱,請完成下列步驟:

  1. 更新目標分佈以新增涵蓋您要移動之替代網域名稱的萬用字元 CNAME。如果您的網域是 *.example.com 新增至目標分佈。
    **注意:**您必須擁有保護萬用字元網域名稱的目標分佈的 SSL/TLS 憑證。

  2. 更新 CNAME 的 DNS 設定,以指向目標分佈的正規名稱。例如,如果您的網域是 的 DNS 記錄,將流量路由到目標分佈的正規名稱:

    www.example.com.         86400   IN   CNAME     "dexample123456.cloudfront.net"

    **注意:**由於替代網域名稱仍然與來源分佈相關聯,因此來源分佈仍會收到要使用替代網域名稱的要求。直到您在步驟 3 中從來源發佈中移除替代網域名稱為止,目標發佈不會接收要求 (切換)。

  3. 更新來源分佈來移除替代網域名稱。
    **注意:**在此步驟中,即時流量不會中斷。由於請求的網域名稱與新增至目標分佈的萬用字元網域相符,因此即時流量會使用目標分佈設定。

  4. 若要新增您要移動的替代網域名稱,請更新目標分佈。

  5. 若要驗證 CNAME 的 DNS 記錄,請使用 dig 或類似的 DNS 查詢工具:

    dig CNAME www.example.com +shortnslookup example.com
  6. (選用) 若要移除萬用字元替代網域名稱,請更新目標分佈。

AWS 官方
AWS 官方已更新 2 個月前