AWS cloudfront 不更新 S3 中的文件更新
Posted
技术标签:
【中文标题】AWS cloudfront 不更新 S3 中的文件更新【英文标题】:AWS cloudfront not updating on update of files in S3 【发布时间】:2015-07-21 04:15:59 【问题描述】:我使用我在 S3 上的文件在云端创建了一个发行版。 它工作正常,我的所有文件都可用。但是今天我在 S3 上更新了我的文件并尝试通过 Cloudfront 访问它们,但它仍然给出了旧文件。
我错过了什么?
【问题讨论】:
旧文件可能仍会缓存在 Cloudfront 中,具体取决于它们的到期标头。您希望 Cloudfront 将它们缓存多长时间? 缓存缓存文件。 The length of time is configurable. 对于现在遇到这种情况的人,您必须使/
无效,而不是index.html
。如果你做index.html
,它只会在有人去example.com/index.html
时才有效。既然你想让它在example.com
上工作,/
会给你你想要的。
【参考方案1】:
刚刚遇到同样的问题。起初,我尝试将我更新的 S3 存储桶中的文件的缓存控件更新为 0 和 max-age=0,但这没有用。
按照@jpaljasma 的步骤做了什么。以下是一些屏幕截图的步骤。
首先转到您的 AWS CloudFront 服务。
然后单击您要失效的 CloudFront 分配。
单击失效选项卡,然后单击红色圈出的“创建失效”。
在“对象路径”文本字段中,您可以列出特定文件,即/index.html
,或者只使用通配符/*
使所有文件无效。这会迫使 Cloudfront 从您的 S3 存储桶中的所有内容中获取最新信息。
在您填写文本字段后单击“无效”,在 CloudFront 完成无效后,您将在下次访问网页时看到您的更改。
注意:如果您想通过 aws 命令行界面执行此操作,可以执行以下命令
aws cloudfront create-invalidation --distribution-id <your distribution id> --paths "/*"
/*
将使所有内容无效,如果您只更新了一些文件,请将其替换为特定文件。
要查找云前端分发ID列表,您可以执行此命令aws cloudfront list-distributions
查看这两个链接以获取有关这两个命令的更多信息:
https://docs.aws.amazon.com/cli/latest/reference/cloudfront/create-invalidation.html
https://docs.aws.amazon.com/cli/latest/reference/cloudfront/list-distributions.html
【讨论】:
你摇滚!我喜欢这个答案!【参考方案2】:您应该使 CloudFront 分配缓存中的对象无效。 回到过去,您必须一次执行 1 个文件,现在您可以使用通配符,例如/图片/*
https://aws.amazon.com/about-aws/whats-new/2015/05/amazon-cloudfront-makes-it-easier-to-invalidate-multiple-objects/
【讨论】:
【参考方案3】:如何通过 AWS S3 控制台更改 Cache-Control max-age:
导航到您要更改其 Cache-Control 的文件。 选中文件名旁边的框(它会变成蓝色) 点击右上角Properties
点击Metadata
如果您没有看到名为Cache-Control
的Key
,请单击Add more metadata
。
将Key
设置为Cache-Control
将Value
设置为max-age=0
(其中0 是您希望文件保留在缓存中的秒数)。您可以将 0 替换为您想要的任何内容。
【讨论】:
虽然这绝对是可能的,但它不会改变已缓存文件的行为。此外,CloudFront 可以选择覆盖最小 TTL。 这是一个好方法,但我也想利用缓存的性能优势。我们可以调用一个 API 将这个Cache-control
设置为 0,然后在一天后返回到 1 天(或之前的任何一天)吗?【参考方案4】:
使用 CloudFront 的主要优势是从源(在您的情况下为 S3)获取文件并将其存储在边缘服务器上以更快地响应 GET 请求。 CloudFront 不会针对每个 http 请求返回 S3 源。
要让 CloudFront 提供最新的文件/对象,您有多种选择:
使用 CloudFront 使修改的对象无效
您可以使用 CloudFront 手动或使用触发器使一个或多个文件或目录无效。此选项已在此处的其他回复中进行了描述。更多信息请访问Invalidate Multiple Objects in CloudFront。如果您不经常更新文件并且不想影响缓存对象的性能优势,这种方法会很方便。
为 S3 对象设置对象过期日期
这是现在推荐的解决方案。直截了当:
登录 AWS 管理控制台 进入 S3 存储桶 选择所有文件 从菜单中选择“操作”下拉菜单 选择“更改元数据” 在“Key”字段中,从下拉菜单中选择“Cache-Control”。 在“值”字段中,输入“max-age=300”(秒数) 按“保存”按钮 CloudFront 对象的默认缓存值为 24 小时。通过将其更改为较低的值,CloudFront 会检查 S3 源以查看 S3 中是否有更新版本的对象可用。我结合使用这两种方法来确保将更新快速传播到边缘站点,并避免提供由 CloudFront 管理的过时文件。
但是,AWS 建议通过在每个文件名中使用版本标识符来更改对象名称。如果您正在使用构建命令并编译文件,则该选项通常可用(如 react npm build 命令)。
【讨论】:
对象过期方法适用于像index.html
这样无法进行版本控制的文件【参考方案5】:
为了立即反映您的更改,您必须使 Cloudfront - Distribution list -> settings -> Invalidations -> Create Invalidation 中的对象无效。
这将清除缓存对象并从 S3 加载最新的对象。
如果您只更新一个文件,您也可以只使一个文件无效。
只需几秒钟即可使对象无效。
分发列表 -> 设置 -> 失效 -> 创建失效
【讨论】:
请注意,一旦添加了失效,您将无法删除该失效docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/…【参考方案6】:我也遇到了类似的问题,发现在您的云端发行版中很容易修复 第 1 步。
登录到您的 AWS 账户并选择您的目标分布,如下图所示
第 2 步。
选择分发设置并选择行为选项卡
第 3 步。
选择
Edit
并根据下图选择选项全部
第 4 步。 保存您的设置,就是这样
【讨论】:
【参考方案7】:感谢 tedder42 和 Chris Heald
我能够减少我的来源(即 s3 对象)中的缓存持续时间,并比默认 24 小时更即时地交付文件。 对于我的其他一些发行版,我还将所有标头设置为原点,其中云端不缓存任何内容并将所有请求发送到原点。
谢谢。
【讨论】:
将所有标头转发到您的源会告诉 CloudFront 不要缓存任何内容。为什么不将 Cache-Control 标头设置为 5 分钟? 我在 2 个文件夹中有数百个文件,并且必须为每个文件完成更改缓存控制标头的选项。我没有找到将其批量应用于所有人的任何选项。所以我暂时选择了上述选项将所有请求发送到原点。【参考方案8】:我也遇到了这个问题,并通过使用版本控制(与 S3 版本控制不同)解决了它。这是使用 cloudfront 进行版本控制的综合链接
Invalidating Files 总结:
当您将一个或多个新文件上传到您的 S3 存储桶时,请更改版本并根据需要更新您的链接。从文档来看,使用版本控制与失效(另一种方法)的好处是,通过版本更改刷新 CloudFront 不需要额外费用,而失效则需要付费。如果您有数百个文件,这可能会出现问题,但通过将版本添加到您的根目录或默认根对象(如果适用)可能不会有问题。就我而言,我有一个 SPA,我所要做的就是更改我的默认根对象的版本(index.html 到 index2.html),它会立即在 CloudFront 上更新。
【讨论】:
【参考方案9】:请参考这个答案,这可能会对你有所帮助。
What's the difference between Cache-Control: max-age=0 and no-cache?
在S3中选中的文件头中添加变量Cache-Control
到0
【讨论】:
这可能是一个迟到的评论,但添加元数据 max-age=0 ,添加 0 没有任何意义且无效。以上是关于AWS cloudfront 不更新 S3 中的文件更新的主要内容,如果未能解决你的问题,请参考以下文章