CloudFront系列:架构与功能

  • Published
  • Posted in Cloud
  • 2 mins read
  • Updated
  • 0 Comments

CloudFront 组件

AWS CloudFront 由多个组件构成:

 • CloudFront 源站(Origin) — 内容的来源位置

 • CloudFront 分发(Distribution) — CloudFormation 中的可配置单元

 • 边缘位置(Edge Locations) — 数据的本地缓存节点

 • 区域边缘缓存(Regional Edge Caches) — 较大的边缘位置,位于源站和常规边缘位置之间,主要用于提升性能。

CloudFront 缓存过程

CloudFront缓存过程包括多个步骤,在该图中,可以看到来自同一地区的两位用户正在尝试访问一个位于源站(S3)上的文件。该地区设有两个边缘缓存位置,并连接到一个区域边缘缓存。每位用户将访问不同的边缘缓存位置。

步骤 1:用户请求被路由到最近的边缘位置。系统检查请求的资源(图片)是否在该边缘位置可用。

步骤 2:如果内容可用,系统返回成功响应并提供请求的图片。这是一个“缓存命中”(Cache Hit)场景。

步骤 3:如果内容在边缘位置不可用,系统会从区域边缘缓存位置请求该资源。这是一个“缓存未命中”(Cache Miss)场景。如果资源可用,系统将图片返回给请求者。

步骤 4:如果资源在区域边缘缓存中也不可用,系统会从 AWS 源站请求该资源。

步骤 5 和 6:系统将图片返回给请求者。

步骤 7:另一位用户尝试检索与第一位用户请求相同的图片。第二位用户从靠近他的另一个边缘位置获取该图片。

步骤 8:由于第二个边缘位置没有该图片文件(因为它之前只被复制到第一个边缘位置),它会尝试从第一位用户使用的区域边缘缓存位置获取该资源。(记住,多个边缘位置可以共享同一个区域边缘缓存位置)。

步骤 9 和 10:由于区域边缘缓存位置已经有该资源,系统将图片返回给第二位用户。

CloudFront 行为

一个分发可以有多个行为,这些行为通过Path Pattern进行配置。如果请求与某个Path Pattern匹配,则使用该特定的行为;如果不匹配,则使用默认行为。CloudFront 行为控制着 CloudFront 中的源站、TTL(缓存存活时间)、协议策略和隐私设置等多个方面。

TTL(缓存存活时间)

TTL是对象在边缘位置存活的时间,默认TTL值为24小时。即使源站有新副本的文件,若请求在TTL时间内到达边缘位置,边缘位置仍会将该文件副本返回给客户端。一旦文件过期(超过 TTL),系统会检查源站上的文件,相对于边缘位置的副本,查看文件是否有变动。

  • 如果文件没有变动 → 系统会返回 304 Not Modified 响应。
  • 如果文件有变动 → 系统会返回 200 OK 响应,并将新副本复制到边缘位置,并将该副本返回给客户端。

可以在对象级别指定最小和最大TTL。

缓存命中率

缓存命中率是指从边缘位置(而不是源站)提供的请求比例。来自边缘位置的请求越多,性能越好。命中率越高,越好。

最大化缓存命中率

可以采取以下策略来最大化缓存命中率:

  1. 指定缓存时长(Specifying the cache duration )—

使用Cache-Control max-age指令。时长越短,CloudFront会越频繁地将请求转发到源站,检查对象是否发生了变化,如果发生变化,获取最新的源站版本。与TTL核心概念是相同的:它们都与缓存的有效时间有关,但 TTL 更多用于 CloudFront 的缓存控制,而 Cache duration 更多是由源站或客户端控制缓存存活的时间。

  1. 基于查询字符串参数缓存(Caching based on the query string parameters)—

在查询字符串中保持一致的命名约定,可以减少多次调用源站。

  1. 基于Cookie值缓存(Caching based on the Cookie values) —

为静态内容(如 .css 文件)和动态内容(如 .js 文件)创建不同的缓存行为,并配置 CloudFront 仅为动态内容(.js 文件)转发 Cookie。

  1. 基于请求头缓存(Caching based on Request Headers) —

仅使用特定的请求头进行缓存,而不是使用所有头部。

  1. 移除Accept-Encoding 头(Remove Accept-Encoding Header) —

当不需要压缩时移除该头部。

内容失效

您可以从源站移除不再希望包含在CloudFront分发中的文件。然而,CloudFront将继续从边缘缓存中向用户展示内容,直到文件过期。缓存失效发生在分发级别,并应用于所有涉及的边缘位置。如果您想立即移除文件,必须执行以下操作之一:

 • 使文件失效

 • 使用文件版本控制 — 使用版本控制时,文件的不同版本会有不同的名称,您可以在 CloudFront 分发中使用这些名称,以更改返回给用户的文件。

替代域名和 SSL

一旦为源站创建了 CloudFront 分发,系统将为您生成一个特定的CloudFront公网域名xxxxxxx.cloudfront.net。这是它为您创建的“默认域名”如果您打算使用您自己的生产级域名(例如www.yourdomain.com)来替代这个默认的CloudFront域名并且使用https,那么您需要使用AWS证书管理器(ACM) 或其他SSL证书提供商来创建一个有效的SSL证书,以确保您的域名能够支持安全的HTTPS连接。

关于证书的具体要求:

 1. 在使用 AWS 证书管理器(ACM) 创建证书时,必须选择 us-east-1(北弗吉尼亚) 区域。因为 ACM 与像 CloudFront 这样的全球服务结合使用时,证书必须在这个特定区域生成。如果您使用 ACM 为其他 AWS 服务(比如 ALB,应用负载均衡器)创建证书,那么证书需要在与该服务相同的区域内生成。

 2. 不能使用自签名证书:CloudFront 只允许使用由受信任证书颁发机构(CA)颁发的 SSL 证书。自签名证书(由您自己签发的证书)是不被支持的。受信任的证书颁发机构包括 Verisign、Comodo、Digicert、Symantec 或 AWS ACM。

简单来说,如果您想将自己的生产域名与 CloudFront 配合使用,并确保 HTTPS 连接是安全的,您需要使用 AWS 证书管理器(ACM)或其他受信任的证书提供商来申请有效的 SSL 证书,并确保该证书是在北弗吉尼亚区域创建的。

如果我们计划使用CloudFront分发与我们的生产级域名之一(作为替代域名)一起使用,那么我们需要使用 AWS 证书管理器(ACM)或其他 SSL 证书提供商来创建有效的合法 SSL 证书。

截至目前,使用 AWS Certificate Manager (ACM) 为 CloudFront 创建 SSL/TLS 证书时,必须在美国东部(弗吉尼亚州北部)区域(us-east-1)申请或导入证书。  这一要求适用于在 CloudFront 中配置 HTTPS 的场景,即在客户端与 CloudFront 之间使用加密连接。如果您计划在 CloudFront 与源服务器之间也使用 HTTPS,且源服务器是 Elastic Load Balancing(ELB),那么您可以在任何 AWS 区域中申请或导入证书。您不能使用自签名证书与 CloudFront,仅允许由受信任的证书颁发机构(CA)颁发的证书,例如Verisign、Comodo、Digicert、Semantec 或 AWS ACM(证书管理器)。

需要注意的是,在中国区域(例如中国北京和中国宁夏)使用 CloudFront 时,ACM 的功能有所不同。在这些区域,您需要从第三方证书颁发机构获取 SSL/TLS 证书,并将其上传到 IAM 证书存储,而不能直接在 ACM 中管理证书。

在通过 CloudFront 创建与多个源站的安全连接时,有两部分连接:

  1. 客户端 → CloudFront
  2. CloudFront → 源站(本地或自定义)

通过CloudFront保护源站

