Answers:
现在有3种方法可以完成此任务:通过AWS控制台,命令行或s3cmd命令行工具。
现在,这是推荐的解决方案。这很简单,但是可能需要一些时间。
最初,当我创建此存储桶策略时,是不行的,因此我想出了如何使用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是“用于管理Amazon S3和CloudFront服务的命令行工具”。虽然此解决方案需要git pull,但它可能是一个更简单,更全面的解决方案。
有关完整说明,请参见下面的@ ashishyadaveee11的帖子
希望能帮助到你!
cp
下载并重新上传了所有内容?
现在,可以从AWS控制台轻松更改它。
执行所需的时间取决于您的存储桶文件。如果不小心关闭了浏览器,请从头开始重做。
脚步
git clone https://github.com/s3tools/s3cmd
s3cmd --configure
(将要求您输入两个密钥-从确认电子邮件或从您的Amazon帐户页面复制并粘贴它们。复制它们时要小心!它们区分大小写,必须正确输入,否则将不断收到关于无效密码的错误提示签名或类似签名。请记住为s3:ListAllMyBuckets
密钥添加权限,否则AccessDenied
在测试访问权限时会出错。)./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/
只是我的声誉得分> 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 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
我认为您无法在存储桶级别指定此设置,但是有一些变通方法适合您。
在S3上将对象复制到自身,并cache-control
为复制操作设置适当的标题。
在文件的url中指定响应头。您需要使用预签名的url才能起作用,但是您可以在querystring中指定某些响应标头,包括cache-control
和expires
。有关可用选项的完整列表,请参阅:http : //docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225
您始终可以在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 /
对于那些尝试使用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。