我需要为整个s3存储桶设置缓存控制头,包括现有和未来的文件,并希望在存储桶策略中执行此操作 . 我知道我可以编辑现有的,我知道如果我自己上传它们如何在put上指定它们但不幸的是上传它们的应用程序无法设置 Headers ,因为它使用s3fs复制那里的文件 .
现在有3种方法可以完成这项工作: via the AWS Console ,_27769250_或 via the s3cmd command line tool .
现在这是推荐的解决方案 . 这是直截了当的,但可能需要一些时间 .
登录AWS管理控制台
进入S3存储桶
按路线选择所有文件
从菜单中选择"More"
选择"Change metadata"
在"Key"字段中,从下拉菜单中选择"Cache-Control" max-age = 604800输入(7天)以获取值
按"Save"按钮
(thanks to @biplob - please give him some love below)
最初,当我创建这个存储桶时,策略是不行的,所以我想知道如何使用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
如果您需要更多信息,请参阅手册的一些链接:
http://docs.aws.amazon.com/cli/latest/userguide/using-s3-commands.html
http://docs.aws.amazon.com/cli/latest/reference/s3/cp.html#options
Known Issues:
"Unknown options: --metadata-directive, REPLACE"
这可能是由过时的awscli造成的 - 请参阅@eliotRosewater's answer below
S3cmd是“用于管理Amazon S3和CloudFront服务的命令行工具” . 虽然这个解决方案需要git pull,但它可能是一个更简单,更全面的解决方案 .
如需完整说明,see @ashishyadaveee11's post below
希望能帮助到你!
现在,它可以从AWS控制台轻松更改 .
在"Key"字段中,从下拉菜单中选择"Cache-Control"
max-age = 604800输入值(7天)
执行需要时间取决于您的存储桶文件 . 如果您不小心关闭浏览器,请从头开始重做 .
steps
git clone https://github.com/s3tools/s3cmd
运行 s3cmd --configure (您将被要求提供两个密钥 - 从您的确认电子邮件或亚马逊帐户页面复制并粘贴它们 . 复制时要小心!它们区分大小写,必须准确输入或者您将不断收到错误关于无效签名或类似问题 . 请记住向密钥添加 s3:ListAllMyBuckets 权限,否则在测试访问权限时会出现 AccessDenied 错误 . )
s3cmd --configure
s3:ListAllMyBuckets
AccessDenied
./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/
我不认为你可以在桶级别指定这个,但有一些解决方法适合你 .
Copy the object to itself 在S3上为复制操作设置适当的 cache-control 标头 .
cache-control
Specify response headers in the url to the files . 您需要使用预先签名的URL来实现此功能,但您可以在查询字符串中指定某些响应标头,包括 cache-control 和 expires . 有关可用选项的完整列表,请参阅:http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225
expires
如果我的声望得分> 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中现有文件的元数据时,需要
cp
--metadata-directive REPLACE
max-age 设置浏览器缓存时间,以秒为单位
max-age
s-maxage 设置CloudFront缓存,以秒为单位
s-maxage
同样,如果在上传到S3时在文件上设置这些Cache-Control标头值,该命令将如下所示:
aws s3 cp \ --cache-control max-age=1,s-maxage=1 \ /local/path/file \ s3://bucket/path/file
对那些试图使用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,因为其他人可能遇到的权限问题 .
您始终可以在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/
7 回答
现在有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”标志 . 这是一些例子 .
对于单个文件
对于整个存储桶(注意--recursive标志):
我发现,如果您只想将其应用于特定文件类型,则需要排除所有文件,然后包含您想要的文件 .
只有jpgs和pngs:
如果您需要更多信息,请参阅手册的一些链接:
http://docs.aws.amazon.com/cli/latest/userguide/using-s3-commands.html
http://docs.aws.amazon.com/cli/latest/reference/s3/cp.html#options
Known Issues:
这可能是由过时的awscli造成的 - 请参阅@eliotRosewater's answer below
S3cmd工具
S3cmd是“用于管理Amazon S3和CloudFront服务的命令行工具” . 虽然这个解决方案需要git pull,但它可能是一个更简单,更全面的解决方案 .
如需完整说明,see @ashishyadaveee11's post below
希望能帮助到你!
现在,它可以从AWS控制台轻松更改 .
登录AWS管理控制台
进入S3存储桶
按路线选择所有文件
从菜单中选择"More"
选择"Change metadata"
在"Key"字段中,从下拉菜单中选择"Cache-Control"
max-age = 604800输入值(7天)
按"Save"按钮
执行需要时间取决于您的存储桶文件 . 如果您不小心关闭浏览器,请从头开始重做 .
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/
我不认为你可以在桶级别指定这个,但有一些解决方法适合你 .
Copy the object to itself 在S3上为复制操作设置适当的
cache-control
标头 .Specify response headers in the url to the files . 您需要使用预先签名的URL来实现此功能,但您可以在查询字符串中指定某些响应标头,包括
cache-control
和expires
. 有关可用选项的完整列表,请参阅:http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225如果我的声望得分> 50,我只是评论 . 但它不是(还)所以这是另一个完整的答案 .
我一直在讨论这个问题已经有一段时间了 . 直到我找到并阅读文档 . 在这里分享以防万一它可以帮助其他人:
最终可靠地为我工作的是这个命令 . 我选择1秒的到期时间进行测试以验证预期结果:
当“
cp
”修改S3中现有文件的元数据时,需要--metadata-directive REPLACE
max-age
设置浏览器缓存时间,以秒为单位s-maxage
设置CloudFront缓存,以秒为单位同样,如果在上传到S3时在文件上设置这些Cache-Control标头值,该命令将如下所示:
对那些试图使用Dan的答案并得到错误的人:
我遇到了这个问题,问题是我安装awscli使用
这安装了旧版本的awscli,缺少--metadata-directive命令 . 所以我使用sudo apt-get删除awscli来删除它 .
然后按照亚马逊的程序重新安装:http://docs.aws.amazon.com/streams/latest/dev/kinesis-tutorial-cli-installation.html
唯一的区别是我必须使用sudo -H,因为其他人可能遇到的权限问题 .
您始终可以在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/