正如您所知,CloudFront边缘位置位于源站与客户端之间。这种架构使得任何用户都可以通过公共URL访问源站和CloudFront边缘位置。这是不安全的,也不是最佳实践。因此,CloudFront可以实施多种方式来防止这种情况发生。

  1. 使用源访问身份(OAI)限制 S3 源站的访问。
  2. 使用自定义头部限制自定义源站的访问。
  3. 使用防火墙限制自定义源站的访问。
  4. 地理限制。

1.0 使用源访问身份(OAI)限制S3访问

要限制通过Amazon S3存储桶提供的内容的访问,请按照以下步骤操作:

 1. 创建一个特殊的 CloudFront 用户,称为源访问身份(OAI),并将其与您的分发关联。

 2. 配置您的 S3 存储桶权限,以便 CloudFront 可以使用 OAI 访问存储桶中的文件并将其提供给用户。确保用户不能通过直接的 S3 存储桶 URL 访问文件。(OAI是一种身份类型,可以与CloudFront分发关联。在这种情况下,CloudFront充当了OAI的角色。)

完成这些步骤后,用户只能通过CloudFront访问您的文件,而不能直接从S3存储桶访问。一个 AWS账户最多可以拥有100个CloudFront OAI。

2.0 使用自定义头部限制自定义源站的访问

在边缘位置,会将一个自定义头部注入到请求中,源站只有在请求中存在该自定义头部时,才会处理该请求。

3.0 使用防火墙限制自定义源站的访问

如果既没有应用OAI也没有使用自定义头部,您可以使用防火墙来保护源站免受恶意攻击。通过限制并仅允许来自边缘位置 IP 范围的访问,可以实现这一点。

4.0 地理限制

默认情况下,CloudFront 会将您的数据缓存到所有边缘位置,除非在创建CloudFront分发时,您指定仅缓存到某些地区(如北美、欧洲、亚洲、中东或非洲),这些地区可以在创建分发时提供的列表中选择。

如果您需要限制/允许访问单一位置,仍然可以通过启用地理限制模式来实现。通过 CloudFront 的地理限制模式,您可以仅按“国家”进行限制/允许访问。CloudFront 使用地理 IP 数据库来追踪用户的位置。然而,如果您需要限制/允许基于“国家”以外的其他属性访问,您需要使用第三方地理位置机制。这些第三方地理位置服务通常由计算函数管理,该函数连接到地理位置数据库和其他数据源,以提供更多关于用户的信息。(地理限制功能只能帮助您控制哪些国家的用户能够访问 CloudFront 缓存的内容,但无法单独阻止用户直接访问源站。)

Lambda@Edge

Lambda@Edge是CloudFront的一项功能,允许您在CloudFront边缘位置运行轻量级的Lambda函数。这些Lambda函数可以调整观众与源站之间的流量。然而,这些Lambda函数不具备其他常规Lambda函数所具有的完整功能集。目前,仅支持NodeJS和Python作为运行时语言。Lambda@Edge 不支持 Lambda 层,并且仅在 AWS AWS 的公有区域运行(不在 VPC 内)。

Lambda@Edge 架构由四个 Lambda 函数组成,用以处理典型的观众请求:

 • Viewer Request Lambda:在 CloudFront 接收到客户端请求后执行。

 • Origin Request Lambda:在 CloudFront 将请求转发到源站之前执行。

 • Origin Response Lambda:在 CloudFront 接收到源站响应后执行。

 • Viewer Response Lambda:在将响应转发给客户端之前执行。

在这四个步骤中的每一步,您都可以对正常的请求流量进行任何更改,以满足您的应用程序级别的需求。

例如,如果您需要根据请求头中的某个参数更改S3存储桶的源站,您可以在源响应Lambda函数中检查该参数,并将流量路由到所需的 S3 存储桶。这在应用程序产品迁移中的 A/B 测试等场景中非常有用。

Leave a Reply