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

在 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 CNAME

使用 Amazon S3 对象 Lambda

当您创建对象 Lambda 接入点时,Amazon S3 会自动为您的对象 Lambda 接入点生成一个唯一的别名。您可以使用此别名代替 Amazon S3 存储桶名称作为您 CloudFront 分配的源。

当您使用对象 Lambda 接入点别名作为 CloudFront 的源时,建议您使用以下格式:

alias.s3.region.amazonaws.com

有关查找 alias 的详细信息,请参阅《Amazon S3 用户指南》中的如何为您的 S3 存储桶对象 Lambda 接入点使用存储桶式别名

重要

当您使用对象 Lambda 接入点作为 CloudFront 的源时,必须使用源访问控制

有关示例使用案例,请参阅将 Amazon S3 对象 Lambda 与 Amazon CloudFront 配合使用,以为最终用户量身定制内容

CloudFront 将对象 Lambda 接入点源视为标准 Amazon S3 存储桶源

如果使用 Amazon S3 对象 Lambda 作为您分配的源,则必须配置以下四种权限。

Object Lambda Access Point
为对象 Lambda 接入点添加权限
  1. 登录到Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在导航窗格中,选择对象 Lambda 接入点

  3. 请选择要使用的对象 Lambda 接入点。

  4. 选择权限选项卡。

  5. 对象 Lambda 接入点策略部分中选择编辑

  6. 将以下策略粘贴到策略字段中。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3-object-lambda:Get*", "Resource": "arn:aws:s3-object-lambda:region:Amazon-account-ID:accesspoint/Object-Lambda-Access-Point-name", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:cloudfront::Amazon-account-ID:distribution/CloudFront-distribution-ID" } } } ] }
  7. 选择 Save changes(保存更改)

Amazon S3 Access Point
为 Amazon S3 接入点添加权限
  1. 登录到Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在导航窗格中,选择接入点

  3. 请选择要使用的 Amazon S3 接入点。

  4. 选择权限选项卡。

  5. 接入点策略部分中选择编辑

  6. 将以下策略粘贴到策略字段中。

    { "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "s3objlambda", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:region:Amazon-account-ID:accesspoint/Access-Point-name", "arn:aws:s3:region:Amazon-account-ID:accesspoint/Access-Point-name/object/*" ], "Condition": { "ForAnyValue:StringEquals": { "aws:CalledVia": "s3-object-lambda.amazonaws.com" } } } ] }
  7. 选择保存

Amazon S3 bucket
添加权限至 Amazon S3 存储桶
  1. 登录到Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在导航窗格中,选择

  3. 请选择要使用的 Amazon S3 存储桶。

  4. 选择权限选项卡。

  5. 存储桶策略部分,选择编辑

  6. 将以下策略粘贴到策略字段中。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "*", "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ], "Condition": { "StringEquals": { "s3:DataAccessPointAccount": "Amazon-account-ID" } } } ] }
  7. 选择 Save changes(保存更改)

Amazon Lambda function
向 Lambda 函数添加权限
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon Lambda 控制台:https://console.aws.amazon.com/lambda/

  2. 在导航窗格中,选择函数

  3. 选择要使用的 Amazon Lambda 函数。

  4. 选择配置选项卡,然后选择权限

  5. 基于资源的策略声明部分中选择添加权限

  6. 选择Amazon Web Services 账户

  7. 输入声明 ID 的名称。

  8. 对于委托人,请输入 cloudfront.amazonaws.com

  9. 操作下拉菜单中选择 lambda:InvokeFunction

  10. 选择保存

使用 Amazon S3 接入点

当您使用 S3 接入点时,Amazon S3 会自动为您生成一个唯一的别名。您可以使用此别名代替 Amazon S3 存储桶名称作为您 CloudFront 分配的源。

当您使用 Amazon S3 接入点别名作为 CloudFront 的源时,建议您使用以下格式:

alias.s3.region.amazonaws.com

有关如何查找 alias 的详细信息,请参阅《Amazon S3 用户指南》中的对您的 S3 存储桶接入点使用存储桶式别名

重要

当您使用 Amazon S3 接入点作为 CloudFront 的源时,必须使用源访问控制

CloudFront 将 Amazon S3 接入点源视为与标准 Amazon S3 存储桶源相同。

如果使用 Amazon S3 对象 Lambda 作为您分配的源,则必须配置以下两种权限。

