Amazon CloudFront
开发人员指南 (API 版本 2016-09-29)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

将 Amazon S3 源、MediaPackage 通道和自定义源用于 Web 分配

在创建分配时,您可以指定 CloudFront 发送文件请求的位置。CloudFront 支持将几个 AWS 资源作为源。例如,您可以指定 Amazon S3 存储桶或 MediaStore 容器、MediaPackage 通道或自定义源(如 Amazon EC2 实例或您自己的 HTTP Web 服务器)。

为源使用 Amazon S3 存储桶

在将 Amazon S3 作为分配的源时,您可以将希望 CloudFront 传送的任何对象放入 Amazon S3 存储桶中。您可以使用 Amazon S3 支持的任何方法将对象放入 Amazon S3 中,例如 Amazon S3 控制台、API 或第三方工具。您可在存储桶中创建一个层次结构来存储对象,就如您使用任何其他 Amazon S3 存储桶一样。

将现有 Amazon S3 存储桶作为 CloudFront 源服务器不会以任何方式改变该存储桶;您仍然可以像往常一样使用存储桶存储和访问 Amazon S3 对象(按标准 Amazon S3 价格)。在存储桶中存储对象会产生常规的 Amazon S3 费用。有关使用 CloudFront 的费用的更多信息,请参阅控制台中的 CloudFront 报告

重要

对于与 CloudFront 一起使用的存储桶,其名称必须符合 DNS 命名要求。有关更多信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的存储桶限制

在指定您希望 CloudFront 从中获取对象的 Amazon S3 存储桶时,我们建议您使用以下格式访问该存储桶:

bucket-name.s3.region.amazonaws.com

另一种选择可能是使用以下更通用的格式,但请注意,此格式不适用于 2019 年或之后启动的区域:

bucket-name.s3.amazonaws.com

当您以该格式指定存储桶名称时,可以使用以下 CloudFront 功能:

切勿使用以下格式指定存储桶:

  • Amazon S3 路径样式,s3.amazonaws.com/bucket-name

  • Amazon S3 CNAME,如有

使用配置为源的网站终端节点的 Amazon S3 存储桶

您可以设置一个配置为网站终端节点 Amazon S3 存储桶,以作为 CloudFront 的自定义源。

  • 在配置 CloudFront 分配时,请为源输入存储桶的 Amazon S3 静态网站托管终端节点。该值显示在 Amazon S3 控制台的属性页面上的静态网站托管下面。例如:

    https://bucket-name.s3-website.region.amazonaws.com

有关指定 Amazon S3 静态网站终端节点的更多信息,请参阅 Amazon S3 文档中的网站终端节点

在使用该格式将存储桶名称指定为源时,您可以使用 Amazon S3 重定向和 Amazon S3 自定义错误文档。有关 Amazon S3 功能的更多信息,请参阅 Amazon S3 文档。(CloudFront 还提供了自定义错误页面。有关更多信息,请参阅 为特定 HTTP 状态代码创建自定义错误页面。)

将 Amazon S3 存储桶作为 CloudFront 源服务器不会以任何方式改变该存储桶。您仍可像往常一样使用它,并且会产生定期 Amazon S3 费用。有关使用 CloudFront 的费用的更多信息,请参阅控制台中的 CloudFront 报告

注意

如果您使用 CloudFront API 创建包含配置为网站终端节点的 Amazon S3 存储桶的分配,您必须使用 CustomOriginConfig 配置该分配,即使该网站是在 Amazon S3 存储桶中托管的。有关使用 CloudFront API 创建分配的更多信息,请参阅 Amazon CloudFront API Reference 中的 CreateDistribution

对源使用 MediaStore 容器或 MediaPackage 通道

要使用 CloudFront 流式传输视频,您可以设置配置为 MediaStore 容器的 Amazon S3 存储桶,或使用 MediaPackage 创建通道和终端节点。然后,在 CloudFront 中创建并配置分配以流式传输视频。

有关更多信息和分步说明,请参阅以下主题:

使用 Amazon EC2 或其他自定义源

