Amazon S3和Cloudfront缓存,如何清除缓存或同步其缓存


78

我有一个cron作业,每10分钟运行一次,并更新content-type和x-amz-meta。但是从昨天开始,看起来像是在执行cron作业之后,亚马逊就没有拿起所做的更改(刷新缓存)。

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

上传视频后,视频具有application/x-mp4内容类型,并且cron作业将其更改为video/mp4

尽管S3具有正确的内容类型,video/mp4但是cloudfront显示application/x-mp4(旧的内容类型)...。

Cron作业已经过去6个月没有问题了。

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


4
也许选择一个答案;-)
鲍勃·范·路易特

Answers:


71

使用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的解决方案不起作用,因为将其设置为零等效于使用Origin Cache Headers。


2
这确实是一个更好的答案
Bob van Luijt 2015年

该图书馆看起来已经过时了。
Phil Tune

@PhilTune帖子是在2014年

42

至于实际的代码

获取您的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


感谢您发布此信息-我需要使发行版无效,以完全消除我的应用程序不断弹出的旧的,被覆盖的文件版本。
SexxLuthor

6
您可以使用--delete选项aws s3 sync来代替存储桶中的所有文件,而不必先删除该文件。即aws s3 sync ${SOURCE_DIR} s3://${BUCKET}/ --delete
Ryan McGeary '17

2
在这里值得一提的是,在路径处使用“ / *”使存储桶中的所有文件无效,并使用“ / folder_name / *”使文件夹名称中的文件无效。我也认为这要花钱
blockwala '18

根据截至今天的cloudfront定价页面。“每月每个请求无效的前1,000条路径均不收取额外费用。此后,每个请求无效的路径均收取$ 0.005。”
尼克

14

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

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

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



9

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

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

另一个选择是更改URL(对象键),以便它始终获取新对象。


7

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

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>

可以在这里找到区号

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

$ 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


0

请勿使用无效内容。它们无法还原,您将需要付费。他们对我有用的唯一方法是减少TTL和等待。

问候


6
免费提供1000次失效。我想那不算贵;)
luigi7up

1
您是什么意思,它们无法还原?缓存是否在下一个请求后再次填充?
Flimm

1
首先,不要将CDN与缓存混淆。其次,对不起,我不是这个意思,我的意思是,创建无效后就不能取消它,但是它仅适用于发行版中的现有对象。
埃克托巴尔韦德帕雷哈

5
无论如何...老实说,发表评论一年后,我并不完全同意我自己。
埃克托巴尔韦德帕雷哈

0

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

使请求屏幕截图无效

更新:

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


无效缓存实际上有什么作用?我已经准备好了,但是我总是必须重新加载我的网站才能看到更改。我使用s3 sync更新S3上的网站文件。我认为无效缓存只会清除Cloudfront Edge位置的文件,而不会清除浏览器缓存。
Haseeb Burki
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.