Amazon CloudFront
开发人员指南 (API 版本 2016-09-29)

通过添加备用域名 (CNAME) 将自定义 URL 用于文件

在 CloudFront 中,通过使用备用域名(也称为 CNAME),您可以使用自己的域名(例如,www.example.com)链接到您的文件,而不是使用 CloudFront 为您的分配指定的域名。Web 分配和 RTMP 分配都支持备用域名。

当您创建分配时,CloudFront 返回分配的域名,例如:

d111111abcdef8.cloudfront.net

在将 CloudFront 域名用于您的文件时,名为 /images/image.jpg 的文件的 URL 是:

http://d111111abcdef8.cloudfront.net/images/image.jpg

如果您想使用自己的域名,如 www.example.com,而非 cloudfront.net 域名,可以在您的分配中添加备用域名,如 www.example.com。然后,您可以使用以下 URL 来查看 /images/image.jpg

http://www.example.com/images/image.jpg

添加备用域名

以下任务列表描述了如何使用 CloudFront 控制台将备用域名添加到分配中,以便您可以在链接中使用自己的域名而非 CloudFront 域名。有关使用 CloudFront API 更新分配的信息,请参阅使用分配

注意

如果您希望查看器使用 HTTPS 和您的备用域名,请参阅 使用备用域名和 HTTPS

开始之前: 确保执行了以下操作,然后再更新分配以添加备用域名:

  • 向 Route 53 或其他域提供商注册该域名。

  • 将来自授权证书颁发机构 (CA) 的证书添加到 CloudFront,该证书涵盖您计划用于分配的域名,以验证您是否获得授权使用该域。有关更多信息,请参阅 使用备用域名的要求

