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-ControlKey,请单击Add more metadata。 将Key 设置为Cache-ControlValue 设置为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-Control0

【讨论】:

这可能是一个迟到的评论,但添加元数据 max-age=0 ,添加 0 没有任何意义且无效。

以上是关于AWS cloudfront 不更新 S3 中的文件更新的主要内容,如果未能解决你的问题,请参考以下文章

AWS CloudFront:不存在这样的存储桶

aws cloudfront - 使用 S3 拒绝访问

AWS S3+Cloudfront 静态网站子目录不起作用

AWS Cloudfront 分发保持“进行中”55 分钟并计数

AWS CloudFront 拒绝访问 S3 存储桶

AWS S3和Cloudfront单个文件带宽?