自动为整个S3存储桶设置缓存控制(使用存储桶策略?)


122

我需要为整个s3存储桶(现有文件和将来的文件)设置缓存控制标头,并希望在存储桶策略中做到这一点。我知道我可以编辑现有文件,而且如果我自己上传它们,我知道如何指定它们,但是不幸的是,上传它们的应用程序无法设置标头,因为它使用s3fs在此处复制文件。

Answers:


206

现在有3种方法可以完成此任务:通过AWS控制台命令行s3cmd命令行工具


AWS控制台说明

现在,这是推荐的解决方案。这很简单,但是可能需要一些时间。

  • 登录到AWS管理控制台
  • 进入S3存储桶
  • 按路线选择所有文件
  • 从菜单中选择“更多”
  • 选择“更改元数据”
  • 在“键”字段中,从下拉菜单中选择“ Cache-Control” max-age = 604800输入(7天)作为值
  • 按“保存”按钮

感谢@biplob-请在下面给他一些爱


AWS命令行解决方案

最初,当我创建此存储桶策略时,是不行的,因此我想出了如何使用aws-cli来执行此操作,并且它非常漂亮。在研究时,我找不到任何示例,所以我想我会发布一些解决方案来帮助有需要的人。

注意:默认情况下,即使您指定了新的元数据,aws-cli也仅复制文件的当前元数据。

要使用在命令行上指定的元数据,您需要添加'--metadata-directive REPLACE'标志。这里有一些例子。

对于单个文件

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

如果您需要更多信息,这是手册的一些链接:

已知的问题:

"Unknown options: --metadata-directive, REPLACE"

这可能是由过时的awscli引起的-请参阅下面的@eliotRosewater答案


S3cmd工具

S3cmd是“用于管理Amazon S3和CloudFront服务的命令行工具”。虽然此解决方案需要git pull,但它可能是一个更简单,更全面的解决方案。

有关完整说明,请参见下面的@ ashishyadaveee11的帖子


希望能帮助到你!


6
感谢您提供实际操作示例。我只是在阅读文档时才发现可能出现的问题。
danneu 2015年

2
我在运行上述任何命令时都收到“未知选项:--metadata-directive,REPLACE”。请帮助我。
user3722785's

1
请注意,现在有一种更简便的方法。您现在可以通过AWS控制台更改存储桶中所有文件的元数据。参见下面的CoderBoy的答案:stackoverflow.com/a/47072736/2538952
Martin Tschammer

1
请注意,使用--meta-directive REPLACE将覆盖命令中未复制的所有先前元数据!例如,如果未明确将其添加到cp命令中,则将删除“ content-encoding gzip”。
哈门·詹森

1
是否cp下载并重新上传了所有内容?
mlissner

37

现在,可以从AWS控制台轻松更改它。

  • 登录到AWS管理控制台
  • 进入S3存储桶
  • 按路线选择所有文件
  • 从菜单中选择“更多”
  • 选择“更改元数据”
  • 在“键”字段中,从下拉菜单中选择“缓存控件”
  • max-age = 604800输入(7天)输入值
  • 按“保存”按钮

执行所需的时间取决于您的存储桶文件。如果不小心关闭了浏览器,请从头开始重做。


6
“按路线选择所有文件”是什么意思?
Tamzin Blake

1
从您要设置元目录中选择所有/某些文件
biplob

抱歉回复晚了。不,不是。您应该在应用程序中进行设置。
biplob

这会取代以前的元数据还是将其添加到其中?(我不想丢失所有内容类型!)
克里斯

我只是确认它不会删除现有值。仅设置您指定的密钥(如果存在则覆盖密钥)
rynop

21

脚步

  1. git clone https://github.com/s3tools/s3cmd
  2. 运行s3cmd --configure (将要求您输入两个密钥-从确认电子邮件或从您的Amazon帐户页面复制并粘贴它们。复制它们时要小心!它们区分大小写,必须正确输入,否则将不断收到关于无效密码的错误提示签名或类似签名。请记住为s3:ListAllMyBuckets密钥添加权限,否则AccessDenied在测试访问权限时会出错。)
  3. ./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/

超级答案。谢谢!有没有办法只更新那些尚未设置此标头设置的方法?
PKHunter

有人有与Windows的S3Express一起使用的类似解决方案吗?

12

只是我的声誉得分> 50,我只是发表评论。但这还没有,所以这是另一个完整的答案。


我一直在努力解决这个问题。直到我找到并阅读了文档。在这里分享,以防其他人:

最终可靠地为我工作的是此命令。我选择了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 REPLACEcp在S3中修改现有文件上的元数据时需要
  • max-age 设置浏览器的缓存时间(以秒为单位)
  • s-maxage 设置CloudFront缓存,以秒为单位

同样,如果在上传到S3时在文件上设置这些Cache-Control标头值,该命令将如下所示:

aws s3 cp \
  --cache-control max-age=1,s-maxage=1 \
  /local/path/file \
  s3://bucket/path/file

8

我认为您无法在存储桶级别指定此设置,但是有一些变通方法适合您。

  1. 在S3上将对象复制到自身,cache-control为复制操作设置适当的标题。

  2. 在文件的url中指定响应头。您需要使用预签名的url才能起作用,但是您可以在querystring中指定某些响应标头,包括cache-controlexpires。有关可用选项的完整列表,请参阅:http : //docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225


感谢Geoff,我知道(1),但不知道(2)。不是我所希望的(尽管我担心这是不可能的)
thattommyhall

您是否有关于如何执行#1的示例AWS CLI命令? docs.aws.amazon.com/cli/latest/reference/s3/cp.html
dpegasusm 2014年

3

您始终可以在S3的PUTOBJECT上配置带有触发器的lambda,lambda只会更改刚刚放置的此特定对象的标头。

然后,您可以最后一次运行上述复制命令,所有新对象都将由lambda修复。

更新:

这是一个很好的起点:https : //www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects /


您能否提供更多有关如何制作这种兰巴的详细信息?听起来是一个不错的解决方案。
Wouter

1
@Wouter当然,我找到了一个实际上可以帮助您轻松到达那里的链接aaronfagan.ca/blog/2017/…如果您需要任何帮助或支持,我将非常乐意为您提供帮助。
Ibrahim Bou Ncoula '17

我知道这是旧的,但是我发现该资源对于我要找的东西很有用。这次真是万分感谢。我的兄弟,为你投票!
castaway2000 '18

1

对于那些尝试使用Dan的答案并得到错误的人:

“未知选项:--metadata-directive,替换”

我遇到了这个问题,问题是我使用以下命令安装了awscli

须藤apt-get install awscli

这安装了awscli的旧版本,该版本缺少--metadata-directive命令。所以我用sudo apt-get remove awscli删除了它。

然后按照亚马逊上的步骤重新安装:http : //docs.aws.amazon.com/streams/latest/dev/kinesis-tutorial-cli-installation.html

唯一的区别是,由于其他人可能也会遇到的权限问题,我不得不使用sudo -H。

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.