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

时间:2012-05-03 16:15:38

标签: amazon-s3 s3fs

我需要为整个s3存储桶设置缓存控制头,包括现有文件和未来文件,并希望在存储桶策略中执行此操作。 我知道我可以编辑现有的,我知道如果我自己上传它们如何在put上指定它们但不幸的是上传它们的应用程序无法设置标题,因为它使用s3fs来复制那里的文件。

8 个答案:

答案 0 :(得分:151)

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


AWS控制台指令

这是推荐的解决方案。这是直截了当的,但可能需要一些时间。

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

thanks to @biplob - please give him some love below


AWS Command Line Solution

最初,当我创建这个存储桶时,策略是不行的,所以我想到了如何使用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

对于整个存储桶(注意 - 递归标记):

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

我发现,如果您只想将其应用于特定文件类型,则需要排除所有文件,然后包含您想要的文件。

只有jpgs和pngs:

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's answer below


S3cmd工具

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

有关完整说明,see @ashishyadaveee11's post below


希望它有所帮助!

答案 1 :(得分:27)

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

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

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

答案 2 :(得分:20)

<强>步骤

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

答案 3 :(得分:7)

我认为你不能在桶级别指定这个,但有一些解决方法适合你。

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

  2. 在文件的网址中指定响应标头。您需要使用预先签名的网址才能生效,但您可以在包含cache-controlexpires的查询字符串中指定某些响应标头。有关可用选项的完整列表,请参阅:http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225

答案 4 :(得分:6)

如果我的声望得分> 50,我只是评论。但它还没有(还),所以这是另一个完整的答案。

我现在已经对这个问题喋喋不休了一段时间。直到我发现&amp;阅读文档。在这里分享以防万一它可以帮助其他人:

最终可靠地为我工作的是这个命令。我选择1秒的到期时间进行测试以验证预期结果:

aws s3 cp \
  --metadata-directive REPLACE \
  --cache-control max-age=1,s-maxage=1 \
  s3://bucket/path/file \
  s3://bucket/path/file
    &#34; --metadata-directive REPLACE&#34;
  • cp是必需的。修改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

答案 5 :(得分:1)

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

  

“未知选项: - metadata-directive,REPLACE”

我遇到了问题,问题是我使用

安装了awscli
  

sudo apt-get install awscli

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

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

唯一的区别是我必须使用sudo -H,因为其他人可能会遇到权限问题。

答案 6 :(得分:1)

您总是可以在S3上使用PUTOBJECT上的触发器配置lambda,lambda将只更改刚刚放置的此特定对象的标头。

然后你可以最后一次运行上面提到的复制命令,所有新对象都将由lambda修复。

UPDATE:

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

答案 7 :(得分:1)

桶策略是要授予对桶和存储在其中的对象的权限,因此这条路不会产生您要查找的结果。其他答案使用自动方式修改对象元数据,但是如果您愿意将存储桶移到CloudFront之后,也可以使用Lambda @ Edge。

使用Lambda @ Edge,您可以为每个客户端请求运行任意代码,并且可以更改从源(在这种情况下为S3存储桶)返回的标头。它需要更多的配置,并且要花一些钱,但这是解决方案的蓝图:

  • 创建CloudFront发行版
  • 将S3存储桶添加为原点
  • 创建一个修改响应标头的lambda函数
  • 使用CloudFront发行版的URL访问文件

AWS文档包含an example如何修改响应标头。如果您碰巧使用Terraform来管理基础结构,我已经写了an article的操作方法。