Amazon CloudFront 入门指南:优化您的内容分发

定义

Amazon CloudFront 是一项用于加速分发静态和动态 Web 内容(如 .html、.css、.js 和图像文件)的 Web 服务。CloudFront 利用全球数据中心(称为边缘站点)网络来传输内容。当用户请求您通过 CloudFront 提供的内容时,请求会被路由到延迟最低的边缘站点,从而以最佳性能交付内容。

如果请求的内容已经缓存于延迟最短的边缘站点,CloudFront 将直接提供该内容。

若内容不在边缘站点中,CloudFront 会从指定的源(例如已定义的 Amazon S3 存储桶、MediaPackage 通道或 HTTP 服务器)检索所需内容。

CloudFront 通过 AWS 主干网络将每个用户请求路由到最适合提供内容的边缘位置,从而提升内容的分发速度。这通常是面向查看者提供的最快交付的 CloudFront 边缘服务器。利用 AWS 网络可以显著减少用户请求需要经过的网络数量,从而提高性能,使用户享有更低的延迟和更高的数据传输速率。

此外,您还可以享受更高的可靠性和可用性,因为文件的副本(对象)会被缓存到全球多个边缘位置。

CloudFront 常见术语

分配:分配是 CloudFront 的基本构件,每个分配都有唯一的 ID 和分配的域名(例如 abcdefg13456789.cloudfront.net)。

源站:源站是需要加速的站点,可以是 S3 存储桶、ELB/EC2、Elemental MediaStore/MediaPackage,或用户自定义的站点(如第三方 IDC 中的 HTTP 服务器)。一个分配中可以配置多个源站。

行为:CloudFront 通过路径匹配和优先级来决定执行的缓存行为。一个分配中可以包含多个行为,每个行为对应一个源站。在行为中,可以设置缓存 TTL 时间、允许的 HTTP 动作(如 GET、PUT、POST 等)以及与 Lambda@edge 函数的关联。

边缘站点分布情况

在中国,CloudFront 使用位于四个城市(北京、上海、中卫(宁夏)、深圳)的四个节点(POP)构成的网络,这些边缘站点通过私有网络与由光环新网和西云数据分别运营的亚马逊云科技中国(北京)和(宁夏)区域直接连接,以便快速分发内容给中国用户。

在海外,CloudFront 拥有超过 450 个接入点和 13 个区域边缘缓存,覆盖 48 个国家/地区的 90 多个城市。

更多具体位置请参考官网:
https://aws.amazon.com/cn/cloudfront/features/?nc=sn&loc=2&whats-new-cloudfront.sort-by=item.additionalFields.postDateTime&whats-new-cloudfront.sort-order=desc

适用场景

  • 加快静态网站内容的分发速度
  • 提供点播视频或实时流媒体内容
  • 在系统处理过程中加密特定字段
  • 在边缘进行自定义处理
  • 使用 Lambda@Edge 自定义提供私有内容

CloudFront 分配的配置

以下是创建分配时的主要设置:

图片

1. 源

  • 源域:源站地址,仅支持域名方式,可以通过下拉列表选择已创建的 ELB、S3、MediaStore、MediaPackage 等。如果是自定义站点,需先配置域名,IP 地址不可用。

  • 协议:CloudFront 回源协议,可以是 HTTP 或 HTTPS,也可以选择与客户请求时相同的协议。请注意,这是 CloudFront 回源时使用的协议,而不是对外提供的协议。如果选择 HTTPS,请确保源站已配置匹配的 SSL 证书。

  • 源路径(可选):若源站内容有多层目录,您可以设置要隐藏的目录层级。

  • 例如:配置源路径 /version1 后,客户访问 www.customer.com/page.html 相当于访问源站 origin.customer.com/version1/page.html。

  • 名称:可以为该设置指定一个易记的名称。

  • 添加自定义标头(可选):可以在请求源站时添加特定的 HTTP header。

  • 启用源护盾:源护盾是一个附加的缓存层,能减少源站的回源压力,并改善回源的稳定性和速度,适用非亚马逊云上的源站。源护盾将产生额外费用。

  • 其他设置:可配置回源的失败重试次数、连接超时、响应超时以及连接复用保持时间。

