【问题标题】:Amazon S3 and Cloudfront cache, how to clear cache or synchronize their cacheAmazon S3 和 Cloudfront 缓存,如何清除缓存或同步它们的缓存
【发布时间】:2014-03-28 02:47:08
【问题描述】:

我有一个每 10 分钟运行一次并更新内容类型和 x-amz-meta 的 cron 作业。但从昨天开始,似乎在 cron 作业运行之后,Amazon 并没有接受所做的更改(刷新他的缓存)。

我什至手动进行了更改,但没有更改...

上传视频时,它的内容类型为 application/x-mp4,cron 作业将其更改为 video/mp4。

虽然 S3 有正确的内容类型 video/mp4 cloudfront 显示 application/x-mp4(old content-type) ....

cron 作业过去 6 个月一直在运行,没有出现任何问题。

亚马逊缓存有什么问题?如何同步缓存?

【问题讨论】:

  • 也许选择一个答案 ;-)

标签: caching amazon-s3


【解决方案1】:

使用 Invalidations 清除缓存,你可以把要清除的文件的路径,或者简单地使用通配符清除所有内容。

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html#invalidating-objects-api

这也可以使用 API 来完成! http://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateInvalidation.html

AWS PHP SDK 现在有了这些方法,但如果您想使用更轻松的方法,请查看此库: http://www.subchild.com/2010/09/17/amazon-cloudfront-php-invalidator/

user3305600 的解决方案不起作用,因为将其设置为零相当于使用原始缓存标头。

【讨论】:

  • 这确实是一个更好的答案
  • 那个库看起来已经过时了。
  • @PhilTune 发布于 2014 年
【解决方案2】:

至于实际代码

获取您的 CloudFront 分配 ID

aws cloudfront list-distributions

使分配中的所有文件无效,以便 CloudFront 获取新文件

aws cloudfront create-invalidation --distribution-id=S11A16G5KZMEQD --paths /

我实际的完整发布脚本是

#!/usr/bin/env bash

BUCKET=mysite.com
SOURCE_DIR=dist/

export AWS_ACCESS_KEY_ID=xxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxx
export AWS_DEFAULT_REGION=eu-west-1


echo "Building production"
if npm run build:prod ; then
   echo "Build Successful"
else
  echo "exiting.."
  exit 1
fi


echo "Removing all files on bucket"
aws s3 rm s3://${BUCKET} --recursive


echo "Attempting to upload site .."
echo "Command:  aws s3  sync $SOURCE_DIR s3://$BUCKET/"
aws s3  sync ${SOURCE_DIR} s3://${BUCKET}/
echo "S3 Upload complete"

echo "Invalidating cloudfrond distribution to get fresh cache"
aws cloudfront create-invalidation --distribution-id=S11A16G5KZMEQD --paths / --profile=myawsprofile

echo "Deployment complete"  

参考文献

http://docs.aws.amazon.com/cli/latest/reference/cloudfront/get-invalidation.html

http://docs.aws.amazon.com/cli/latest/reference/cloudfront/create-invalidation.html

【讨论】:

  • 感谢您发布此消息——我需要使分发无效,以完全摆脱我的应用程序中不断弹出的旧的、被覆盖的文件版本。
  • 您可以使用aws s3 sync 的--delete 选项为您执行此操作,而不是先删除存储桶中的所有文件。即aws s3 sync ${SOURCE_DIR} s3://${BUCKET}/ --delete
  • 这里值得一提的是,在路径使用“/*”使存储桶中的所有文件无效,使用“/folder_name/*”使文件夹名称中的文件无效。我也觉得要花钱
  • 按照今天的云端定价页面。 “每月前 1000 条请求失效的路径不收取额外费用。此后,每条请求失效的路径 0.005 美元。”
  • 请注意/ 的路径不会使整个发行版失效(我不确定它的作用);你需要使用/* 来做到这一点
【解决方案3】:

这是通过 AWS 使 CloudFront 上所有文件的缓存失效的手动方法

  1. 打开您的 CloudFront 分配列表,然后单击要清除其缓存的所需分配 ID(在下面的屏幕截图中以红色圈出)。
  2. 点击“Invalidations”选项卡(请参阅下面屏幕截图中以蓝色突出显示的选定选项卡)。
  3. 单击“创建失效”按钮(在下面的屏幕截图中以红色圈出)
  4. 在对象路径输入中插入/*,以清除所有文件的缓存。
  5. 单击“创建失效”按钮。

【讨论】:

  • 这是临时更改吗?我需要删除失效吗?我可以立即删除它,还是需要等待几个小时?
  • 这是一个临时更改,之后您不需要删除它。它在您创建后立即运行并清除整个缓存(如果您使用/*)。刚刚拯救了我的一天!
【解决方案4】:

S3 不用于实时开发,但如果您真的想测试新部署的网站,请使用

http://yourdomain.com/index.html?v=2
http://yourdomain.com/init.js?v=2

最后添加版本参数将停止使用文件的缓存版本,浏览器将从服务器存储桶中获取文件的新副本

【讨论】:

    【解决方案5】:

    Cloudfront 将缓存文件/对象,直到缓存到期。默认为 24​​ 小时。如果您将其更改为较大的值,则需要更长的时间。

    如果您随时需要强制清除缓存,请使用invalidation。单独收费。

    另一种选择是更改 URL(对象键),因此它始终获取新对象。

    【讨论】:

      【解决方案6】:

      如果您正在寻找使缓存无效的最小解决方案,曼哈顿博士解决方案的这个编辑版本应该足够了。请注意,我指定了根 / 目录以表明我希望刷新整个站点。

      export AWS_ACCESS_KEY_ID=<Key>
      export AWS_SECRET_ACCESS_KEY=<Secret>
      export AWS_DEFAULT_REGION=eu-west-1
      
      echo "Invalidating cloudfrond distribution to get fresh cache"
      aws cloudfront create-invalidation --distribution-id=<distributionId> --paths / --profile=<awsprofile>
      

      Region Codes can be found here

      您还需要使用 aws cli 创建配置文件。 使用aws configure --profile 选项。以下是来自 Amazon 的示例 sn-p。

      $ aws configure --profile user2
      AWS Access Key ID [None]: AKIAI44QH8DHBEXAMPLE
      AWS Secret Access Key [None]: je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
      Default region name [None]: us-east-1
      Default output format [None]: text
      

      【讨论】:

        【解决方案7】:

        (编辑:不起作用)截至 2014 年,您可以随时清除缓存,请仔细阅读文档或 只需转到您的分发设置>行为>编辑

        对象缓存使用(原始缓存标头) 自定义

        最小 TTL = 0

        http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html

        【讨论】:

        • 您的解决方案不起作用,因为将其设置为零相当于使用 Origin Cache Headers。
        • 对不起!失效是唯一的方法!我猜
        【解决方案8】:

        不要使用失效。它们无法恢复,您将被收取费用。他们唯一对我有用的方法是减少 TTL 并等待。

        问候

        【讨论】:

        • 1000 次免费失效。我想那不贵;)
        • 你是什么意思他们不能被还原?下次请求时缓存不会再次填充吗?
        • 首先,不要将 CDN 与缓存混淆。其次,不抱歉,我不是这个意思,我的意思是你一旦创建它就不能取消它,但它只适用于分布中的现有对象。
        • 无论如何......在我发表评论一年后,老实说,我并不完全同意自己。
        • @luigi7up - 我认为它实际上每月免费提供 1000 个文件。因此,如果您有一个大网站,那可能会很快发生。或者,如果您像我一样犯了一些小错误,并且必须更频繁地验证......
        【解决方案9】:

        我相信使用 * 会使分发中的整个缓存失效。我正在尝试,我会进一步更新它

        invalidate request screenshot

        更新:

        它按预期工作。请注意,您可以通过指定对象路径来使您想要的对象无效。

        【讨论】:

        • 无效缓存实际上是做什么的?我的管道中有它,但我总是必须重新加载我的网站才能看到更改。我使用 s3 同步更新 S3 上的网站文件。我认为无效缓存只会清除来自 Cloudfront 边缘位置的文件,但不会清除浏览器缓存。
        • 在哪里以及如何使用 *?
        猜你喜欢
        • 2014-10-06
        • 1970-01-01
        • 1970-01-01
        • 2017-01-30
        • 1970-01-01
        • 1970-01-01
        • 2016-02-18
        • 2017-05-04
        • 1970-01-01
        相关资源
        最近更新 更多