Cloudfront 最小 TTL 有什么用?

What is Cloudfront Minimum TTL for?

我试图用这个 document 来理解 Minimum TTLMaximum TTLDefault TTL

据我理解,Maximum TTL出现在respons中出现HTTP cache header限制最大缓存时间,Default TTL出现在没有HTTP cache header的时候使用as默认缓存时间。

但是,对于Maximum TTL,没有具体提及。

另外,提到了与转发头的关系。这是否意味着如果我将任何 HTTP header 设置为转发到源并且 Minimum TTL 不是 0,它不会缓存任何内容?

Minimum TTL Specify the minimum amount of time, in seconds, that you want objects to stay in CloudFront caches before CloudFront forwards another request to your origin to determine whether the object has been updated. The default value for Minimum TTL is 0 seconds.

Important

. If you configure CloudFront to forward all headers to your origin for a cache behavior, CloudFront never caches the associated objects. Instead, CloudFront forwards all requests for those objects to the origin. In that configuration, the value of Minimum TTL must be 0.

在决定是否缓存 object 以及缓存多长时间时,CloudFront 使用以下逻辑:

使用这些值检查任何 Cache-Control 响应 header:

  • no-cache
  • no-store
  • private

如果遇到任何这些情况,停止并将 object 的 TTL¹ 设置为 最小 TTL 的配置值。 non-zero 值表示 CloudFront 将缓存 object 否则不会缓存的值。

否则,找到源的指示 object 可以缓存多长时间。 按顺序, 找到这些响应之一 headers:

  • Cache-Control: s-maxage=x
  • Cache-Control: max-age=x
  • Expires

使用此排序遇到第一个值时停止,然后继续下一步。

如果未找到任何值,请使用默认 TTL。停止。

否则,使用在上一步中发现的值:

  • 如果小于最小TTL,则将object的TTL设置为最小TTL;否则,
  • 如果大于最大TTL,则将object的TTL设置为最大TTL;否则,
  • 使用在上一步中找到的值作为 object 的 TTL。

参见 https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html

请务必注意,TTL 决定了 CloudFront 允许 缓存响应的时间长度。它而不是 指示 CloudFront 需要 缓存响应多长时间。如果很少访问 object,CloudFront 可以在 TTL 到期之前从缓存中逐出 object。

白名单一些(但不是全部)header转发到源站不会改变上述任何逻辑。

它改变的是如何评估 object 以确定缓存的响应是否可用。

例如,如果您将 Origin header 转发到源,则 Origin header 的每个唯一值都会创建一个不同的缓存条目。两个相同的请求,除了它们的 Origin header,然后被认为是不同的 objects...所以如果稍后包含对相同资源的请求 Origin: https://two.example.com。两者都将被发送到源,并且都将被独立缓存,以用于为具有相同匹配请求的未来请求提供服务 header.

CloudFront 这样做是因为如果您需要将 headers 转发到源,那么这意味着源可能会对列入白名单的 headers 的不同值做出不同的反应...所以它们被单独缓存。

不必要地转发 headers 会因此不必要地降低缓存命中率。

根据不同的 headers,CloudFront 可以缓存的同一资源的不同副本数量没有记录限制。

但是将 所有 header 转发到原点可以将任何未来请求真正相同的可能性降低到几乎为零。这可能会消耗大量缓存存储空间,存储永远不会被重用的 objects,因此 CloudFront 将此视为一种特殊情况,并且不允许在这种情况下进行任何缓存。因此,您需要将最小 TTL 设置为 0 以保持一致性。


¹此处使用的 object 的 TTL 是指 CloudFront 的每个缓存 object 的内部计时器,用于跟踪允许继续运行的时间服务于缓存的 object 而无需检查来源。 CloudFront 中 object 的 TTL 只有 CloudFront 知道,因此该值不会影响浏览器缓存。