自定义源是 HTTP 服务器,例如,Web 服务器。HTTP 服务器可以是 Amazon Elastic Compute Cloud (Amazon EC2) 实例或您私下管理的 HTTP 服务器。配置为网站终端节点的 Amazon S3 源也被视为自定义源。

当您使用作为您自己的 HTTP 服务器的自定义源时,您可指定服务器的 DNS 名称、HTTP 和 HTTPS 端口以及您在从源中获取对象时希望 CloudFront 使用的协议。

当您使用自定义源时,大部分 CloudFront 功能受到支持,但下列情况除外:

请遵循将 Amazon EC2 实例和其他自定义源与 CloudFront 一起使用的准则。

  • 在为同一 CloudFront 源提供内容的所有服务器上托管和提供相同的内容。有关更多信息,请参阅源设置主题中的 您创建或更新分配时指定的值

  • 在所有服务器上记录 X-Amz-Cf-Id 标头条目;CloudFront 需要使用该信息以进行调试。

  • 限制对自定义源所侦听的 HTTP 和 HTTPS 端口的访问请求。

  • 在您实现的过程中,使所有服务器的时钟同步。请注意,CloudFront 对签名 URL 和签名 Cookie、访问日志和报告使用协调世界时 (UTC)。此外,如果您使用 CloudWatch 指标监控 CloudFront 活动,请注意 CloudWatch 也使用 UTC。

  • 使用冗余服务器来处理故障。

  • 有关使用自定义源来提供私有内容的信息,请参阅 在自定义源上限制对文件的访问

  • 有关请求和响应行为以及支持的 HTTP 状态代码的信息,请参阅 请求和响应行为

如果将 Amazon EC2 作为自定义源,我们建议您执行以下操作:

  1. 使用 Amazon 系统映像为 Web 服务器自动安装软件。有关更多信息,请参阅 Amazon EC2 文档

  2. 使用 Elastic Load Balancing 负载均衡器处理通过多个 Amazon EC2 实例的流量,并将您的应用程序与 Amazon EC2 实例更改隔离。例如,如果您使用负载均衡器,则您可添加和删除 Amazon EC2 实例,而无需更改您的应用程序。有关更多信息,请参阅 Elastic Load Balancing 文档

  3. 当您创建 CloudFront 分配时,请为源服务器的域名指定负载均衡器的 URL。有关更多信息,请参阅创建分配

使用 CloudFront 源组

您可以为您的 CloudFront 源指定源组,例如,在您希望为需要高可用性的场景配置源故障转移的情况下。使用源故障转移为 CloudFront 指定主源以及 CloudFront 将在主源返回特定 HTTP 状态代码故障响应时自动切换到的次要源。

要查看设置源组的步骤并了解更多信息,请参阅使用 CloudFront 源故障转移优化高可用性

分配 Amazon S3 中的内容时添加 CloudFront

如果您将对象存储在 Amazon S3 存储桶中,您可以让用户直接从 S3 中获取这些对象,也可以将 CloudFront 配置为从 S3 中获取这些对象并将其分发到用户。

注意

要了解将 Amazon S3 存储桶作为 CloudFront 源(包括在将 Amazon S3 存储桶配置为网站终端节点时)的更多信息,请参阅将 Amazon S3 源、MediaPackage 通道和自定义源用于 Web 分配

如果您的用户频繁访问您的对象(因为在使用量较大的情况下,CloudFront 数据传输价格低于 Amazon S3 数据传输价格),使用 CloudFront 可能会更经济高效。此外,使用 CloudFront 时的下载速度也比仅使用 Amazon S3 时更快,因为您的对象存储在离您用户更近的位置。

注意

如果您希望 CloudFront 使用 Amazon S3 跨源资源共享设置,请配置 CloudFront 以将 Origin 标头转发到 Amazon S3。有关更多信息,请参阅根据请求标头缓存内容

如果您当前使用自己的域名(如 example.com)直接从您的 Amazon S3 存储桶中分发内容,而不是使用 Amazon S3 存储桶的域名(如 MyAWSBucket.s3.us-west-2.amazonaws.com),您可以按照以下过程添加 CloudFront 而不会造成中断。