图片

2. 默认缓存行为

  • 路径模式:默认值为 ,即匹配所有路径。支持通配符 * 代表零个或多个字符,? 代表完全匹配一个字符。路径模式区分大小写,例如 image/.jpg 表示 image 目录下的所有 JPG 文件。

  • 自动压缩对象:可选择在客户端支持时返回源站文件的压缩版本,以改善用户体验。需在下面的缓存策略中勾选使用 GZip 或 Brotli 压缩算法。

3. 查看器

  • 查看器协议策略:允许客户端访问 CloudFront 时使用的协议,包括 HTTP 和 HTTPS,并支持 HTTP 到 HTTPS 的重定向。

  • 允许的 HTTP 方法:允许的 HTTP 动作,不同的行为可以配置不同选项。

  • 限制查看器访问:是否使用签名的 URL 或签名的 Cookie 进行访问,即防止盗链技术。

图片

4. 缓存键和源请求

通过以下设置来管理源的缓存和内容区分:

  • 缓存策略和源请求策略(推荐)共同决定缓存设置。

1)缓存策略

  • 托管式:

    • CachingOptimized 适用于静态网站加速场景,源站内容不因用户、终端不同而变化,内容默认已压缩。
    • CachingOptimizedForUncompressedObjects 与上述策略相同,但不进行压缩。
    • CachingDisabled 适用于动态内容或不可缓存内容。
    • Elemental-MediaPackage 为 Amazon Elemental MediaPackage 服务配置的策略。
    • Amplify 为 Amazon Amplify Web 应用程序配置的策略。
  • 自定义:可设置 TTL(缓存过期时间):

    • 最短 TTL:CloudFront 在到达该时间后,请求源以确认缓存是否最新。
    • 默认 TTL:若源内容未指定 Cache-Control 或 Expires 头,CloudFront 将按照该值设置缓存过期时间。
    • 最长 TTL:当源内容指定了 Cache-Control 或 Expires 头时,设置的缓存过期时间为这两个值的较小者。

请注意,这三个值仅影响 CloudFront 的回源和缓存行为,向客户端返回的缓存头以源站返回的为准。

缓存键设置定义在缓存源站内容时,应该使用哪些关键键值来区分不同内容。

  • 标题:无表示不需要区分不同的 HTTP Header。
  • 查询字符串:无表示不需要区分不同查询字符串,全部表示需要将所有查询字符串带上进行缓存区分,包括/排除特定字符串表示包括或排除对应字符串进行缓存区分。
  • Cookie:类似于查询字符串,但处理 Cookie 内的值。
  • 压缩支持可开启 GZip 和 Brotli 压缩,但需选择自动压缩对象后才会生效。

2)源请求策略(可选)

  • 托管式:

    • UserAgentRefererHeaders 仅包含 User-Agent 和 Referer 头,便于统计客户来源。
    • CORS-CustomOrigin 包含 Origin 头,适用于自定义源启用跨源资源共享 (CORS)。
    • CORS-S3Origin 适用于 S3 源启用 CORS。
    • AllViewer 适用于动态请求的源站,源站可获取查询字符串和 Cookie 信息。
    • Elemental-MediaTailor-PersonalizedManifests 适用于 Amazon Elemental MediaTailor 终端节点的源。
  • 自定义:设置 Http Header 请求。

  • 无:不使用 HTTP Header 进行源请求。
  • 包括以下标题:选择特定 HTTP Header 进行回源请求。
  • 所有查看器标题和以下 CloudFront 标题:CloudFront 可识别常见情况。
  • 所有查看器标题:传递客户端的所有标题。

源站收到 CloudFront 请求中的 Host 字段值为源站设置的域名,若希望源站获取客户端发来的 Host 字段值,需将 Host 添加到白名单。

