AWS cloudfront不会更新S3中的文件更新

时间:2015-05-10 17:31:06

标签: amazon-web-services amazon-s3 amazon-cloudfront

我在S3上使用我的文件在cloudfront中创建了一个发行版。 它工作正常,我的所有文件都可用。但是今天我在S3上更新了我的文件并尝试通过Cloudfront访问它们,但它仍然提供了旧文件。

我错过了什么?

8 个答案:

答案 0 :(得分:6)

您应该在CloudFront分配缓存中使对象无效。 回到过去,你必须一次做1个文件,现在你可以用它做通配符,例如/图像/ *

https://aws.amazon.com/about-aws/whats-new/2015/05/amazon-cloudfront-makes-it-easier-to-invalidate-multiple-objects/

答案 1 :(得分:5)

碰到同样的问题。最初,我尝试将更新后的S3存储桶中的文件的缓存控件更新为0,将max-age = 0更新为

按照@jpaljasma的步骤进行的工作是什么。这是一些屏幕截图的步骤。

首先转到您的AWS CloudFront服务。

然后单击要失效的CloudFront分布。 enter image description here

单击失效选项卡,然后单击红色圆圈中的“创建失效”。 enter image description here

在“对象路径”文本字段中,您可以列出特定文件,即/index.html,或仅使用通配符/*来使所有文件无效。这迫使Cloudfront从S3存储桶中的所有内容中获取最新信息。

在文本字段中填写完后,单击“无效”,CloudFront完成无效后,您下次访问该网页时将看到更改。

enter image description here

答案 2 :(得分:4)

如何通过AWS S3控制台更改Cache-Control max-age:

  • 导航到要更改其Cache-Control的文件。
  • 选中文件名旁边的框(它将变为蓝色)
  • 点击右上角Properties
  • 点击Metadata
  • 如果您没有看到名为Key的{​​{1}},请点击Cache-Control
  • Add more metadata设置为Key,将Cache-Control设置为Value(其中0是您希望文件保留在缓存中的秒数)。你可以用你想要的任何东西替换0。

enter image description here

答案 3 :(得分:4)

使用CloudFront的主要优点是从源(在您的情况下为S3)获取文件并将其存储在边缘服务器上,以更快地响应GET请求。对于每个http请求,CloudFront都不会返回到S3源。

要让CloudFront提供最新的字段/对象,您有多种选择:

使用CloudFront使修改后的对象无效

您可以使用CloudFront手动或使用触发器来使一个或多个文件或目录无效。此选项已在此处的其他响应中进行了描述。有关更多信息,请访问Invalidate Multiple Objects in CloudFront。如果您不经常更新文件并且不想影响缓存对象的性能优势,则此方法非常方便。

设置S3对象的对象到期日期

这是现在推荐的解决方案。很简单:

  • 登录到AWS管理控制台
  • 进入S3存储桶
  • 选择所有文件
  • 从菜单中选择“操作”下拉菜单
  • 选择“更改元数据”
  • 在“键”字段中,从下拉菜单中选择“缓存控件”。
  • 在“值”字段中,输入“ max-age = 300”(秒数)
  • 按“保存”按钮 CloudFront对象的默认缓存值为24小时。通过将其更改为较低的值,CloudFront会与S3源进行检查,以查看S3中是否有该对象的较新版本。

我将这两种方法结合使用,以确保将更新快速传播到边缘位置,并避免提供由CloudFront管理的过时文件。

但是,AWS建议通过在每个文件名中使用版本标识符来更改对象名。如果您使用构建命令并编译文件,则通常可以使用该选项(如react npm build命令中一样)。

答案 4 :(得分:1)

我也遇到了类似的问题,发现它真的很容易在您的Cloudfront发行版中修复

第1步。

登录到您的AWS账户并选择您的目标分配,如下图所示

enter image description here

第2步。

选择分发设置并选择行为标签

enter image description here

第3步。

选择Edit并根据下图选择选项 全部

enter image description here

第4步。
保存设置就可以了

答案 5 :(得分:0)

请参考此答案,这可能会对您有所帮助。

What's the difference between Cache-Control: max-age=0 and no-cache?

将标题中的变量Cache-Control添加到0到S3中的所选文件This worked me

答案 6 :(得分:0)

我也遇到了这个问题,并通过使用版本控制(与S3版本控制不同)解决了该问题。这是在Cloudfront中使用版本控制的完整链接

Invalidating Files 总结:

当您将一个或多个新文件上载到S3存储桶时,请更改版本并根据需要更新链接。从文档中可以看出,使用版本控制与使无效(另一种方法)的好处是,通过版本更改刷新CloudFront无需支付任何额外费用,而具有无效即可。如果您有数百个文件,这可能会出现问题,但是可能通过将版本添加到根目录或默认的根对象(如果适用)中就不会有问题。就我而言,我有一个SPA,我所要做的就是更改默认根对象的版本(将index.html更改为index2.html),它会立即在CloudFront上更新。

答案 7 :(得分:0)

要立即反映您的更改,您必须使Cloudfront-分发列表->设置->无效->创建无效中的对象无效。

这将清除缓存对象并从S3加载最新的对象。

如果仅更新一个文件,则也可以使一个文件完全无效。

使对象失效只需几秒钟。

分发列表->设置->无效->创建无效

Distribution List - Invalidations Tab enter image description here