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

上次更新日期:2021 年 8 月 18 日

为我的 Amazon CloudFront 分配设置别名记录别名时,我收到了 CNAMEAlreadyExists 错误提示。

简短描述

当我尝试将别名记录别名添加到我的 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 分配使用相同的别名记录别名。当您尝试添加的别名记录别名已与另一个 CloudFront 分配关联时,会发生 CNAMEAlreadyExists 错误。

要解决此错误,您可以使用 AssociateAlias ListConflictingAliases CloudFront API 来查找和移动您的别名记录。

请根据您的场景从下列解决方案中选择一种:

  • 如果您的源分配和目标分配位于同一账户中,请完成“使用 AssociateAlias API 移动别名记录”部分中的步骤。
  • 如果您的源分配和目标分配位于不同的账户上,请完成“使用 ListConflictingAliases API 移动别名记录”部分中的步骤。

解决方法

使用 AssociateAlias API 移动您的别名记录

重要提示:请确保将您的 AWS CLI 更新到 最新版本,以便可以使用以下命令。

1.    (必需)在源分配和目标分配的 AWS Identity and Access Management(IAM)策略中,向发出 API 请求的 IAM 用户或角色添加以下资源级权限:

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

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

2.    使用冲突的别名记录来识别分配。

如果您不知道哪个分配有冲突的别名记录,请使用 ListConflictingAliases API 查找该分配。例如:

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

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

3.    通过为解析为目标分配的规范名称的别名记录创建 DNS TXT 记录来验证域的所有权。您的 TXT 记录必须在别名记录、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.    验证目标分配是否具有有效的证书。

注意:主题名称或主题替代名称必须与给定的别名记录别名匹配或重叠。最佳实践是拥有一个由在 Mozilla 附带 CA 证书列表AWS Certificate Manager 中列出的受信任 CA颁发的有效证书。

5.    从源和目标分配所属的同一账户运行 AssociateAlias API 请求:

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

使用 ListConflictingAliases API 移动您的别名记录

重要提示:任何 AWS 托管式服务(例如边缘优化的 Amazon API Gateway)都不能代表您部署源分配。

必须将源分配状态设置为Disabled(已禁用)。要禁用分配:

1.    打开 CloudFront 控制台

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

3.    选择您的分配,然后选择Disable(禁用)。

如果您不知道哪个分配有冲突的别名记录,请使用 ListConflictingAliases API 查找该分配。例如:

$ aws cloudfront list-conflicting-aliases --distribution-id YourDistributiontID --alias YourCNAMEtoAdd

ListConflictingAliases API 需要 GetDistributionListConflictingAliases 权限。

注意:要验证所有权,您必须对 YourDistributionID 拥有读取权限。您还必须有一个关联的证书来保障冲突的别名记录的安全。

然后,进行以下操作:

1.    (必需)在目标分配的 IAM 策略中,向发出 API 请求的 IAM 用户或角色添加以下资源级权限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CloudFrontCnameSwapCrossAcc",
      "Effect": "Allow",
      "Action": [
        "cloudfront:AssociateAlias",
        "cloudfront:UpdateDistribution"
      ],
      "Resource": [
        "arn:aws:cloudfront::123456789:distribution/TargetDistroID"
      ]
    }
  ]
}

2.    通过为解析为目标分配的规范名称的别名记录创建 DNS TXT 记录来验证域的所有权。您的 TXT 记录必须在别名记录或 Apex 之前包含一个下划线。例如:

_cname.example.com.   900   IN   TXT     "dexample123456.cloudfront.net"
_.example.com.        900   IN   TXT     "dexample123456.cloudfront.net

3.    验证目标分配是否具有有效的证书。

注意:主题名称或主题替代名称必须与给定的别名记录别名匹配或重叠。最佳实践是拥有一个由在 Mozilla 附带 CA 证书列表AWS Certificate Manager 中列出的受信任 CA颁发的有效证书。

4.    运行 ListConflictingAliases API:

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

这篇文章对您有帮助吗?


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