types为CNAME的RRSet,DNS名称为foo.com。 禁止在bar.com区的顶点

我拥有foo.combar.com 。 我正在pipe理Route53。 foo.com托pipe我的网站,我希望将stream量从bar.comfoo.com 。 我试图设置bar.comCNAMElogging指向foo.com ,但我得到了错误消息:

 RRSet of type CNAME with DNS name foo.com. is not permitted at apex in zone bar.com. 

为什么不行,我能做些什么呢?

根据RFC1912第2.4节:

  A CNAME record is not allowed to coexist with any other data. In other words, if suzy.podunk.xx is an alias for sue.podunk.xx, you can't also have an MX record for suzy.podunk.edu, or an A record, or even a TXT record. Especially do not try to combine CNAMEs and NS records like this!: podunk.xx. IN NS ns1 IN NS ns2 IN CNAME mary mary IN A 

RFC是非常有意义的,因为域名服务器不知道它是否需要关注CNAME或者与CNAME重叠的实际logging进行回答。 bar.com是一个区域,因此它隐含有一个bar.com名称的SOAlogging。 您不能同时拥有同名的SOAlogging和CNAME。

但是,由于SOAlogging通常只用于区域维护,因此您想在区域顶点提供CNAME的这些情况非常普遍。 尽pipeRFC禁止它,许多工程师会喜欢这样的行为:“除非查询明确要求SOAlogging,否则请遵循CNAME”。 这就是Route 53提供alias records的原因。 这些是Route 53特定function,可提供您所需的确切function。 看看http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingAliasRRSets.html

  1. 创build一个名为bar.com的S3存储桶。 (名称必须与您要redirect的域相同才能使用!)
  2. bar.com S3桶去Properties > Static Website Hosting ,selectRedirect all requests to another host name并在文本框中inputfoo.com
  3. 返回路线53,在您的bar.comHosted Zone中,单击Create Record Set 。 selectA - IPv4 addresstypes的A - IPv4 address 。 单击YesAlias 。 点击Alias Target的文本框。 bar.com应该列在-- S3 Website Endpoints -- 。 保存logging。 等待几分钟,你应该有一个redirect设置redirect从bar.com到foo.com的请求。

你可以使用相同的方法将一个裸域redirect到一个子域(如www)。 在www.foo.com必须是CNAME的情况下,我使用这种方法,所以我用这种方法从foo.comredirect到www.foo.com。 如果foo.com是Alogging,则可以使用此技术从www.foo.comredirect到foo.com。

注意:此方法将以完整path转发。 即http://bar.com/test将转发到http://foo.com/test

你应该使用DNAME而不是CNAME。 CNAMElogging只能将标签redirect到另一个标签。

当你谈论redirect域名而不是标签时,你应该使用DNAME

 $ORIGIN bar.com IN DNAME foo.com 

这也意味着每一个A,NS和更多的logging都应该被删除。 这必须在foo.com域中进行configuration。

tldr; 您必须传递一个FQDN作为ResourceRecordSet名称。

我有这个相同的问题使用这个声明c#剪辑:

  private static void RegisterHostWithDns(IAmazonRoute53 ec2,SynoviaImage image) { var changeBatch = new ChangeBatch(); var rRs = new ResourceRecordSet(image.Name, RRType.CNAME) {TTL=60,ResourceRecords = new List<ResourceRecord>() { new ResourceRecord(image.PublicDns)} }; var change = new Change(ChangeAction.UPSERT, rRs); changeBatch.Changes.Add(change); var request = new ChangeResourceRecordSetsRequest(ConfigurationManager.AppSettings["DnsZoneId"], changeBatch); var response = ec2.ChangeResourceRecordSets(request); Console.WriteLine("Updated CNAME For {0} setting {1}",image.Name,image.PublicDns); } 

在这种情况下,image.Name ==“Listener”

一旦我改变它:

  private static void RegisterHostWithDns(IAmazonRoute53 ec2,SynoviaImage image) { var changeBatch = new ChangeBatch(); var rRs = new ResourceRecordSet(string.Format("{0}.{1}",image.Name, "testing.foo.bar.com"), RRType.CNAME) {TTL=60,ResourceRecords = new List<ResourceRecord>() { new ResourceRecord(image.PublicDns)} }; var change = new Change(ChangeAction.UPSERT, rRs); changeBatch.Changes.Add(change); var request = new ChangeResourceRecordSetsRequest(ConfigurationManager.AppSettings["DnsZoneId"], changeBatch); var response = ec2.ChangeResourceRecordSets(request); Console.WriteLine("Updated CNAME For {0} setting {1}",image.Name,image.PublicDns); } 

现在传入的值是:“Listener.fully.qualified.com”

它现在有效。

在Route53上,您需要创build一个Alogging而不是CNAMElogging,并在其下创build一个别名。

从@ ewalshe对Alexandru Cucu的回答的评论,如果你来这里尝试设置一个自定义域名的API网关,并有一个Cloudfront的分配url。