【问题标题】:AWS cloudfront not updating on update of files in S3AWS cloudfront 不更新 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 上工作,/ 会给你你想要的。

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


【解决方案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 加载最新的对象。

    如果您只更新一个文件,您也可以只使一个文件无效。

    只需几秒钟即可使对象无效。

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

    【讨论】:

    【解决方案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 没有任何意义且无效。
        猜你喜欢
        • 2012-10-31
        • 2019-05-03
        • 2014-08-22
        • 1970-01-01
        • 1970-01-01
        • 2014-09-04
        • 2017-01-23
        • 1970-01-01
        • 2018-04-15
        相关资源
        最近更新 更多