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

时间:2018-10-11 21:42:47

标签: amazon-cloudfront amazon-route53 cname

我正在尝试将子域指向新的发行版。我有两个帐户:旧版

旧版帐户具有以下资源:

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

帐户具有以下资源:

  • 域名为qrs.cloudfront.net的CloudFront发行版

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

因此,我正在关注these official docs。我正在尝试通过将*.foo.com设置为新CloudFront发行版上的备用域名来遵循步骤3。

但是出现以下错误:

  

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

2 个答案:

答案 0 :(得分:3)

您要遵循的说明是将子域迁移到同一帐户中的另一个分发

  

即使备用域名已经存在于另一个CloudFront分配中,即使您的AWS账户拥有另一个域名,您也无法将备用域名添加到CloudFront分配中。

     

但是,您可以添加通配符备用域名(例如* .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解析路径。当使用HTTPS时,服务器只能通过HTTP Host标头和SNI字段的值来识别浏览器正在请求的站点-dzczcexample.cloudfront.net中间主机名在此过程中丢失。备用域名配置设置(由于遗留原因,不幸的是,又不准确地也称为CNAME)是CloudFront(大型的,全球分布的系统)用来确定哪个特定分发应处理请求的工具,因此备用域名可以对于整个CloudFront中的一个分发,只能设置为foo.example.com

如上所述,*.example.com只能在与foo.example.com相同的帐户内的CloudFront分布上进行设置,因为这样做会造成域劫持漏洞。

解决方法有些微妙,但是可以做到。

  • 在不设置备用域名的情况下设置新的CloudFront发行版,然后等待其转换为Deployed状态。
  • 更改DNS以指向为新发行版分配的主机名。这将无法实现您的预​​期:由于上面提到的Host标头/ SNI映射,流量实际上仍将由旧发行版处理...但是此设置需要更改才能继续。
  • 从旧发行版的“备用域名”设置中删除主机名并保存更改。
  • 将主机名添加到新发行版的“备用域名”设置中并保存更改。您应该在短时间内收到错误消息,此后更改将被接受,新发行版本将为流量提供服务。

您将要设置两个测试发行版和一个虚拟子域(可能完全在另一个域中),并按照以下步骤进行操作,以使自己熟悉该过程。在我之前完成此过程的过程中,造成的停机很短暂,因为您不是在创建新的发行版(这需要花费一些时间),而是仅更改一个稳定发行版的属性,然后更改另一个稳定发行版的属性。

答案 1 :(得分:0)

在尝试创建 login.example.com 子域以使用Cognito托管UI进行用户授权时,我遇到了此错误。我已经为example.com建立了CloudFront发行版以进行SSL保护。通过将备用域名之一从全部 *。example.com 更改为 www.example.com

,我能够解决该错误