首页 文章

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

提问于
浏览
88

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

7 回答

  • 1

    现在有3种方法可以完成这项工作: via the AWS Console ,_27769250_或 via the s3cmd command line tool .


    AWS控制台说明

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

    • 登录AWS管理控制台

    • 进入S3存储桶

    • 按路线选择所有文件

    • 从菜单中选择"More"

    • 选择"Change metadata"

    • 在"Key"字段中,从下拉菜单中选择"Cache-Control" max-age = 604800输入(7天)以获取值

    • 按"Save"按钮

    thanks to @biplob - please give him some love below


    AWS命令行解决方案

    最初,当我创建这个存储桶时,策略是不行的,所以我想知道如何使用aws-cli来完成它,并且它很漂亮 . 在研究时,我无法在野外找到任何例子,所以我想我会发布一些解决方案来帮助那些有需要的人 .

    NOTE: By default, aws-cli only copies a file's current metadata, EVEN IF YOU SPECIFY NEW METADATA.

    要使用命令行中指定的元数据,需要添加“--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
    

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

    只有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
    

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

    Known Issues:

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

    这可能是由过时的awscli造成的 - 请参阅@eliotRosewater's answer below


    S3cmd工具

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

    如需完整说明,see @ashishyadaveee11's post below


    希望能帮助到你!

  • 142

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

    • 登录AWS管理控制台

    • 进入S3存储桶

    • 按路线选择所有文件

    • 从菜单中选择"More"

    • 选择"Change metadata"

    • 在"Key"字段中,从下拉菜单中选择"Cache-Control"

    • max-age = 604800输入值(7天)

    • 按"Save"按钮

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

  • 23

    steps

    • 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/

  • 19

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

    • Copy the object to itself 在S3上为复制操作设置适当的 cache-control 标头 .

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

  • 6

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


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

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

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

    当“ cp ”修改S3中现有文件的元数据时,需要

    • --metadata-directive REPLACE

    • 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
    
  • 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,因为其他人可能遇到的权限问题 .

  • 7

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

相关问题