我需要设置缓存控制标头为整个S3存储,包括现有的和未来的文件,并希望能做到这一点的水桶政策。 我知道我可以编辑现有的,我知道如何指定他们在放,如果我上传他们自己但不幸的是,因为它使用s3fs到其中的文件复制上传他们的应用程序无法设置头。
Answer 1:
现在有3种方式来完成这件事: 通过AWS控制台 , 通过命令行 ,或通过s3cmd命令行工具 。
AWS控制台的说明
这是现在推荐的解决方案。 它是直线前进,但它可能需要一些时间。
- 登录到AWS管理控制台
- 进入S3桶
- 通过选择路由的所有文件
- 选择“更多”,从菜单
- 选择“更改元数据”
- 在“密钥”字段中,从下拉菜单中最大年龄= 604800Enter(7天)的价值选择“的Cache-Control”
- 按“保存”按钮
( 感谢@biplob -请在下面给他一些爱 )
AWS命令行解决方案
原来,当我创造了这个水桶政策是一个没有去,所以我想通了如何使用AWS-CLI来做到这一点,这是非常漂亮的。 研究当我找不到在野外任何的例子,所以我想我会发表我的一些解决方案来帮助那些需要的人。
注:默认情况下,AWS-CLI只复制文件的当前元数据,即使您指定新的元数据。
若要使用命令行上指定的元数据,你需要添加“--metadata-指令替换”标志。 这里有一些例子。
对于单个文件
aws s3 cp s3://mybucket/file.txt s3://mybucket/file.txt --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public
对于整个桶(注意--recursive标志):
aws s3 cp s3://mybucket/ s3://mybucket/ --recursive --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public
小疑难杂症,我发现,如果你只是想将它应用到特定的文件类型,你需要排除的所有文件,然后包括你想要的人。
只有JPG和PNG格式:
aws s3 cp s3://mybucket/ s3://mybucket/ --exclude "*" --include "*.jpg" --include "*.png" \
--recursive --metadata-directive REPLACE --expires 2034-01-01T00:00:00Z --acl public-read \
--cache-control max-age=2592000,public
下面是一些链接到手册,如果你需要更多的信息:
- http://docs.aws.amazon.com/cli/latest/userguide/using-s3-commands.html
- http://docs.aws.amazon.com/cli/latest/reference/s3/cp.html#options
已知的问题:
"Unknown options: --metadata-directive, REPLACE"
这可以通过一个过时的awscli原因引起-见@下面eliotRosewater的答案
S3cmd工具
S3cmd是“用于管理Amazon S3和CloudFront的服务命令行工具”。 虽然这种解决方案需要一个混帐拉这可能是一个更简单,更全面的解决方案。
有关完整说明, 请参见下面的@ ashishyadaveee11的帖子
希望能帮助到你!
Answer 2:
现在,它可以从AWS控制台轻易改变。
- 登录到AWS管理控制台
- 进入S3桶
- 通过选择路由的所有文件
- 选择“更多”,从菜单
- 选择“更改元数据”
- 在“密钥”字段中,从下拉菜单中选择“缓存控制”
- 最大年龄= 604800Enter(7天)的值
- 按“保存”按钮
这需要时间来执行取决于你的水桶文件。 从头开始重做一遍,如果你不小心关闭浏览器。
Answer 3:
脚步
-
git clone https://github.com/s3tools/s3cmd
- 运行
s3cmd --configure
(你将被要求提供这两个键-复制并确认电子邮件或您的亚马逊帐户页粘贴复制时,他们要小心,他们是大小写敏感的,必须准确输入,否则你会继续! 。获取有关无效签名或类似的错误,只要加入s3:ListAllMyBuckets
权限的密钥,否则你会得到一个AccessDenied
而测试访问错误)。 -
./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/
Answer 4:
我不认为你可以在斗级别指定这一点,但也有对你的几个解决方法。
对象复制到其自身 S3上设置适当
cache-control
头复制操作。在URL中的文件指定响应头 。 您需要使用预先签署的网址为这个工作,但你可以指定查询字符串某些响应头,包括
cache-control
和expires
。 有关可用选项的完整列表,请参阅: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225
Answer 5:
是它,我的信誉得分均> 50,我只是发表评论。 但它不是(还),所以这里的另一个完整的答案。
我一直在敲打我的头在这个问题上一段时间。 直到我发现和阅读文档。 分享这里的情况下,它可以帮助别人:
- 亚马逊CloudFront的文件: 指定对象如何长期停留在一个CloudFront的边缘缓存(过期)
什么结束了对我来说,工作可靠是这个命令。 我选择了1秒的到期时间测试,以验证预期的结果:
aws s3 cp \
--metadata-directive REPLACE \
--cache-control max-age=1,s-maxage=1 \
s3://bucket/path/file \
s3://bucket/path/file
-
--metadata-directive REPLACE
当“是必需的cp
”修饰在S3现有文件元数据 -
max-age
设置浏览器缓存年龄,单位为秒 -
s-maxage
设置CloudFront的高速缓存,以秒
同样地,如果在上载至S3上的文件设置这些缓存控制标头值,则该命令将如下所示:
aws s3 cp \
--cache-control max-age=1,s-maxage=1 \
/local/path/file \
s3://bucket/path/file
Answer 6:
对那些试图使用丹的答案,并得到错误:
“未知的选项:--metadata-指令,将”
我跑进了问题,问题是,我安装awscli使用
命令和apt-get安装awscli
这种安装了旧版本,缺少--metadata-指令命令awscli的。 所以我用sudo易于得到删除awscli将其删除。
然后重新安装以下从亚马逊的程序: http://docs.aws.amazon.com/streams/latest/dev/kinesis-tutorial-cli-installation.html
唯一的区别是,我不得不用,因为这人可能会遇到同样的权限问题须藤-H。
Answer 7:
您可以随时配置与S3上PUTOBJECT触发拉姆达拉姆达只会改变只是把这个特定对象的报头。
然后你可以运行最后一次上面提到的复制命令,所有的新对象将被拉姆达固定。
更新:
这里是一个很好的地方,从开始: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects /