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


76

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

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

谢谢

Answers:


83

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

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

5
嗨,感谢您的答复,我尝试了此操作,但出现了类似ERROR的错误:无效的命令:u'modify'–
Rajaraman

@Rajaraman你知道吗?在此步骤之后,其显示访问权限遭到拒绝
shajin 2014年

2
可以使用..s3cmd版本1.5.0-rc1 BUT!测试:将对象的Content-type标头更改为“ binary / octet-stream”!使用一个PNG文件进行了测试。
哈迪2014年

1
我遇到了与@Hardy相同的问题。它还从我的所有文件中删除了公共可读性。小心。
Andrew B.

1
Content-Type错误似乎已通过#406修复。
josh3736 '16

62

同样使用AWS自己的客户端:

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

2
如果您要从计算机上的本地路径上传到AWS并希望所有内容保持适当的缓存控制,则此方法有效
youanden 2014年

24
这可以在初始同步时设置缓存头,但不会更新现有文件。您可以像这样强制更新find . -type f -exec touch '{}' \;; aws s3 sync /path s3://yourbucket/ --recursive --cache-control max-age=604800
Matt Byrne 2014年

3
OP要求更新S3中的现有文件,而不是上传新文件
Beowulfenator

2
--recursive仍然有必要吗?CLI文档似乎并未将其列出为参数。docs.aws.amazon.com/cli/latest/reference/s3/sync.html
Corey McMahon,

1
touch '{}'如上所述使用将更改文件的修改日期,这可能是不希望的。要设置cache-control现有文件,请参见下面的@ rodrigo-silveira答案。
法比恩·斯诺瓦特

28

我的存储桶中有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

我收到以下错误消息:“在调用CopyObject操作时:此复制请求是非法的,因为它试图在不更改对象的元数据,存储类,网站重定向位置或加密属性的情况下将对象复制到自身。”
Flimm

6
要修复它,我必须添加--metadata-directive REPLACE --acl public-read
Flimm

我最初使用的元数据的指令,使这项工作但最终改变的内容类型的对象VS只是增加--acl public-read
马特·冈特

24

要调整元数据(例如,对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 . -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)


7
这确实设置了我的缓存头,尽管它删除了我在文件上设置的“公共”权限(使它们在我的s3托管站点上不可见)。为了使文件公开,我必须使用运行命令--acl public-read
杰克逊

14

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

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

您如何对以后的上传进行这些更改?例如,当您通过s3 API或仅在Web控制台中手动上传文件时,将Cache-Control设置在文件夹/存储桶上
Andrei F

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 

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

您可以通过两种方式通过将HTTP PUT请求发送到具有适当头的Amazon S3服务器来为Amazon S3对象设置缓存控制自定义头:

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

有关更多信息,请检查如何为Amazon S3对象设置缓存控制标头?`


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

尽管请注意,您将重写任何现有对象。



0

另一个非常简单的方法是使用S3浏览器:http : //s3browser.com/您可以简单地通过单击click或ctrl + a来选择所需的所有图像。然后只需转到“ Http标头”标签,然后点击-“添加新标头”,然后单击“应用更改”。它会自动保留所有其他权限和标头。

如果您大量使用S3;无论如何,它都是一个不错的应用程序,特别是如果您上传的文件很多(在ftp,dropbox或其他方面没有比这更好的了!)


1
为什么要下票?OP说“ s3cmd或还有其他添加标题的方法” s3browser非常适合批量标题编辑;比AWS控制台Web界面更好。
Reece

1
我没有投票给你,但这是一个坏主意,因为它无法维持。每当有人添加新文件时(或尝试培训他们进行操作),您都必须手动执行此操作。更好的解决方案是“运行此脚本以上传文件”,并且它始终可以正常运行。无需手动干预和后续步骤。
瑞安·希灵顿

2
当有linux sftp命令时,为什么人们不愿意使用gui(s)ftp客户端(例如filezilla或cyberduck)?同样的坏主意吗?从理论上讲,您可以编写几乎任何具有现有GUI解决方案的软件解决方案。我想认为使它成为好主意的是使用的上下文。我发现s3浏览器是一个有用的工具,认为将它作为一个选项呈现出来并不有害。
Reece
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.