为 CloudFront 分配设置 CNAME 别名时,如何解决 CNAMEAlreadyExists 错误?

上次更新日期:2022 年 9 月 22 日

为 Amazon CloudFront 分配设置规范名称记录(CNAME)别名时,遇到“CNAMEAlreadyExists”错误。如何解决此问题?

简短描述

当您尝试添加的 CNAME 别名已与另一个 CloudFront 分配关联时,会发生 CNAMEAlreadyExists 错误。您不能对多个 CloudFront 分配使用相同的 CNAME 别名。错误类似如下内容:

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,则在旧分配的状态为“已部署”之前,您可能无法将 CNAME 关联至新分配。

如果您不知道分配 ID,请使用 ListConflictingAliases CloudFront API 查找有关分配的部分信息以及冲突 CNAME 别名的账户 ID。然后,使用 AssociateAlias API 将 CNAME 从现有分配(源分配)移动到新分配(目标分配)。请根据您的场景从下列解决方案中选择一种:

  • 如果您的源分配和目标分配位于同一账户中,请完成“使用 AssocateAlias API 移动 CNAME”部分中的步骤。
  • 如果您的源分配和目标分配位于不同的 AWS 账户中,请完成“停用具有冲突 CNAME 的源分配”部分中的步骤。
  • 如果您的源分配和目标分配位于不同的 AWS 账户中,并且源分配由于现有流量停机而无法停用,请完成“使用通配符移动备用域名”部分中的步骤。

解决方法

使用 AssociateAlias API 移动您的 CNAME

注意:如果您在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请确保您运行的是最新版本的 AWS CLI

1.    在发出 API 请求的用户或角色的 AWS Identity and Access Management (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"
      ]
    }
  ]
}

重要提示:发出请求的 IAM 用户或角色必须在 IAM policy 中对源分配和目标分配拥有前面提到的资源级权限。

注意:将 SourceAccCount 替换为源分配的 AWS 账号。将 SourceDistroID 替换为源分配 ID。将 TargetAccountID 替换为目标分配的 AWS 账号。将 TargetDistroID 替换为目标分配 ID。

2.    使用冲突的 CNAME 来识别分配。如果您不知道哪个分配有冲突的 CNAME,请使用 ListConflictingAliases API 查找该分配。将 YourDistributionID 替换为您的分配 ID。将 YourCNAME 替换为冲突的 CNAME 别名。

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

注意:要验证所有权,您必须对 YourDistributionID 拥有读取权限。您还必须拥有与 CloudFront 分配关联的 SSL 证书,以保障冲突的 CNAME 的安全。

3.    通过为解析为目标分配的 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 别名匹配或重叠。最佳实践是拥有一个由在 Mozilla 的 wiki 上的 CA 证书列表AWS Certificate Manager 中列出的受信任 CA 颁发的有效证书。

5.    从拥有目标分配的账户运行 AssociateAlias API 请求:

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

停用具有冲突 CNAME 的源分配

如果您的源分配和目标分配位于不同的 AWS 账户中,请先禁用与冲突域关联的源分配。然后,使用 AssociateAlias API 移动 CNAME。

还可以使用 associate-alias command 在不同 AWS 账户之间移动顶级域。

1.    打开 CloudFront 控制台

2.    在导航窗格中,选择 Distributions(分配)

3.    选择源分配,然后选择 Disable(禁用)。
如果您不知道哪个分配有冲突的 CNAME,请使用 ListConflictingAliases API 查找该分配。请确保将 YourDistributionID 替换为您的分配 ID,将 YourCNAME 替换为冲突 CNAME 的名称:

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

注意:ListConflictingAliases API 需要 GetDistribution 和 ListConflictingAliases 权限。

停用源分配后,请按照“使用 AssociateAlias API 移动您的 CNAME”部分中的步骤进行操作。

如果您无权访问带有源分配的 AWS 账户,或者无法停用源分配,请联系 AWS Support

使用通配符移动备用域名

如果您的源分配和目标分配位于不同的 AWS 账户中,但无法停用源分配,请使用通配符移动 CNAME。您必须同时拥有源分配和目标分配的访问权限才能执行此过程。

注意:不能使用通配符移动顶点域 (example.com)。要在源分配和目标分配位于不同的 AWS 账户中时移动顶点域,请联系 AWS Support 以移动备用域名

重要提示:此过程涉及对源分配和目标分配的多次更新。请等待每个分配都完全部署最新的更改,然后继续下一步。

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.    使用 dig 或类似的 DNS 查询工具验证 CNAME 的 DNS 记录。例如:

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

6.    (可选)更新目标分配以移除通配符备用域名。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?