为什么 CloudFront 还在为 Amazon S3 中的过时内容提供服务?

1 分钟阅读
0

我在使用 Amazon CloudFront 为存储在 Amazon Simple Storage Service(Amazon S3)中的对象提供服务。我更新了 Amazon S3 中的对象,但是我的 CloudFront 分配仍然在为这些文件的之前版本提供服务。

简短描述

默认情况下,CloudFront 会将来自 Amazon S3 的响应缓存 24 小时(默认 TTL 为 86,400 秒)。如果您的请求发送至在 24 小时内为 Amazon S3 响应提供过服务的边缘站点,那么 CloudFront 会使用缓存的响应。即使您更新了 Amazon S3 中的内容,也会发生这种情况。

请使用以下其中一种方式推送 CloudFront 中已更新的 Amazon S3 内容:

解决方法

使 Amazon S3 对象失效

您可以使 Amazon S3 对象失效,将其从 CloudFront 分配的缓存中移除。在从缓存中移除对象后,下一个请求将会直接从 Amazon S3 中检索对象。

在运行此过程之前,请考虑以下事项:

  • 您无法使使用 Cookie 或标头来区分响应的某个对象的特定版本失效。在这种情况下,CloudFront 会使该对象的所有版本失效。
  • 每个 AWS 账户每月允许有 1,000 个免费的失效路径。有关详细信息,请参阅 Amazon CloudFront 定价

在创建失效时,请确保对象路径符合以下要求:

  • 对象路径必须针对各个对象,或者路径必须以通配符(*)结尾。例如,您无法对类似于 /images/*.jpeg 的路径运行失效操作,因为该路径不针对个别对象,并且不以通配符结尾。
  • 指定的路径必须与该对象的路径的大写形式完全匹配。失效请求区分大小写。
  • 要根据查询字符串移除某个对象的特定版本,请在失效路径中添加 QueryString

一般需要 10 到 100 秒钟完成对象失效操作。您可以通过从 CloudFront 控制台查看您的分配来查看失效状态。

使用对象版本控制

如果您要频繁更新内容,最佳做法是使用对象版本控制来清除 CloudFront 分配的缓存。如要频繁进行缓存刷新,使用对象版本控制可能会比使用失效的成本要低。

使用以下其中一种方法向您的对象添加版本控制:

  • 将该对象的新版本存储在原始位置,并在密钥名称中包含版本号。例如,如果要更新 /image_v1.png,则要将该对象的一个新版本存储为 /image_v2.png
  • 在原始位置更新对象,但基于包含对象版本的查询字符串进行缓存。例如,查询字符串会从 /image.png?ver=1 更新为 /image.png?ver=2。您可以使用缓存策略来指定缓存密钥和源请求中包含哪些查询字符串。
    注意:如果 CloudFront 缓存中有以前的版本(/image.png?ver=1),您仍可以请求它。

对于每种对象版本控制方法,请考虑以下优势和劣势:

  • 通过将对象的新版本存储在原始位置(Amazon S3),您可以将所做的更改还原到以前的版本,而以前的版本仍使用以前的名称。但是,存储一个对象的多个版本会增加您的存储成本。
  • 在原始位置更新对象但基于查询字符串进行缓存,可以降低存储成本。但是,为了准备进行任何回滚,最佳做法是使以前的对象版本保持脱机状态。

**注意:**指定受版本控制的文件名或目录名与 Amazon S3 对象版本控制无关。使用 Amazon S3 版本控制功能不会自动更新内容。您必须谨慎指定文件路径,因为在启动失效请求后,将无法取消该请求。

相关信息

管理内容保留在缓存中的时间长度(过期)

查询字符串转发和缓存

AWS 官方
AWS 官方已更新 1 年前