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

2 分的閱讀內容
0

當我為我的 Amazon CloudFront 分佈設置標準名稱記錄(CNAME)別名時,出現「CNAMEAlreadyExists」錯誤訊息。

簡短說明

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

「您提供的一個或多個 CNAME 已經與不同的資源相關聯。服務: AmazonCloudFront;狀態碼: 409;錯誤代碼: CNAME 已存在;請求 ID:a123456b-c78d-90e1-23f4-gh5i67890jkl*"

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

**注意:**如果您要手動關聯 CNAME,則可能需要等到舊分佈的狀態為「已部署」時才能繼續。

如果您不知道分佈 ID,請使用 ListConflictingAliases CloudFront API。這可讓您尋找有關分佈的部分資訊以及與 CNAME 別名相衝突的帳戶 ID。然後,使用 AssociateAlias API 將您的 CNAME 從現有分佈 (來源分佈) 移至新分佈 (目標分佈) 中。根據您的案例情況使用下列其中一個解決方法:

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

解決方法

使用 AssociateAlias API 移動您的 CNAME

注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請確保您使用的是最新版本的 AWS CLI

1、 在提出 API 請求之使用者或角色的 AWS 身份和存取管理 (IAM) 政策中,新增下列資源層級權限:

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

{
  "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"
      ]
    }
  ]
}

注意:SourceAcccount 取代為來源分佈的 AWS 帳戶號碼。將 SourceDistroID 取代為來源分佈 ID。將 TargetAccountID 取代為目標分佈的 AWS 帳戶號碼。將 TargetDistroID 取代為目標分佈 ID。

2、 使用衝突的 CNAME 識別分佈。如果您不知道哪個分佈有衝突的 CNAME,請使用**ListConflictingAliases ** API 來查找該分佈:

$ aws cloudfront list-conflicting-aliases --distribution-id YourDistributionID --alias YourCNAME

**注意:**將 YourDistributionID 取代為您的分佈 ID。將 YourCNAME 取代為衝突 CNAME 別名。

3、 若要驗證網域的擁有權,您必須擁有**YourDistributionID **的讀取權限。您也必須擁有與 CloudFront 分佈關聯的且能保護衝突 CNAME 安全性的 SSL 憑證

當您準備好驗證擁有權時,請為 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 憑證。

**注意:**主旨名稱或主旨備用名稱必須與指定的 CNAME 別名相符或重疊。最佳做法是擁有由受信任 CA 核發的有效憑證,該憑證列於 Mozilla 的 CA 憑證清單AWS 憑證管理員中。

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

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

使用衝突的 CNAME 停用來源分佈

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

您可以使用關聯別名命令在不同 AWS 帳戶之間移動 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 帳戶,或者無法停用來源分佈,請聯絡 AWS Support

使用萬用字元移動備用網域名稱

如果來源分佈和目標分佈位於不同的帳戶中,但您無法停用來源分佈,請移動 CNAME。若要這麼做,請使用萬用字元。在此流程中,您必須擁有來源分佈和目標分佈的存取權。

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

1、 更新目標分佈以新增包含您要移動之備用網域名稱的萬用字元 CNAME。如果您的網域是 www.example.com,請在目標分佈中新增萬用字元備用網域名稱 *.example.com。

**注意:**您必須擁有保護萬用字元網域名稱的目標分佈的 SSL/TLS 憑證

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

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

注意: 即使在您更新 DNS 設定之後,來源分佈也會提出使用備用網域名稱的請求。這是因為備用網域名稱仍與來源分佈關聯。

3、 更新來源分佈以移除備用網域名稱。

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

4、 若要新增您想要移動的備用網域名稱,請更新目標分佈。

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

dig CNAME www.example.com +short
nslookup example.com

6、 (選用) 若要移除萬用字元備用網域名稱,請更新目標分佈。

AWS 官方
AWS 官方已更新 1 年前