为AWS S3存储桶中的所有文件设置HTTP标头

时间:2014-06-13 16:09:42

标签: amazon-web-services amazon-s3 http-headers amazon-cloudfront

我已经能够弄清楚如何使用AWS控制台在单个文件上设置http标头,cache-control:max_age。但是,我想对S3存储桶中的所有文件执行此操作。

如何在一个存储桶中说出500个文件呢?我不能使用AWS控制台为每个单独的文件执行此操作。

如果您无法通过AWS完成此操作。你能推荐第三方应用吗?

谢谢, 杰夫

3 个答案:

答案 0 :(得分:2)

  

修改对象元数据的唯一方法是制作对象的副本并设置元数据。在复制操作中,您将相同的对象设置为源和目标。

     

- http://docs.aws.amazon.com/AmazonS3/latest/dev/CopyingObjectsExamples.html

这是控制台在幕后为您执行的操作。没有提供批处理操作。

您需要编写一些代码来遍历存储桶中的对象,并为需要修改的每个对象call the api进行迭代。

或者,找到一个可以为您做到这一点的工具或库。哪个工具以及在哪里找到它是Stack Overflow范围之外的问题。

答案 1 :(得分:1)

awscli允许这样做。我不建议在混合了元数据的存储桶上运行它。例如,如果您有一些经过KMS加密的对象,则下面的示例将重写没有这些凭据的所有对象。

如果您添加了--recursive开关,这将在存储桶中的每个对象上设置内容类型标题。

aws s3 cp \
  s3://bucket-name/ \
  s3://bucket-name/ \
  --metadata-directive REPLACE \
  --content-type text/plain

为了安全地执行此操作,我将使用python脚本或在CLI上选择性地对每个项目一次执行一次,以确保前后的元数据相同,并且仅包含附加信息。

您可以使用aws s3api

aws \
  s3api head-object \
  --bucket s3://bucket-name/ \
  --key some-secret
{
    "AcceptRanges": "bytes",
    "LastModified": "2020-06-17T21:07:35+00:00",
    "ContentLength": 56,
    "ETag": "snip",
    "VersionId": ".aWa93h._.g_NEYcJgt_7MXJWzALyqSa",
    "ContentType": "text/plain",
    "ServerSideEncryption": "aws:kms",
    "Metadata": {},
    "SSEKMSKeyId": "arn:aws:kms:us-east-1:snip:key/snip"
}

因此,如果运行第一个replace awscli命令,它将删除策略的SSEKMSKeyId键。为此,我们还必须将以下开关添加到顶部的第一个命令中。

  --sse-kms-key-id "arn:aws:kms:us-east-1:snip:key/snip" \
  --sse aws:kms

答案 2 :(得分:0)

此功能已得到改进,您可以在控制台中编辑文件夹元数据,只需选择文件夹或文件,按Actions,选择Change Metadata,将显示像这样的面板:

enter image description here

https://docs.aws.amazon.com/AmazonS3/latest/user-guide/add-object-metadata.html