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

时间:2014-02-25 17:25:44

标签: caching amazon-s3

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

我甚至手动进行了更改,但没有变化......

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

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

cron工作在过去的6个月里一直没有问题。

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

9 个答案:

答案 0 :(得分:53)

使用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的解决方案无法正常工作,因为将其设置为零相当于使用原始缓存标头。

答案 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"  

References

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)

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

enter image description here

enter image description here

enter image description here

答案 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)

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

invalidate request screenshot

更新:

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