CNAMEAlreadyExists:将子域指向新帐户中的分配

lf2*_*215 2 cname amazon-cloudfront amazon-route53

我试图将一个子域指向一个新的发行版。我有两个帐户:legacynew

传统的帐户拥有这些资源:

  • Route53 托管区域foo.com,具有:
    • CNAME a.foo.com->xyz.cloudfront.net
  • 带域名的 Cloudfront 分发xyz.cloudfront.net
    • 备用域名 (CNAME) a.foo.com
    • 证书 a.foo.com

新的帐户拥有这些资源:

  • 带域名的 CloudFront 分配 qrs.cloudfront.net

我希望最终设置是a.foo.comCNAME 到qrs.cloudfront.net. (我不明白为什么 CloudFront 发行版需要知道 CNAME 的内容,这可能是我不理解下面错误的部分原因。)

所以我正在关注这些官方文档。我正在尝试通过*.foo.com在新的 CloudFront 分配上设置为备用域名来执行第 3 步。

但我收到以下错误:

com.amazonaws.services.cloudfront.model.CNAMEAlreadyExistsException:您提供的一个或多个 CNAME 已经与不同的资源相关联。(服务:AmazonCloudFront;状态代码:409;错误代码:CNAMEAlreadyExists;)

Mic*_*bot 6

您所遵循的说明用于将子域迁移到同一帐户内的不同分配

如果备用域名已存在于另一个 CloudFront 分配中,则您无法向 CloudFront 分配添加备用域名,即使您的 AWS 账户拥有另一个分配也是如此。

但是,您可以添加通配符备用域名,例如 *.example.com,其中包括(重叠)非通配符备用域名,例如 www.example.com。重叠的域名可以在同一个分配中,也可以在不同的分配中,只要这两个分配都是使用同一个 AWS 账户创建的。 (强调)

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html#alternate-domain-names-wildcard

不可能在多个帐户之间存在通配符歧义,而您尝试执行的操作将设置这样的条件。它不受支持,因为它是一个安全漏洞。

我不明白为什么 Cloudfront 发行版需要知道 CNAME 的内容,这可能是我不理解下面错误的部分原因。

HTTP 和 DNS 以这样一种方式交互,目标服务器不知道将浏览器引导到它所连接的服务器地址的 DNS 解析路径。Host当使用 HTTPS 时,服务器只能通过 HTTP标头和 SNI 字段的值识别浏览器正在请求的站点——dzczcexample.cloudfront.net中间主机名在此过程中丢失。备用域名配置设置(不幸且不准确,由于遗留原因也称为 CNAME)是 CloudFront(一个庞大的全球分布式系统)用于确定应处理请求的特定分配,因此备用域名可以仅foo.example.com针对所有 CloudFront 中的一个分配设置为。

如上所述,*.example.com只能在与 相同帐户内的 CloudFront 分配上设置foo.example.com,因为否则会造成域劫持漏洞。

解决方法有点微妙,但可以完成。

  • 设置新的 CloudFront 分配,不设置备用域名,并等待它转换到Deployed状态。
  • 将 DNS 更改为指向为新分发分配的主机名。这不会像您想象的那样:由于Host上面提到的标头/SNI 映射,流量实际上仍将由旧发行版处理……但是在继续之前需要更改此设置。
  • 从旧发行版的备用域名设置中删除主机名并保存更改。
  • 将主机名添加到新发行版的备用域名设置并保存更改。您应该会在短时间内收到错误消息,之后更改将被接受,流量将由新的分发版提供服务。

您将需要设置两个测试分布和一个虚拟子域(可能完全在不同的域中)并完成这些步骤以熟悉该过程。当我之前完成此过程时,由此产生的中断是短暂的,因为您不是在创建新的发行版(这需要一些时间),而只是更改一个稳定发行版的属性,然后更改另一个。