查询字符串与 Cookie 设置相同,定义回源时的参数传递。

  • Legacy cache settings:旧的遗留策略,不推荐使用。

  • 响应头策略:可实现安全相关需求和获取更多统计信息。

  • 托管式:

    • SimpleCORS 允许来自任何源的简单 CORS 请求(添加头:Access-Control-Allow-Origin: *)。
    • CORS-With-Preflight 支持 CORS 的预检请求(HTTP OPTIONS 方法)。
    • SecurityHeadersPolicy 添加一组安全头。
    • CORS-and-SecurityHeadersPolicy 添加 CORS 和安全头。
    • CORS-with-preflight-and-SecurityHeadersPolicy 添加 CORS、预检和安全头。
  • 自定义:可设置自定义的 CORS 和安全头。

  • 服务计时头:提供 CloudFront 是否命中缓存、回源点、各级回源所用时间的信息,支持设置采样百分比。

  • 其他设置:可配置 IIS 的平滑流、字段级加密及实时访问日志流。

图片

5. 函数关联(可选)

函数关联设置允许在 CloudFront 处理请求的不同阶段嵌入 Lambda@edge 和 CloudFront Functions 代码,以实现自定义逻辑处理,具体内容不再展开。

图片

6. 设置

  • 价格级别:分为三类:北美与欧洲、北美与欧洲加亚太非、全球加速。不同类别适用的 PoP 点不同,相应价格也不一样。

  • AWS WAF Web ACL(可选):如已配置 WAF,可以在此关联,完成 CloudFront Distribution 创建后也可在 WAF 控制台中进行关联。

  • 备用域名 CNAMEs(可选):若使用自定义域名,该项为必填。CloudFront Distribution 创建后会提供一个以 cloudfront.net 结尾的域名,若需使用自定义域名,请在此处填写。

  • 自定义 SSL 证书(可选):支持使用自定义域名的证书,需与上一步域名匹配。可通过 Amazon ACM 申请证书,但需注意在 us-east-1 区域下申请才能应用于 CloudFront,支持 dedicate IP 和 SNI 两种模式。

  • 支持的 HTTP 版本:可启用 HTTP/2 支持。

  • 默认根对象(可选):可指定默认指向的文件名,例如:index.html。

  • 标准日志记录:建议开启标准访问日志记录。日志开启后需选择存放的 S3 桶。

  • IPV6:是否支持 IPv6。

示例展示

创建一个分配,通过 CloudFront 分配的域名访问 S3 的对象。

1)创建一个存储桶,并配置对象所有权和存储桶访问权限。

图片

图片

2)上传一张图片,并进行访问控制列表(ACL)设置。

图片

3)创建 CloudFront 分配,源站为 S3,行为对应源站 S3 存储桶。

图片

图片

其他设置为默认配置,点击页面底部“创建分配”。等待几分钟,待分配部署完成,查看 “常规” 和 “行为” 信息,并记录域名。

图片

图片

4)通过 CloudFront 访问 S3 存储桶对象。

使用 CloudFront 域名访问 S3 内容时,请将 CloudFront 分配的域名与内容访问路径组合在一起。

图片

CloudFront 定价

CloudFront 对从其边缘站点传出的数据以及 HTTP 或 HTTPS 请求进行收费。定价因使用类型、地理区域和功能选择而异。您无需支付前期费用或承诺使用量,与其他 AWS 服务一样,您可以按需支付,仅为实际使用的内容付费。

以下示例总结了使用 CloudFront 的费用:

图片

1)Amazon S3 存储桶中的存储费用。

2)从边缘站点提供对象的费用。

3)提交数据的费用。

有关价格的更多信息,请访问:
https://aws.amazon.com/cn/cloudfront/pricing/

为了防止意外费用,您可以使用 AWS Budgets。通过 AWS Budgets,您可以设置成本阈值,并在实际或预测费用超过该阈值时通过电子邮件或 Amazon SNS 主题接收通知。

具体请参阅:
https://docs.aws.amazon.com/zh_cn/cost-management/latest/userguide/budgets-managing-costs.html