我有一个每10分钟运行一次的cron作业,并更新内容类型和x-amz-meta。但是从昨天起,似乎在cron工作之后,亚马逊并没有接受所做的更改(刷新他的缓存)。
我甚至手动进行了更改,但没有变化......
上传视频时,其内容类型为application/x-mp4
,而cron作业会将其更改为video/mp4
。
虽然S3有正确的内容类型video/mp4
cloudfront显示application/x-mp4
(旧内容类型)....
cron工作在过去的6个月里一直没有问题。
亚马逊缓存有什么问题?我如何同步缓存?
答案 0 :(得分:53)
使用Invalidations清除缓存,您可以将路径放到要清除的文件中,或者只使用通配符清除所有内容。
这也可以使用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的解决方案无法正常工作,因为将其设置为零相当于使用原始缓存标头。
答案 1 :(得分:24)
As to the actual code
get your CloudFront distribution id
aws cloudfront list-distributions
Invalidate all files in the distribution, so CloudFront fetches fresh ones
aws cloudfront create-invalidation --distribution-id=S11A16G5KZMEQD --paths /
My actual full release script is
#!/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
答案 2 :(得分:9)
S3不用于实时开发,但如果您真的想测试新部署的网站,请使用
http://yourdomain.com/index.html?v=2
http://yourdomain.com/init.js?v=2
最后添加版本参数将使文件的缓存版本无效,浏览器将从服务器存储桶中获取该文件的全新副本
答案 3 :(得分:8)
答案 4 :(得分:5)
Cloudfront将缓存文件/对象,直到缓存过期。默认情况下是24小时。如果您将此值更改为较大值,则需要更长时间。
如果您需要强行清除缓存,请使用invalidation。它是单独收费的。
另一种选择是更改URL(对象键),因此它始终提取新对象。
答案 5 :(得分:4)
如果您正在寻找使缓存无效的最小解决方案,那么曼哈顿博士解决方案的编辑版本应该足够了。请注意,我指定了根/目录以指示我希望刷新整个站点。
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
选项。以下是亚马逊的示例片段。
$ 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
答案 6 :(得分:3)
不要使用失效。它们无法恢复,您将被收费。它们只对我有用的方法是减少TTL并等待。
此致
答案 7 :(得分:1)
(编辑:不起作用)自2014年起,您可以随时清除缓存,请仔细阅读文档或 只需转到您的分发设置&gt;行为&gt;编辑
对象缓存使用( Origin Cache Headers ) 的定制强>
最低TTL = 0
http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html
答案 8 :(得分:0)
我相信使用*会使分发中的整个缓存无效。我目前正在尝试,我将对其进行进一步的更新
更新:
它按预期工作。请注意,您可以通过指定对象路径来使想要的对象无效。