跳至内容

如何解决在为 CloudFront 分配设置 CNAME 别名时出现的 CNAMEAlreadyExists 错误?

2 分钟阅读
0

在为 Amazon CloudFront 分配设置规范名称记录 (CNAME) 别名时,我收到“CNAMEAlreadyExists”错误。

简短描述

您不能对多个 CloudFront 分配使用相同的 CNAME 别名。当要添加的 CNAME 别名已经与另一个 CloudFront 分配关联时,会收到以下错误:

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

如果有权访问源和目标分配,请手动从现有 CloudFront 分配中删除 CNAME 关联。然后,将 CNAME 与新的 CloudFront 分配关联。

**注意:**要手动关联 CNAME,可能需要等到现有分配的状态为 Deployed(已部署)。

要获取有关冲突的 CNAME 别名的分配和 AWS 账户 ID 的部分信息,请运行 AWS 命令行界面 (AWS CLI) 命令 list-conflicting-aliases。然后,运行 associate-alias 命令,以将 CNAME 从现有分配(源分配)移至新分配(目标分配)。

根据您的场景使用以下解决方法之一:

  • 对于同一账户中的源分配和目标分配,请参阅“移动 CNAME”部分。
  • 对于跨账户源分配和目标分配,请参阅“停用具有冲突 CNAME 的源分配”部分。
  • 如果无法停用源分配,请参阅“使用通配符移动备用域名”部分。
    **注意:**不能使用通配符来移动顶点域 (example.com)。要在源分配和目标分配位于不同账户时移动顶点域,请参阅联系支持以移动备用域名

解决方法

移动 CNAME

**注意:**如果您在运行 AWS CLI 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

必须同时拥有对源分配和目标分配的访问权限才能移动 CNAME。

要移动 CNAME,请完成以下步骤:

  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 用户或角色必须在源分配和目标分配中拥有上述权限。在上述策略中,请将 SourceAcccount 替换为源分配的账号,将 SourceDistroID 替换为源分配的 ID。此外,请将 TargetAccount 替换为目标分配的账号,将 TargetDistroID 替换为目标分配的 ID。

  2. 运行 list-conflicting-aliases 命令以查找具有冲突 CNAME 的分配:

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

    **注意:**请将 YourDistributionID 替换为您的分配 ID,将 YourCNAME 替换为冲突的 CNAME 别名。

  3. 为 CNAME 创建一个 DNS TXT 记录,该记录可解析为目标分配的规范名称,以验证所有权。TXT 记录必须在 CNAME、顶点或通配符前面包含下划线:

    _.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"

    **注意:**要验证域的所有权,您必须对 YourDistributionID 拥有读取访问权限。您还必须拥有与 CloudFront 分配关联的 SSL/TLS 证书,以保护冲突的 CNAME。

  4. 验证目标分配是否具有有效的 SSL 证书。
    **注意:**主题名称或主题备用名称必须与 CNAME 别名匹配或重叠。最佳做法是拥有由 AWS Certificate Manager 或 Mozilla 的 CA 证书列表中列出的受信任证书颁发机构 (CA) 颁发的有效证书。有关详细信息,请参阅 Mozilla 网站上的 Certificate Authorities(证书颁发机构)

  5. 从拥有目标分配的账户运行 associate-alias 命令:

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

    **注意:**请将 YourTargeDistributiontID 替换为您的目标分配的 ID,将 your_cname.example.com 替换为您的域。

停用具有冲突 CNAME 的源分配

对于位于不同账户中的源分配和目标分配,请关闭与冲突域关联的源分配。然后,按照“移动 CNAME”部分中的步骤进行操作。

要关闭与冲突域关联的源分配,请完成以下步骤:

  1. 打开 CloudFront 控制台
  2. 在导航窗格中,选择 Distributions(分配)。
  3. 选择源分配,然后选择 Disable(禁用)。

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

使用通配符移动备用域名

如果源分配和目标分配位于不同账户中,但您无法停用源分配,请使用通配符移动 CNAME。

在以下过程中,请等待每个分配完全部署更新,然后再继续下一步。

要移动备用域名,请完成以下步骤:

  1. 更新目标分配,以便为要移动的备用域名添加通配符 CNAME。例如,如果域为 www.example.com,请在目标分配中添加通配符备用域名 *.example.com
    **注意:**必须在目标分配中拥有用于保护通配符域名的 SSL/TLS 证书。

  2. 更新 CNAME 的 DNS 记录,以将流量路由到目标分配的规范名称:

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

    **注意:**由于备用域名仍与源分配相关联,因此源分配仍会收到使用备用域名的请求。仅当从源分配中删除备用域名后,目标分配才会接收请求。

  3. 更新源分配以删除备用域名。
    **注意:**在更新过程中,实时流量不会发生中断。由于请求的域名与您添加到目标分配的通配符域匹配,因此实时流量会使用目标分配设置。

  4. 要添加打算移动的备用域名,请更新目标分配。

  5. 要验证 CNAME 的 DNS 记录,请使用 dig 或类似 DNS 查询工具:

    dig CNAME www.example.com +shortnslookup example.com
  6. (可选)要删除通配符备用域名,请更新目标分配。

AWS 官方已更新 6 个月前