在 CloudFront 分配中使用各种源 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

在 CloudFront 分配中使用各种源

当您创建分配时,可指定 CloudFront 在其中发送对于文件的请求的。您可以在 CloudFront 中使用多种不同的源。例如,您可以使用 Amazon S3 存储桶、MediaStore 容器、MediaPackage 通道、Application Load Balancer 或 Amazon Lambda 函数 URL。

使用 Amazon S3 存储桶

以下主题介绍您可以使用 Amazon S3 存储桶作为 CloudFront 分配的源的不同方法。

使用标准 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 的费用的更多信息,请参阅 Amazon CloudFront 定价。有关将 CloudFront 与现有 S3 存储桶结合使用的更多信息,请参阅将 CloudFront 添加到现有 Amazon S3 存储桶

重要

要使存储桶能够用于 CloudFront,其名称必须符合 DNS 命名要求。有关更多信息,请转至《Amazon Simple Storage Service 用户指南》中的存储桶命名规则

在指定 Amazon S3 存储桶作为 CloudFront 的源时,我们建议您使用以下格式:

bucket-name.s3.region.amazonaws.com

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

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

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

  • Amazon S3 别名记录

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

您可以使用配置为网站终端节点的 Amazon S3 存储桶作为 CloudFront 的自定义源。当您配置 CloudFront 分配时,对于源,请输入您的存储桶的 Amazon S3 静态网站托管终端节点。此值显示在 Amazon S3 控制台Properties(属性)选项卡上的 Static website hosting(静态网站托管)窗格中。例如:

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

有关指定 Amazon S3 静态网站端点的更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的网站端点

当您以此格式将存储桶名称指定为您的源时,可使用 Amazon S3 重定向和 Amazon S3 自定义错误文档。有关更多信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的配置自定义错误文档配置重新导向。(CloudFront 也提供自定义错误页面。有关更多信息,请参阅为特定 HTTP 状态代码创建自定义错误页面。)

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

注意

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

将 CloudFront 添加到现有 Amazon S3 存储桶

如果您将对象存储在 Amazon S3 存储桶中,您可以让用户直接从 S3 中获取这些对象,也可以将 CloudFront 配置为从 S3 中获取这些对象并将其分发到用户。如果您的用户频繁访问您的对象(因为在使用量较大的情况下,CloudFront 数据传输价格低于 Amazon S3 数据传输价格),则使用 CloudFront 可能会更经济高效。此外,使用 CloudFront 时下载速度也比仅使用 Amazon S3 时更快,因为您的对象存储在离您用户更近的位置。

注意

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

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

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

  1. 创建 CloudFront 分配。有关更多信息,请参阅创建分配的步骤(概述)

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

    重要

    要使存储桶能够用于 CloudFront,其名称必须符合 DNS 命名要求。有关更多信息,请转至《Amazon Simple Storage Service 用户指南》中的存储桶命名规则

    如果您对 Amazon S3 使用别名记录 (CNAME),请也为您的分配指定 CNAME。

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

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

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

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

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

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

    https://DOC-EXAMPLE-BUCKET.s3.amazonaws.com/images/image.jpg

    要将查询按指定路线发送到您的 CloudFront 分配而不是您的 Amazon S3 存储桶,您需要使用 DNS 服务提供商提供的方法来为您的域更新别名记录 (CNAME) 资源记录集。此更新后的别名记录会将 DNS 查询从您的域重新导向到分配的 CloudFront 域名。有关更多信息,请参阅 DNS 服务提供商提供的文档。

    注意

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

    有关对 CloudFront 使用别名记录 (CNAME) 的更多信息,请参阅通过添加备用域名 (CNAME) 使用自定义 URL

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

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

如果您使用 Amazon S3 作为 CloudFront 分配的源,并且您将存储桶移至其他 Amazon Web Services 区域,则在满足下面两个条件的情况下,CloudFront 可能要花费多达 1 个小时的时间来更新其记录以使用新的区域:

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

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

在使用 OAI 时,CloudFront 使用区域(以及其他值)来计算用于从存储桶中请求对象的签名。有关 OAI 的更多信息,请参阅使用源访问身份(旧版,不推荐)。有关支持签名版本 2 的 Amazon Web Services 区域的列表,请参阅《Amazon Web Services 一般参考》中的签名版本 2 签名流程

