我使用 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 的路径执行失效操作。这是因为该路径既不指向单个对象,也没有以通配符结尾。
- 指定的路径必须与对象路径的大小写完全匹配。失效请求区分大小写。
- 要根据查询字符串移除某个对象的特定版本,请在失效路径中包含查询字符串参数。
对象失效操作通常需要 10-100 秒完成。要查看失效操作的状态,请从 CloudFront 控制台查看您的分配。
使用文件版本控制
如果您频繁更新内容,则最佳做法是使用文件版本控制来清除 CloudFront 分配的缓存。对于频繁的缓存刷新,文件版本控制的成本可能低于失效操作。
要使用文件版本控制,请完成以下步骤:
- 将对象的新版本存储在原始位置,并在键名称中包含版本号。例如,如果您更新了 /image_v1.png,请将该对象的新版本存储为 /image_v2.png。
- 在原始位置更新对象,但基于包含文件版本的查询字符串进行缓存。例如,查询字符串会从 /image.png?ver=1 更新为 /image.png?ver=2。您可以使用缓存策略来指定缓存密钥和源请求中包含哪些查询字符串。
注意:如果 CloudFront 缓存中有以前的版本 (/image.png?ver=1),您仍可以请求它。
对于每种文件版本控制方法,请考虑以下优势和劣势:
- 您可以将对象的新版本存储在原始位置,以便将更改恢复到仍能通过旧名称访问的先前版本。但是,如果您存储一个对象的多个版本,则存储成本可能会增加。
- 在原始位置更新对象并基于查询字符串进行缓存可降低存储成本。为应对可能的回滚操作,最佳做法是使以前的文件版本保持离线状态。
**注意:**指定的带版本号的文件名或目录名与 S3 版本控制无关。S3 版本控制不会自动更新内容。请确保正确指定文件路径,因为失效请求开始后将无法取消。
相关信息
管理内容保留在缓存中的时间长度(过期)
查询字符串转发和缓存