Route53 中的 A Rec 和 CNAME 之间的区别

Posted

技术标签:

【中文标题】Route53 中的 A Rec 和 CNAME 之间的区别【英文标题】:Difference between an A Rec and CNAME in Route53 【发布时间】:2013-06-16 03:06:48 【问题描述】:

由于 Amazon Route 53 允许您使用别名将 A 记录或 CNAME 设置为不同的子域名,我想知道 A 记录和 CNAME 现在有什么区别。

为了澄清我的问题,传统名称服务器中的 CNAME 和 A 记录之间的区别在于,只有 CNAME 可以用于指向不同的子域,并且 A 记录必须指向有效的 IP 地址。由于 AWS Route53 允许您使用带有 A Rec 或 CNAME 的子域 .. 它不会模糊两者之间的区别。

【问题讨论】:

【参考方案1】:

您的问题非常有效,但您使用“子域”一词的方式并不十分精确。

您实际上要问的是这样一个事实,即 Route 53、A 记录可以给出引用来自另一个域的完全限定主机名,或者来自其自己域的主机名或子域的外观,而在正确的 DNS,引用另一个主机名的唯一方法是使用 CNAME,但这些不能在指向子域(“www.example.com”)的域(“example.com”)的顶点进行配置.

您是说,别名在功能上似乎是等效的,但比CNAME 更灵活,所以有区别吗?

CNAME 和别名之间的区别在于,CNAME 仍然是一个适当的、标准的、普通的 DNS CNAME,它返回一个 DNS 查询响应“嗨,你需要知道 您要查找的服务器的真实 ("canonical") name 是'x'",并且根据具体情况,还可能包括@987654328 @记录目标主机,也可能不记录,需要客户端进行第二次查找。

另一方面,别名是 Amazon 创建的一个聪明的 hack,它不会破坏协议,但允许 Route 53 直接从资源“X”分发 A 记录,而 A 记录为资源“ Y”被请求。别名也可以引用其他记录类型,但它们引用的记录类型必须相同,为了讨论的目的,我说的是A记录别名。

而且,这里重要的一点是,别名实际上返回了 A 记录——而不是像 CNAME 那样对目标的引用。

问题在于,使用别名时,您不能在该框中只输入任何主机名。它必须是 Route 53 具有神奇钩子的域中的主机名,以便它可以检索适当的 A 记录以提供服务——无论是您区域中的另一个条目,还是来自 S3、ELB 或 Cloudfront。这与 CNAME 记录的工作方式完全不同,尽管最终效果似乎相同。

把其他东西放在那里,然后The record set could not be saved because:- Alias Target contains an invalid value. 试试看。 :)

当然,CNAME 记录没有这样的限制……它们只是在设计上限制在区域顶部的使用。

因此,事实上,别名和CNAME 记录并没有您最初想象的那么多重叠。在某些情况下,只有一个可用,而任何一个都可以使用的情况下,差异可能微不足道。

正如我上面提到的,在可以使用其中任何一个的情况下,别名的一个优点是别名永远不需要 2 个 DNS 查询。 Route 53 始终使用适当的A 记录直接回答它,其中CNAME,至少在它引用不同***域中的主机名的情况下,可能需要两次连续的 DNS 查找,从而为 Alias 提供理论上的这种情况下的性能优势。

【讨论】:

哇-感谢您提供如此详细的答案。我的理解因此提高了很多倍。 优秀。请考虑接受我的回答,除非您希望我澄清任何其他问题。 只是为了增加一点混乱,你可以有'alias cnames'。如果您希望 cdn1.website.com、cdn2.website.com 和 cdn3.website.com 都指向同一个第 3 方域,您可以将 cname 别名为 cdn.website.com,这将是网站的 cname。最佳cdn.com。这里的好处是,而不是 2 个 cname 查找(内容加载延迟几毫秒),只有一个,如果 cdn 发生变化,只有一个记录要更新。如果您要问为什么要对同一个plce使用多个cdn url?这是有时用来增加并发资源下载的技巧。 @KHobbits 同意。如果您使用第三方,CNAME 条目非常重要,例如由于某种原因 lobs.domain.ext 在谷歌云存储上,这些提供商可能更喜欢/要求使用 CNAME。 @mckenzm 是的。这个答案真的集中在 A 记录别名上,这是使用别名记录的典型方式,但是您可以创建一个 AAAACNAME 别名,或者 - 显然 - 一个 any type of record 的别名,而不是NSSOA 如果引用您自己托管区域中的另一条记录。【参考方案2】:

我认为你的信息有误。 Amazon Route53 不允许带有子域的 A 记录。当我尝试将其设置为域名时出现错误:

The record set could not be saved because:
- The Value field contains invalid characters or is in an invalid format.

A 记录仅用于 IP 地址。

【讨论】:

感谢 yegor256 的回复 - 但是您应该尝试以下操作:设置别名:是的,这将启用下面标有“别名目标”的文本框 .. 您可以在其中放置子域 .. 我通常把那里有一个负载均衡器 fqdn。所以我认为我的问题非常有效。 别名仍然是适当的 ACNAME 记录。他们所做的只是将 DNS 解析映射到其他服务。

以上是关于Route53 中的 A Rec 和 CNAME 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 Route53 中创建指向非 aws 主机的 CNAME 吗?

Route 53 是不是指向实例而不是 IP 或 CNAME?

如何使用 Terraform 将现有的“aws_route53_record”CNAME 更新/修改为 ALIAS

使用 Route 53 设置子域亚马逊

使用 AWS Route 53 路由到文件路径

Route53 中的域将根指向外部主机,在 AWS 中保留子域