如何解决在为 CloudFront 分配设置 CNAME 别名时出现的 CNAMEAlreadyExists 错误?
在为 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,可能需要等到旧分配的状态为已部署后才能继续。
如果不知道分配 ID,请使用 ListConflictingAliases CloudFront API。这样,您便可以查找有关分配的部分信息,以及冲突的 CNAME 别名的 AWS 账户 ID。然后,使用 AssociateAlias API 将 CNAME 从现有分配(源分配)移至新分配(目标分配)。
根据场景使用以下解决方法之一:
- 对于同一账户中的源和目标分配,请参阅使用 AssociateAlias API 移动 CNAME 部分。
- 有关跨账户源和目标分配,请参阅停用具有冲突 CNAME 的源分配部分。
- 如果由于现有流量停机时间而无法停用源分配,请参阅“使用通配符移动备用域名”。
**注意:**不能使用通配符来移动顶点域 (example.com)。要在源分配和目标分配位于不同账户中时移动顶点域,请参阅联系 AWS Support 以移动备用域名。
解决方法
使用 AssociateAlias API 移动 CNAME
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,确保您使用的是最新版本的 AWS CLI。
要移动 CNAME,请完成以下步骤:
-
在发出 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 用户或角色必须在源分配和目标分配中拥有这些资源级别的权限。
-
确定具有冲突 CNAME 的分配。如果不知道哪个分配具有冲突的 CNAME,则使用 ListConflictingAliases API 来查找该分配:
**注意:**请将 YourDistributionID 替换为您的分配 ID,将 YourCNAME 替换为冲突的 CNAME 别名。$ aws cloudfront list-conflicting-aliases --distribution-id YourDistributionID --alias YourCNAME
-
要验证域的所有权,您必须对 YourDistributionID 拥有读取访问权限。您还必须拥有与 CloudFront 分配关联的 SSL/TLS 证书,以保护冲突的 CNAME。在准备好验证所有权时,请为 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"
-
验证目标分配是否具有有效的 SSL 证书。
**注意:**主题名称或主题备用名称必须与 CNAME 别名匹配或重叠。最佳做法是拥有由 AWS Certificate Manager 或 Mozilla 的 CA 证书列表中列出的受信任 CA 颁发的有效证书。有关详细信息,请参阅 Mozilla 的 CA 证书计划(在 Mozilla 网站上)。 -
从拥有目标分配的账户运行 AssociateAlias API 请求:
$ aws cloudfront associate-alias --target-distribution-id YourTargeDistributiontID --alias your_cname.example.com
停用具有冲突 CNAME 的源分配
对于位于不同账户中的源分配和目标分配,请关闭与冲突域关联的源分配。然后,使用 AssociateAlias API 移动 CNAME。
使用 associate-alias 命令在不同账户之间移动顶点域:
- 打开 CloudFront 控制台。
- 在导航窗格中,选择 Distributions(分配)。
- 选择源分配,然后选择 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 Support。
使用通配符移动备用域名
如果源分配和目标分配位于不同账户中,但您无法停用源分配,请使用通配符移动 CNAME。必须同时拥有对源分配和目标分配的访问权限才能移动 CNAME。
此过程涉及对源分配和目标分配的多次更新。等待每个分配完全部署最新的更改,然后再继续下一步。
要移动备用域名,请完成下面的步骤:
-
更新目标分配,以便添加涵盖了要移动的备用域名的通配符 CNAME。如果域是 *.example.com 添加到目标分配中。
**注意:**必须在目标分配中拥有用于保护通配符域名的 SSL/TLS 证书。 -
更新 CNAME 的 DNS 设置,以便指向目标分配的规范名称。例如,如果域是 的 DNS 记录,以便将流量路由到目标分配的规范名称:
www.example.com. 86400 IN CNAME "dexample123456.cloudfront.net"
**注意:**由于备用域名仍与源分配相关联,因此源分配仍会收到使用备用域名的请求。直到您在步骤 3 中从源分配中删除备用域名后,目标分配才不会收到请求(割接)。
-
更新源分配以删除备用域名。
**注意:**在此步骤中,实时流量不会发生中断。由于请求的域名与添加到目标分配的通配符域匹配,因此实时流量会使用目标分配设置。 -
要添加打算移动的备用域名,请更新目标分配。
-
要验证 CNAME 的 DNS 记录,请使用 dig 或类似 DNS 查询工具:
dig CNAME www.example.com +shortnslookup example.com
-
(可选)要删除通配符备用域名,请更新目标分配。
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前