在已从 Amazon S3 中分发内容时添加 CloudFront

  1. 使用以下过程之一创建 CloudFront 分配:

    当您创建分配时,请指定您的 Amazon S3 存储桶名称作为源服务器。

    重要

    对于与 CloudFront 一起使用的存储桶,其名称必须符合 DNS 命名要求。有关更多信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的存储桶限制

    如果您使用 CNAME 和 Amazon S3,请也为您的分配指定 CNAME。

  2. 创建一个测试网页并在该网页中包含您的 Amazon S3 存储桶中公开可读对象的链接,然后测试这些链接。对于该初始测试,请在对象 URL 中使用该分配的 CloudFront 域名,例如 http://d111111abcdef8.cloudfront.net/images/image.jpg

    有关 CloudFront URL 格式的更多信息,请参阅在 CloudFront 中自定义文件的 URL 格式

  3. 如果您使用 Amazon S3 CNAME,则您的应用程序使用您的域名(例如,example.com)引用 Amazon S3 存储桶中的对象,而不是使用存储桶名称(例如,.s3.amazonaws.com)。要继续使用您的域名引用对象,而不是使用分配的 CloudFront 域名(例如,d111111abcdef8.cloudfront.net),您需要更新您的 DNS 服务提供商设置。

    要使 Amazon S3 CNAME 正常工作,您的 DNS 服务提供商必须具有您的域的 CNAME 资源记录集,您的域当前将查询路由到您的 Amazon S3 存储桶。例如,如果用户请求该对象:

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

    该请求将自动重新路由,用户将看到该对象:

    http://.s3.amazonaws.com/images/image.jpg

    要将查询路由到您的 CloudFront 分配而不是 Amazon S3 存储桶,您需要使用 DNS 服务提供商提供的方法更新您的域的 CNAME 资源记录集。此更新后的 CNAME 记录将从您的域开始重定向 DNS 查询到分配的 CloudFront 域名。有关更多信息,请参阅 DNS 服务提供商提供的文档。

    注意

    如果您使用 Route 53 作为您的 DNS 服务,则可使用 CNAME 资源记录集或别名资源记录集。有关编辑资源记录集的信息,请参阅编辑资源记录集。有关别名资源记录集的信息,请参阅在别名资源记录集和非别名资源记录集之间进行选择。这两个主题均位于 Amazon Route 53 开发人员指南 中。

    有关将 CNAME 与 CloudFront 一起使用的更多信息,请参阅通过添加备用域名 (CNAME) 将自定义 URL 用于文件

    在您更新 CNAME 资源记录集后,将更改传播到整个 DNS 系统可能需要长达 72 个小时的时间,虽然通常传播的速度较快。在此期间,针对您的内容的一些请求将继续路由到您的 Amazon S3 存储桶,而其他请求路由到 CloudFront。

将 Amazon S3 存储桶移至其他区域

如果您将 Amazon S3 作为 CloudFront 分配的源,并且您将存储桶移到其他区域,在满足下面的两个条件的情况下,CloudFront 需要花费最多 1 个小时以更新其记录以包含区域更改:

  • 您使用 CloudFront 源访问身份 (OAI) 限制对存储桶的访问

  • 您将存储桶移至需要签名版 4 以进行验证的 Amazon S3 区域

在使用 OAI 时,CloudFront 使用区域 (以及其他值) 来计算用于从存储桶中请求对象的签名。有关 OAI 的更多信息,请参阅使用源访问身份限制对 Amazon S3 内容的访问。有关 Amazon S3 区域及其支持的签名版本的列表,请参阅 Amazon Web Services 一般参考 的“区域和终端节点”一章中的 Amazon Simple Storage Service (Amazon S3)

要强制更快地更新 CloudFront 的记录,您可以更新 CloudFront 控制台中的常规选项卡上的注释字段以更新您的 CloudFront 分配。在更新分配时,CloudFront 会立即检查您的存储桶所在的区域;将更改传播到所有边缘站点用时不超过 15 分钟。