【问题标题】:how to add cache control in AWS S3?如何在 AWS S3 中添加缓存控制?
【发布时间】:2014-03-19 09:33:52
【问题描述】:

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

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

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 嗨,谢谢你的回复,我试过了,我得到了错误,比如 ERROR: Invalid command: u'modify'
    • @Rajaraman 你知道吗?在这一步之后,它显示访问被拒绝
    • 这有效.. 使用 s3cmd 版本 1.5.0-rc1 进行了测试,但是!:这会将对象的 Content-type 标头更改为“binary/octet-stream”!使用一个 PNG 文件进行测试。
    • 我遇到了和@Hardy 一样的问题。它还从我的所有文件中删除了公共可读性。小心。
    • 看来Content-Type 错误已用#406 修复。
    【解决方案2】:

    还有AWS自己的客户端:

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

    【讨论】:

    • 如果您从计算机上的本地路径上传到 AWS 并希望所有内容保持适当的缓存控制,则此方法有效
    • 这可以在初始同步时设置缓存头,但不会更新现有文件。您可以像这样强制更新find . -type f -exec touch '{}' \;; aws s3 sync /path s3://yourbucket/ --recursive --cache-control max-age=604800
    • OP 要求更新 S3 中的现有文件,而不是上传新文件
    • --recursive 还需要吗? CLI 文档似乎没有将其列为参数。 docs.aws.amazon.com/cli/latest/reference/s3/sync.html
    • @MattByrne 自 1.7.12 起必须省略 --recursive github.com/aws/aws-cli/blob/develop/CHANGELOG.rst#1712
    【解决方案3】:

    我的存储桶有 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 操作时:此复制请求是非法的,因为它试图将对象复制到自身而不更改对象的元数据、存储类、网站重定向位置或加密属性。”
    • 要修复它,我必须添加--metadata-directive REPLACE --acl public-read
    • 我最初使用元数据指令来完成这项工作,但最终改变了对象的内容类型而不是添加 --acl public-read
    【解决方案4】:

    要调整 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"
    

    &lt;bucket-name&gt;替换为您的存储桶名称

    警告:这将覆盖文件上的所有现有元数据,例如 acl,只需在命令中添加其他标志以设置您需要的内容,例如,--acl public-read 以提供完全的公共访问权限。 (感谢@jackson)

    【讨论】:

    • 这确实设置了我的缓存标头,尽管它删除了我对文件设置的“公共”权限(使它们在我的 s3 托管站点上不可见)。为了保持文件公开,我必须使用--acl public-read 运行命令。
    【解决方案5】:

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

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

    【讨论】:

    • 如何为以后的上传进行这些更改?例如,当您通过 s3 API 或仅在 Web 控制台中手动上传文件时,将 Cache-Control 设置保留在文件夹/存储桶上
    【解决方案6】:
    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=&lt;time for which you want your object to be accessed from cache in seconds&gt;”

    您可以通过两种方式向 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?`

    【讨论】:

      【解决方案7】:

      (因为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】:

        老实说,这是最好的 atm 方式,不会遇到其他答案中提到的错误:

        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】:

          只需将 s3cmd 升级到 1.5.1 版本即可解决问题。

          【讨论】:

            【解决方案10】:

            另一种非常简单的方法是使用 S3 浏览器:http://s3browser.com/ 您只需 shift click 或 ctrl+a 即可选择您想要的所有图像;然后只需转到“Http Headers”选项卡并单击 - “Add new header” & 然后“Apply changes”。它自动保留了我所有的其他权限和标题。

            如果你经常使用 S3;无论如何,它是一个很好的应用程序,尤其是如果你有大量的上传(在 ftp、Dropbox 或其他的世界里没有比这更好的了!)

            【讨论】:

            • 为什么投反对票? OP 说 's3cmd 或是否有任何其他方式来添加标题' s3browser 非常适合批量标题编辑;比 AWS 控制台 Web 界面好得多。
            • 我没有对你投反对票,但这是一个坏主意,因为它无法维护。每次有人添加新文件(或尝试训练他们这样做)时,您都必须手动执行此操作。一个更好的解决方案是“运行这个脚本来上传你的文件”,它总是能正常工作。无需人工干预和以下步骤。
            • 当有 linux sftp 命令时,为什么人们还要费心使用像 filezilla 或 cyberduck 这样的 gui (s)ftp 客户端?同样的坏主意?从理论上讲,您可以编写几乎任何现有 GUI 解决方案的软件解决方案。我想认为它是一个好主意还是坏主意的条件是使用的上下文。我发现 s3 浏览器是一个有用的工具,不要认为将它作为一个选项提供。
            猜你喜欢
            • 1970-01-01
            • 2021-03-25
            • 1970-01-01
            • 2023-04-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-17
            • 1970-01-01
            相关资源
            最近更新 更多