添加备用域名

  1. 登录 AWS 管理控制台,通过以下网址打开 CloudFront 控制台:https://console.aws.amazon.com/cloudfront/

  2. 为要更新的分配选择 ID。

  3. General 选项卡上,选择 Edit

  4. 更新以下值:

    备用域名 (CNAME)

    添加备用域名。用逗号隔开多个域名,或在新行中键入每个域名。

    SSL 证书(仅限 Web 分配)

    选择以下设置:

    • 使用 HTTPS – 选择自定义 SSL 证书,然后从列表中选择证书。该列表可以包含 AWS Certificate Manager (ACM) 预置的证书、您从另一个证书颁发机构购买并上传到 ACM 的证书以及您从另一个证书颁发机构购买并上传到 IAM 证书存储的证书。

      如果您已将证书上传到 IAM 证书存储,但该证书未显示在列表中,请检查过程 导入 SSL/TLS 证书 以确认您已正确上传证书。

      如果选择此设置,则我们建议您只在对象 URL 中使用一个备用域名 (https://example.com/logo.jpg)。如果您使用您的 CloudFront 分配域名 (https://d111111abcdef8.cloudfront.net/logo.jpg),则查看器的工作方式可能如下所示,具体取决于您为支持的客户端选择的值:

      • 所有客户端:如果查看器不支持 SNI,它将显示警告,因为 CloudFront 域名与 TLS/SSL 证书中的域名不匹配。

      • 仅支持服务器名称指示 (SNI) 的客户端:CloudFront 中断与查看器的连接且不返回对象。

    支持的客户端 (仅限 Web 分配)

    选择一个选项:

    • 所有客户端:CloudFront 使用专用 IP 地址提供您的 HTTPS 内容。如果您选择该选项,则当您将 SSL/TLS 证书与已启用的分配关联时,将产生额外的费用。有关更多信息,请参阅 http://aws.amazon.com/cloudfront/pricing

    • 仅限支持服务器名称指示 (SNI) 的客户端:不支持 SNI 的旧版浏览器或其他客户端必须使用其他方法访问您的内容。

    有关更多信息,请参阅 选择 CloudFront 提供 HTTPS 请求的方式

  5. 选择是,编辑

  6. 在分配的 General 选项卡上,确认 Distribution Status 已更改为 Deployed。如果您试图在部署对分配的更新之前使用备用域名,您在以下步骤创建的链接可能无法正常工作。

  7. 配置域的 DNS 服务,以将域(例如 example.com)的流量路由到您的分配(如 d111111abcdef8.cloudfront.net)的 CloudFront 域名。您使用什么方法取决于您是将 Route 53 还是另一个供应商作为域的 DNS 服务提供商。

    注意

    如果您的 DNS 记录已经指向的分配并不是您要更新的分配,则您无法在不更新 DNS 的情况下向分配中添加备用域名。有关更多信息,请参阅 备用域名的使用限制

    Route 53

    创建别名资源记录集。有了别名资源记录集,您就不用付款进行 Route 53 查询了。此外,您可以为根域名 (example.com) 创建别名资源记录集,而 DNS 不允许 CNAME。有关更多信息,请参阅 Amazon Route 53 开发人员指南 中的将查询发送到 Amazon CloudFront 分配

    其他 DNS 服务提供商

    使用 DNS 服务提供商提供的方法,将 CNAME 资源记录集添加到域的托管区。该新 CNAME 资源记录集将来自您的域(例如,www.example.com)的 DNS 查询重定向到您的分配的 CloudFront 域名(例如,d111111abcdef8.cloudfront.net)。有关更多信息,请参阅 DNS 服务提供商提供的文档。

    重要

    如果您的域名已经具有现有的 CNAME 记录,请更新此资源记录集或用指向分配的 CloudFront 域名的新记录集替换它。

    此外,确认您的 CNAME 资源记录集指向分配的域名而不是源服务器之一。

  8. 使用 dig 或类似工具,确认您在第 7 步创建的资源记录集指向分配的域名。有关 dig 的更多信息,请转到 http://www.kloth.net/services/dig.php

    以下示例显示了 images.example.com 域上的 dig 请求以及响应的相关部分。

    [prompt]--> dig images.example.com ; <<> DiG 9.3.3rc2 <<> images.example.com ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15917 ;; flags: qr rd ra; QUERY: 1, ANSWER: 9, AUTHORITY: 2, ADDITIONAL: 0 ;; QUESTION SECTION: ;images.example.com. IN A ;; ANSWER SECTION: images.example.com. 10800 IN CNAME d111111abcdef8.cloudfront.net. ... ...

    回答部分显示了将 images.example.com 查询路由到 CloudFront 分配域名 d111111abcdef8.cloudfront.net 的 CNAME 资源记录集。如果 CNAME 右侧的名称是 CloudFront 分配的域名,则正确配置了 CNAME 资源记录集。如果那是任何其他值,例如,Amazon S3 存储桶的域名,则未正确配置 CNAME 资源记录集。在这种情况下,请回到第 4 步,纠正 CNAME 记录,以指向分配的域名。

  9. 通过创建使用 URL 中您的域名而不是分配的 CloudFront 域名的一些测试链接对备用域名进行测试。

  10. 在您的应用程序中,更改对象的链接,以使用您的备用域名而不是 CloudFront 分配的域名。

将备用域名移动到其他的 CloudFront 分配

如果您要将备用域名从一个 CloudFront 分配移动到另一个分配,您必须执行的步骤取决于您要移动的域名:

将子域名 (如 marketing.example.com) 移动到另一个分配

按照以下步骤移动子域名。

将子域名移动到新分配

  1. 登录 AWS 管理控制台,通过以下网址打开 CloudFront 控制台:https://console.aws.amazon.com/cloudfront/

  2. 如果您没有要将域名移动到的新分配,请创建一个。有关更多信息,请参阅 创建分配

  3. 为该分配添加一个包含备用域名集或 CNAME 记录的通配符的备用域名。例如,如果要移动到新分配的子域名为 marketing.example.com,请添加备用域名 *.example.com。有关更多信息,请参阅 在添加到 CloudFront 的备用域名中使用通配符

    注意

    您无法向顶级域名 (如 *.com) 添加通配符,因此,如果您要将 example.com 之类的域名移动到新分配,请参阅 将域名 (如 example.com) 移动到另一个分配

  4. 将子域的 DNS 配置更新为指向新分配。例如,应更新子域 marketing.example.com 的 DNS 服务以将流量路由到您的分配的 CloudFront 域名 d111111abcdef8.cloudfront.net

    要更新配置,请执行以下操作之一:

    • 如果您使用的是 Route 53,请更新备用域名或 CNAME 记录,具体取决于您最初设置备用域名的方式。有关更多信息,请参阅 Amazon Route 53 开发人员指南 中的编辑记录

    • 如果您使用其他 DNS 服务提供商,请使用 DNS 服务提供商提供的方法更新将流量传送到 CloudFront 的 CNAME 记录。有关更多信息,请参阅 DNS 服务提供商提供的文档。

  5. 使用 dig 或类似工具,确认您在第 4 步创建的资源记录集指向分配的域名。有关 dig 的更多信息,请转到 http://www.kloth.net/services/dig.php

    以下示例显示了 images.example.com 域上的 dig 请求以及响应的相关部分。

    [prompt]--> dig images.example.com ; <<> DiG 9.3.3rc2 <<> images.example.com ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15917 ;; flags: qr rd ra; QUERY: 1, ANSWER: 9, AUTHORITY: 2, ADDITIONAL: 0 ;; QUESTION SECTION: ;images.example.com. IN A ;; ANSWER SECTION: images.example.com. 10800 IN CNAME d111111abcdef8.cloudfront.net. ... ...

    回答部分显示了将 images.example.com 查询路由到 CloudFront 分配域名 d111111abcdef8.cloudfront.net 的 CNAME 资源记录集。如果 CNAME 右侧的名称是 CloudFront 分配的域名,则正确配置了 CNAME 资源记录集。如果那是任何其他值,例如,Amazon S3 存储桶的域名,则未正确配置 CNAME 资源记录集。在这种情况下,请回到第 4 步,纠正 CNAME 记录,以指向分配的域名。

  6. 从现有分配删除 CNAME 并将其移到新的 CloudFront 分配。例如,将 marketing.example.com 移到新的分配 (默认情况下,d111111abcdef8.cloudfront.net 等类似内容指向此新分配)。

  7. 通过创建使用 URL 中您的域名而不是分配的 CloudFront 域名的一些测试链接对备用域名进行测试。

  8. 如果您不再使用原始配置,请删除它。有关更多信息,请参阅删除分配

将域名 (如 example.com) 移动到另一个分配

对于二级域名 (如 example.com),您必须联系 AWS Support 将域名移动到另一个 CloudFront 分配。必须执行额外步骤,因为自行移动域 (如上一过程中所述) 需要设置对域名的一部分使用通配符的域路由。对于第二级域,在本步骤中,您必须将路由设置为 *.com,而这是不允许的。

在开始之前,如果您没有要将域名移动到的新分配,请创建一个。有关更多信息,请参阅创建分配

将域名 (如 example.com) 移动到新分配需要执行两个步骤:

步骤 1:通过在 DNS 服务提供商处为您的域创建 TXT 记录来向 AWS Support 证明您拥有域名。这有助于防止其他人对您的分配配置进行更改。

步骤 2:请求 AWS Support 将您的域移动到新的 CloudFront 分配。

下面是要执行的具体步骤。

步骤 1:为您的域创建 TXT 记录

  1. 日志记录您的 DNS 服务提供商网站。

    如果您的服务提供商是 Route 53,请登录到 Route 53 控制台

  2. 为您的域创建一条类似于下面的 TXT 记录:

    <域名> TXT <CloudFront 分配名称>

    例如:example.com TXT d123.cloudfront.net

    • 如果您的 DNS 服务提供商是 Route 53,请转到步骤 3 以了解详细步骤。

    • 如果您的域由其他 DNS 服务提供商托管,请参阅 DNS 服务提供商处的文档。您可能需要请求您的服务提供商为您创建 TXT 记录。

      提示

      如果您的服务提供商不允许为与 CNAME 记录具有相同的信息的域指定 TXT 名称,则可以考虑创建一个使用您的域名 (前面添加了下划线 (_)) 的 TXT 记录。有关示例,请参阅以下知识中心文章:解决“CNAME 已存在”错误

  3. 如果您的 DNS 服务提供程序是 Route 53,请使用以下步骤创建 TXT 记录来证明域所有权:

    1. 托管区域页面上,双击您要在其中编辑记录的托管区域对应的行。

    2. 选择 Create Record Set

    3. 输入以下值:

      • 名称:您要移动到新 CloudFront 分配的域名。

      • 类型:TXT

      • 别名:否

      • TTL:60 秒

      • :您要将该域添加到的 CloudFront 分配的名称(如 d123.cloudfront.net)。

      • 路由策略:简单

    4. 选择 Create

步骤 2:请求 AWS Support 将您的域移动到新的 CloudFront 分配

  • 登录到 AWS 并联系 AWS Support 以请求他们验证您是否拥有该域,然后将该域移动到新 CloudFront 分配。

    注意

    AWS Support 无法验证您的域所有权,除非他们可以查看您为自己的域创建的 TXT 记录。请注意,您在 DNS 提供商处创建的记录可能需要一些时间 (最多几天) 才能传播到整个 DNS 系统。

删除备用域名

如果要停止将域或子域的流量路由到 CloudFront 分配,请按照本节中的步骤更新 DNS 配置和 CloudFront 分配。

请务必从该分配中删除备用域名并更新您的 DNS 配置。当您希望将域名与其他 CloudFront 分配关联时,这有助于防止以后出现问题。如果某个备用域名已经与一个分配关联,则不能将该域名设置为与其他分配关联。

注意

如果您要从该分配中删除备用域名以便能将它添加到其他分配,请按照 将备用域名移动到其他的 CloudFront 分配中的步骤操作。如果您改为执行此处的步骤 (用于删除域),然后将域添加到另一个分配,则在一段时间内,域不会链接到新分配,因为 CloudFront 会传播到对边缘站点的更新。

从分配中删除备用域名

  1. 要开始操作,请将您的域的 Internet 流量路由到不是您的 CloudFront 分配的其他资源 (如 Elastic Load Balancing 负载均衡器)。或者,您也可以删除将流量路由到 CloudFront 的 DNS 记录。

    根据您的域的 DNS 服务执行以下操作之一:

    • 如果您使用的是 Route 53,请更新或删除备用域名或 CNAME 记录。有关更多信息,请参阅编辑记录删除记录

    • 如果您使用其他 DNS 服务提供商,请使用 DNS 服务提供商提供的方法更新或删除将流量传送到 CloudFront 的 CNAME 记录。有关更多信息,请参阅 DNS 服务提供商提供的文档。

  2. 在更新您的域的 DNS 记录后,请等到更改已传播且 DNS 解析程序正在将流量路由到新资源。您可以通过创建一些在 URL 中使用您的域的测试链接来检查确认该操作完成的时间。

  3. 现在,登录到 AWS 管理控制台并打开 CloudFront 控制台 (https://console.aws.amazon.com/cloudfront/),然后更新您的 CloudFront 分配以通过执行以下操作来删除域名:

    1. 为要更新的分配选择 ID。

    2. General 选项卡上,选择 Edit

    3. Alternate Domain Names (CNAMEs) (备用域名 (CNAME)) 中,删除您不想再用于分配的备用域名 (或域名)。

    4. 选择是,编辑

在添加到 CloudFront 的备用域名中使用通配符

在添加备用域名时,可以在域名开头使用 * 通配符,而不是逐个添加子域。例如,备用域名为 *.example.com,您就可以在您的对象 URL 中使用以 example.com 结尾的任何域名,例如 www.example.comproduct-name.example.commarketing.product-name.example.com。无论域名如何,对象的名称相同,例如:

www.example.com/images/image.jpg

product-name.example.com/images/image.jpg

marketing.product-name.example.com/images/image.jpg

对于包含通配符的备用域名,请遵循以下要求:

  • 备用域名必须以星号和点 ( *. ) 开头。

  • 不能 使用通配符来替换子域名的一部分,如下所示: *domain.example.com

  • 您不能替换某个域名中间的子域名,如下所示:subdomain.*.example.com

  • 所有备用域名,包括使用通配符的备用域名,必须涵盖在证书的使用者备用名称 (SAN) 中。

通配符备用域名(如 *.example.com)可以包含另一个备用域名(如 example.com),只要它们位于同一个 CloudFront 分配中,或者位于使用同一 AWS 账户创建的分配中。

使用备用域名的要求

添加备用域名来用于 CloudFront 时,应满足以下要求:

备用域名必须小写

所有备用域名 (CNAME) 都必须小写才有效。

备用域名必须为有效的 SSL/TLS 证书所涵盖

要添加备用域名 (CNAME) 以用于 CloudFront 分配,必须给您的分配附加一个可信且有效的 SSL/TLS 证书,其中涵盖了备用域名。这样可以确保只有有权访问您的域证书的人员才能关联CloudFront与您的域相关的 CNAME。

可信证书 ACM 是指由其他有效的证书颁发机构 (CA) 颁发的证书;不能使用自签名证书。CloudFront 支持与 Mozilla 相同的证书颁发机构。有关当前列表,请参阅 Mozilla 包含的 CA 证书列表

为了使用附加的证书来验证备用域名(包括含通配符的域名),CloudFront 会检查证书上的使用者备用名称 (SAN)。要添加的备用域名必须为 SAN 所涵盖。

注意

一次只能将一个证书附加到 CloudFront 分配。

您可以通过执行以下操作之一来证明您有权向分配中添加特定的备用域名:

  • 为每个域名附加一个单独的证书,例如 product-name.example.com

  • 附加一个证书,其中包括一个 * 通配符在域名的开头,以用一个证书涵盖多个子域。当指定通配符时,可以在 CloudFront 中添加多个子域作为备用域名。

以下示例说明了如何在证书的域名中使用通配符来授权您在 CloudFront 中添加特定的备用域名。

  • 您要添加 marketing.example.com 作为备用域名。您在证书中列示以下域名:*.example.com。当您将此证书附加到 CloudFront 时,可以为您的分配添加任何备用域名,以替换该层次上的通配符,包括 marketing.example.com。例如,您还可以添加以下备用域名:

    • product.example.com

    • api.example.com

    但是,不能添加所在层次高于或低于通配符的备用域名。例如,不能添加备用域名 example.commarketing.product.example.com

  • 您要添加 example.com 作为备用域名。要执行此操作,必须在附加到分配的证书上列出域名 example.com 本身。

  • 您要添加 marketing.product.example.com 作为备用域名。要执行此操作,可以在证书上列出 *.product.example.com,或列出 marketing.product.example.com 本身。

更改 DNS 配置所需的权限

在添加备用域名时,必须创建 CNAME 记录,以将域名的 DNS 查询路由到您的 CloudFront 分配。要执行此操作,您必须具有创建 CNAME 记录的权限,并为您使用的备用域名指定 DNS 服务提供商。通常,这意味着您拥有这些域,但您可能在为域所有者开发应用程序。

备用域名和 HTTPS

如果您希望查看器使用 HTTPS 和备用域名,还必须进行其他配置。有关更多信息,请参阅 使用备用域名和 HTTPS

备用域名的使用限制

请注意备用域名的以下使用限制:

备用域名的最大数量

有关您可以添加到分配中的备用域名的当前数量限制,或者要请求放宽限制,请参阅有关 Web 分配的一般限制

重复和重合备用域名

如果备用域名在一个 CloudFront 分配中已存在,则无法将其添加到另一个 CloudFront 分配中,即使您的 AWS 账户拥有其他分配。

不过,您可以添加通配符备用域名(例如 *.example.com),该域名包含(重合)非通配符备用域名,例如 www.example.com。同一分配中可以有重合备用域名,不同分配中也可以有重合分配域名,只要两个分配都是用同一 AWS 账户创建的。

如果在两个分配中有重合的备用域名,则 CloudFront 将发送请求到具有更具体名称匹配的那个分配,而不管 DNS 记录指向哪个分配。例如,marketing.domain.com*.domain.com 更具体。

已经指向分配的备用域名

如果您的 DNS 记录已经指向的分配并不是您正在创建或修改的分配,则您无法向您的分配添加备用域名。在这种情况下,您必须在您的 DNS 提供商处更新您的 DNS,然后才能为您的 CloudFront 分配添加域名。

要更正此问题,请登录到您的 DNS 提供商并删除现有的 DNS 记录,或联系您的 DNS 提供商将其删除。然后,按照为您的分配添加或更改备用域名的步骤,为您的分配创建正确的 DNS 记录。有关更多信息,请参阅 添加备用域名 将备用域名移动到其他的 CloudFront 分配

域前置

CloudFront 中包含防止域前置攻击跨不同 AWS 账户发生的措施,在此攻击中,非标准客户端创建一个 TLS/SSL 连接,连接到一个 AWS 账户中的一个域名,但随后,又发出 HTTPS 请求,请求另一个 AWS 账户中的不相关名称。例如,TLS 连接可能连接到 www.example.com,然后发出对 www.example.org 的请求。

为防范跨不同 AWS 账户的域前置攻击,CloudFront 确保拥有为特定连接提供证书的 AWS 账户始终与拥有在同一连接上被处理的请求的 AWS 账户匹配。

如果两个 AWS 账号不匹配,CloudFront 将做出“421 错误的请求”响应,让客户端有机会使用正确的域连接。

在域的顶部节点(区域顶点)添加备用域名

当您将备用域名添加到分配时,您通常在 DNS 配置中创建 CNAME 记录,以将域名的 DNS 查询路由到 CloudFront 分配。不过,您无法为 DNS 命名空间的顶端节点 (也称为主域顶点) 创建 CNAME 记录;DNS 协议不允许您这样做。例如,如果您注册了 DNS 名称 example.com,则区域顶点为 example.com。您不能为 example.com 创建 CNAME 记录,但是您可为 www.example.comnewproduct.example.com 等创建 CNAME 记录。

如果您使用 Route 53 作为您的 DNS 服务,则可以创建别名资源记录集,与 CNAME 记录相比,该记录集具备 2 个优势。您可以在顶部节点 (example.com) 为域名创建别名资源记录集。此外,当您使用别名资源记录集时,您就不用付款进行 Route 53 查询了。

注意

如果您启用 IPv6,您必须创建两个别名资源记录集:一个用于路由 IPv4 流量 (A 记录),一个用于路由 IPv6 流量 (AAAA 记录)。有关更多信息,请参阅 您创建或更新分配时指定的值 主题中的 启用 IPv6

有关更多信息,请参阅 Amazon Route 53 开发人员指南 中的将查询发送到 Amazon CloudFront 分配