如何在AWS S3中添加缓存控制?

时间:2014-03-19 09:33:53

标签: amazon-web-services amazon-s3 s3cmd

我已通过s3cmd命令将20000个文件移至AWS S3。现在我想为所有图像添加缓存控制(.jpg)

这些文件位于(s3:// bucket-name / images /)中。如何通过s3cmd为所有图像添加缓存控制,还是有其他方法来添加标题?

谢谢

10 个答案:

答案 0 :(得分:62)

请尝试当前的上游主分支(https://github.com/s3tools/s3cmd),因为它现在有一个modify命令,使用如下:

./s3cmd --recursive modify --add-header="Cache-Control:max-age=86400" s3://yourbucket/

答案 1 :(得分:43)

还有AWS自己的客户:

aws s3 sync /path s3://yourbucket/ --recursive --cache-control max-age=604800

答案 2 :(得分:19)

要在S3中调整对象上的缓存控制等元数据而不必重新上传,无需使用任何第三方工具,您可以使用AWS CLI执行以下操作。它会将对象复制到自身,同时使用您选择的设置覆盖元数据:

aws s3api copy-object --copy-source <bucket-name>/<file> --bucket <bucket-name> --key <file> --metadata-directive REPLACE --cache-control "max-age=3600"

在find中处理此命令,以便在您提到的存储桶中已存在的现有文件集上执行此操作:

find . -type f -exec aws s3api copy-object --copy-source <bucket-name>/{} --bucket <bucket-name> --key {} --metadata-directive REPLACE --cache-control "max-age=3600"

<bucket-name>替换为您的存储桶名称

警告:这将覆盖文件(如acl)上的所有现有元数据,只需在命令中添加其他标志即可设置所需内容,例如--acl public-read以充分公开访问。 (感谢@jackson)

答案 3 :(得分:16)

我的存储桶有mp4,jpg和其他文件。我想要更新的文件存储在“子桶”中(例如:https://s3.amazonaws.com/my.bucket/sub-directory/my-video.mp4)。在我的情况下,我只想更新mp4文件的缓存控制:

aws s3 cp \
   s3://my.bucket/sub-directory/ s3://my.bucket/sub-directory/ \
   --exclude '*.jpg' --exclude '*.png' \
   --cache-control 'max-age=31104000' \
   --recursive

要测试这将做什么,您可以使用--dryrun标志:

aws s3 cp --dryrun \
   s3://my.bucket/sub-directory/ s3://my.bucket/sub-directory/ \
   --exclude '*.jpg' --exclude '*.png' \
   --cache-control 'max-age=31104000' \
   --recursive

答案 4 :(得分:4)

如果您想避免使用第三方工具,而这是一项一次性的任务,则可以使用AWS控制台。

  1. 浏览到您的s3存储桶
  2. 选择所有要更改的对象
  3. 点击操作->更改元数据
  4. 为键选择Cache-Control,输入所需的任何控件作为值
  5. 保存

答案 5 :(得分:3)

PUT / ObjectName HTTP/1.1 
Host: BucketName .s3.amazonaws.com 
Date: date 
x-amz-meta-Cache-Control : max-age= <value in seconds> 
Authorization: signatureValue 

每个元数据设置都包含一个键值对。缓存控制元数据键是“缓存控制”,值是“max-age=<time for which you want your object to be accessed from cache in seconds>”

您可以通过两种方式使用适当的标头向Amazon S3服务器发送HTTP PUT请求,为Amazon S3对象设置缓存控制自定义标头:

使用Amazon S3 REST API设置缓存控制元数据PUT对象请求 - 如果您是程序员,则可以编写自己的软件程序以使用Amazon S3 REST或SOAP API来设置具有PUT对象请求的自定义标头。本网站仅涉及Amazon S3 REST API,有关如何使用SOAP API的详细信息,请参阅AWS文档网站。 使用Bucket Explorer用户界面设置缓存控制元数据 - 如果您希望使用鼠标单击而不是编写软件程序来设置自定义HTTP标头(如缓存控制),则可以使用Bucket Explorer的用户界面。 使用此自定义HTTP标头,您可以指定请求/响应链必须遵循的缓存行为,并防止缓存干扰请求或响应。​​

有关更多信息,请查看How to Set Cache Control Header for Amazon S3 Object?`

答案 6 :(得分:1)

只需将s3cmd升级到版本1.5.1,问题就会解决。

答案 7 :(得分:1)

(由于OP要求采取任何其他方式)

您也可以通过aws-cli来完成此操作,例如(v:aws-cli/1.8.8 Python/2.7.2 Darwin/12.5.0):

aws s3api put-object \
--bucket mybucket \
--key my/key \
--cache-control max-age=1 \
--body myfile.txt

虽然请注意您将重写任何现有对象。

答案 8 :(得分:0)

老实说,这是最好的自动取款机方式,而不会遇到其他答案中提到的错误:

aws s3 cp s3://my-bucket/ s3://my-bucket/ --recursive --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

答案 9 :(得分:-4)

另一种非常简单的方法是使用S3浏览器:http://s3browser.com/您只需移动click或ctrl + a即可选择所需的所有图像;那么就去#Http Headers&#39;选项卡并点击 - &#39;添加新标题&#39; &安培;然后&#39;应用更改&#39;。它会自动保留我的所有其他权限和标题。

如果您使用S3很多;它是一个甜蜜的应用程序,无论如何,如果你有大量的上传(在ftp,Dropbox或其他方面没有更好的东西!)