为什么 CloudFront 提供 Amazon S3 中的过时内容?

上次更新时间:2020 年 8 月 6 日

我使用 Amazon CloudFront 为 Amazon Simple Storage Service (Amazon S3) 中存储的对象提供服务。我已更新 S3 中的对象,但 CloudFront 分配仍然在为这些文件的之前版本提供服务。Amazon S3 内容为何未在 Amazon CloudFront 上更新? 如何修复此问题?

简短描述

默认情况下,CloudFront 会将来自 Amazon S3 的响应缓存长达 24 个小时(默认 TTL 为 86400 秒)。如果您的请求发送至在 24 小时内为Amazon S3 响应提供服务的边缘站点,则即使您在 Amazon S3 中更新了内容,CloudFront 仍会使用缓存的响应。

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

解决方法

使 S3 对象失效

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

在运行失效之前,请考虑以下事项:

  • 仅可在 Web 分配上运行失效。无法使实时消息传输协议 (RTMP) 分配失效。
  • 无法使使用 Cookie 或标题来区分响应的特定版本的对象失效。在这种情况下,CloudFront 会使所有版本的对象失效。
  • 每个 AWS 账户每月允许 1000 个免费失效路径。有关每月超过 1000 个失效路径的价格,请参阅 Amazon CloudFront 定价中的失效请求

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

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

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

使用对象版本控制

如果您频繁更新内容,我们建议您使用对象版本控制清除 CloudFront 分配的缓存。对于频繁缓存刷新,使用对象版本控制可能比使用失效的成本要低。

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

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

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

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

这篇文章对您有帮助吗?


您是否需要账单或技术支持?