Amazon S3 Access Point
为 Amazon S3 接入点添加权限
  1. 登录到Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在导航窗格中,选择接入点

  3. 请选择要使用的 Amazon S3 接入点。

  4. 选择权限选项卡。

  5. 接入点策略部分中选择编辑

  6. 将以下策略粘贴到策略字段中。

    { "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "s3objlambda", "Effect": "Allow", "Principal": {"Service": "cloudfront.amazonaws.com"}, "Action": "s3:*", "Resource": [ "arn:aws:s3:region:Amazon-account-ID:accesspoint/Access-Point-name", "arn:aws:s3:region:Amazon-account-ID:accesspoint/Access-Point-name/object/*" ], "Condition": { "StringEquals": {"aws:SourceArn": "arn:aws:cloudfront::Amazon-account-ID:distribution/CloudFront-distribution-ID"} } } ] }
  7. 选择保存

Amazon S3 bucket
添加权限至 Amazon S3 存储桶
  1. 登录到Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在导航窗格中,选择

  3. 请选择要使用的 Amazon S3 存储桶。

  4. 选择权限选项卡。

  5. 存储桶策略部分,选择编辑

  6. 将以下策略粘贴到策略字段中。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "*", "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ], "Condition": { "StringEquals": { "s3:DataAccessPointAccount": "Amazon-account-ID" } } } ] }
  7. 选择 Save changes(保存更改)

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

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

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 存储桶的域名(如 amzn-s3-demo-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 存储桶中的对象,而不是使用存储桶的名称(例如,amzn-s3-demo-bucket.s3.amazonaws.com)。要继续使用您的域名来引用对象,而不是使用分配的 CloudFront 域名(例如,d111111abcdef8.cloudfront.net),您需要通过您的 DNS 服务提供商更新您的设置。

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

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

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

    https://amzn-s3-demo-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 控制台中常规选项卡上的说明字段来更新您的 CloudFront 分配。在更新分配时,CloudFront 会立即检查您的存储桶所在的区域。将更改传播到所有边缘站点应该只需几分钟时间。

使用 MediaStore 容器或 MediaPackage 通道

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

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

使用应用程序负载均衡器

如果您的源是托管在一个或多个 Amazon EC2 实例上的一个或多个 HTTP(S) 服务器(Web 服务器),则可以使用面向互联网的应用程序负载均衡器向实例分配流量。面向互联网的负载均衡器具有可公开解析的 DNS 名称,并通过互联网将来自客户端的请求路由到目标。

有关使用应用程序负载均衡器作为 CloudFront 的源的更多信息,包括如何确保查看器只能通过 CloudFront 而不是直接访问负载均衡器来访问您的 Web 服务器,请参阅限制访问应用程序负载均衡器

使用 Lambda 函数 URL

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

如果您使用带有函数 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 必须可供公开访问。为此,请使用以下选项之一:

  • 如果您使用源访问控制(OAC)功能,Lambda 函数 URL 的 AuthType 参数必须使用 AWS_IAM 值并在基于资源的策略中允许 lambda:InvokeFunctionUrl 权限。有关将 Lambda 函数 URL 用于 OAC 的更多信息,请参阅限制对 Amazon Lambda 函数 URL 源的访问

  • 如果您不使用 OAC,可以将函数 URL 的 AuthType 参数设置为 NONE,并在基于资源的策略中允许 lambda:InvokeFunctionUrl 权限。

您也可以在 CloudFront 发送到源的请求中添加自定义源标头。如果请求中不存在此标头,则编写函数代码以返回错误响应。这有助于确保用户只能通过 CloudFront(而无法直接使用 Lambda 函数 URL)来访问您的 Web 应用程序。

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

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

自定义源是具有可公开解析的 DNS 名称的 HTTP(S) Web 服务器,可通过互联网将来自客户端的请求路由到目标。HTTP(S) 服务器可以托管在 Amazon(例如 Amazon EC2 实例)上,也可以托管在其他地方。配置为网站端点的 Amazon S3 源也被视为自定义源。有关更多信息,请参阅 使用配置为网站端点的 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,建议您执行下列操作:

  • 使用亚马逊机器映像为 Web 服务器自动安装软件。有关的更多信息,请参阅 Amazon EC2 文档

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

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

使用 CloudFront 源组

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

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