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

tha*_*all 107 amazon-s3 s3fs

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

Dan*_*ams 178

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


AWS控制台说明

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

  • 登录AWS管理控制台
  • 进入S3桶
  • 按路线选择所有文件
  • 从菜单中选择"更多"
  • 选择"更改元数据"
  • 在"密钥"字段中,从下拉菜单中选择"缓存控制"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
Run Code Online (Sandbox Code Playgroud)

对于整个存储桶(注意--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
Run Code Online (Sandbox Code Playgroud)

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

只有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
Run Code Online (Sandbox Code Playgroud)

如果您需要更多信息,请参阅手册的一些链接:

已知的问题:

"Unknown options: --metadata-directive, REPLACE"
Run Code Online (Sandbox Code Playgroud)

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


S3cmd工具

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

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


希望能帮助到你!

  • 感谢您确切要做的实际示例.我只是在阅读文档时发现了甚至可能的内容. (5认同)
  • 当我运行上述任何命令时,我收到"未知选项:--metadata-directive,REPLACE".请帮助我. (2认同)
  • 请注意,使用 --meta-directive REPLACE 将覆盖命令中未复制的任何先前元数据!例如,如果未明确添加到 cp 命令中,“内容编码 gzip”将被删除。 (2认同)

bip*_*lob 31

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

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

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

  • “按路线选择所有文件”是什么意思? (4认同)
  • @Chris 它确实重置了我的所有内容类型(内容类型:二进制/八位字节流)UGH (2认同)

ash*_*e11 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/


roe*_*ens 10

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


我一直在讨论这个问题已经有一段时间了.直到我找到并阅读文档.在这里分享以防万一它可以帮助其他人:

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

aws s3 cp \
  --metadata-directive REPLACE \
  --cache-control max-age=1,s-maxage=1 \
  s3://bucket/path/file \
  s3://bucket/path/file
Run Code Online (Sandbox Code Playgroud)
  • --metadata-directive REPLACE在" 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
Run Code Online (Sandbox Code Playgroud)


Geo*_*ord 7

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

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

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


Ibr*_*ula 5

您始终可以在 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 /