要强制更快地更新 CloudFront 的记录,您可以通过更新 CloudFront 控制台中 General(常规)选项卡上的 Description(说明)字段来更新您的 CloudFront 分配。在更新分配时,CloudFront 会立即检查您的存储桶所在的区域。将更改传播到所有边缘站点应该只需几分钟时间。

使用 MediaStore 容器或 MediaPackage 通道

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

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

使用 Application Load Balancer

如果您的源是托管在一个或多个 Amazon EC2 实例上的一个或多个 HTTP 服务器(Web 服务器),则可以使用 Application Load Balancer 向实例分配流量。有关使用 Application Load Balancer 作为 CloudFront 的源的更多信息,包括如何确保查看器只能通过 CloudFront 而不是直接访问负载均衡器来访问您的 Web 服务器,请参阅限制访问 Application Load Balancer

使用 Lambda 函数 URL

Lambda 函数 URL 是 Amazon Lambda 函数的专用 HTTPS 终端节点。您可以使用 Lambda 函数 URL 完全在 Amazon Lambda 中构建无服务器 Web 应用程序。您可以直接通过函数 URL 调用 Lambda Web 应用程序,而无需与 API Gateway 或 Application Load Balancer 集成。

如果您使用带有函数 URL 的 Lambda 函数构建无服务器 Web 应用程序,则可以添加 CloudFront 以获得以下好处:

  • 通过将内容缓存在更靠近查看器的位置来加速应用程序

  • 对您的 Web 应用程序使用自定义域

  • 使用 CloudFront 缓存行为将不同的 URL 路径路由到不同的 Lambda 函数

  • 使用 CloudFront 地理限制或 Amazon WAF(或两者)阻止特定请求

  • 将 Amazon WAF 与 CloudFront 结合使用,以帮助保护您的应用程序免受恶意自动程序侵害,帮助防止常见的应用程序漏洞,并增强对 DDoS 攻击的防范

要使用 Lambda 函数 URL 作为 CloudFront 分配的源,请将 Lambda 函数 URL 的完整域名指定为源域。Lambda 函数 URL 域名使用以下格式:

function-URL-ID.lambda-url.AWS-Region.on.aws

当您使用 Lambda 函数 URL 作为 CloudFront 分配的源时,必须确保函数 URL 可供公开访问。为此,您需要将函数 URL 的 AuthType 参数设置为 NONE,并在基于资源的策略中允许 lambda:InvokeFunctionUrl 权限。有关更多信息,请参阅《Amazon Lambda 开发人员指南》中的使用 NONE AuthType。但是,您也可以在 CloudFront 发送到源的请求中添加自定义源标头。如果请求中不存在此标头,则编写函数代码以返回错误响应。这有助于确保用户只能通过 CloudFront(而无法直接使用 Lambda 函数 URL)来访问您的 Web 应用程序。

有关 Lambda 函数 URL 的更多信息,请参阅《Amazon Lambda 开发人员指南》中的以下主题:

使用 Amazon EC2(或其他自定义源)

自定义源是 HTTP 服务器,例如,Web 服务器。HTTP 服务器可以是 Amazon EC2 实例或您在其他地方托管的 HTTP 服务器。配置为网站终端节点的 Amazon S3 源也被视为自定义源。

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

当您使用自定义源时,大部分 CloudFront 功能都受支持,但私有内容除外。虽然您可以使用签名 URL 从自定义源分配内容,但要让 CloudFront 访问自定义源,该源必须保持可公共访问。有关更多信息,请参阅使用签名 URL 和签名 Cookie 提供私有内容

请遵照将 Amazon EC2 实例和其他自定义源与 CloudFront 结合使用的准则。

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

  • 如果需要 Amazon Web Services Support 或 CloudFront 使用此值进行调试,请在所有服务器上记录 X-Amz-Cf-Id 标头条目。

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

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

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

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

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

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

  • 使用 Amazon Machine Image 为 Web 服务器自动安装软件。有关的更多信息,请参阅 Amazon EC2 文档

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

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

使用 CloudFront 源组

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

有关更多信息,包括设置源组的步骤,请参阅通过 CloudFront 源故障转移优化高可用性