AWS S3 CLI CP 文件并添加元数据

AWS S3 CLI CP file and add metadata

正在尝试将名为 test.txt 的本地文件复制到我的 s3 存储桶并向该文件添加元数据。

但它总是打印错误:

argument --metadata-directive:无效选择,有效选择是:COPY |替换

是否可以使用 cp 命令执行此操作,据我了解文档应该可以。 AWS CLI CP DOCS

这是我试过的命令:

aws s3 cp test.txt to s3://a-bucket/test.txt --metadata x-amz-meta-cms-id:34533452

aws s3 cp test.txt to s3://a-bucket/test.txt --metadata-directive COPY --metadata x-amz-meta-cms-id:34533452

aws s3 cp test.txt to s3://a-bucket/test.txt --metadata-directive COPY --metadata '{"x-amz-meta-cms-id":"34533452"}'

aws s3 cp test.txt to s3://a-bucket/test.txt --metadata '{"x-amz-meta-cms-id":"34533452"}'

aws --version: aws-cli/1.9.7 Python/2.7.10 Darwin/16.1.0 botocore/1.3.7

OS: macOS Sierra 版本 10.12.1

编辑

值得一提的是,上传没有 --metadata 标志的文件也能正常工作。

嗯,我已经使用 aws s3 cp help 查看了我的 cli 版本的帮助 事实证明它没有将 --metadata 列为选项,正如上面给定 link 的文档那样。

如果运行旧版本的 aws cli

Use aws s3api put-object

如何将文件上传到存储桶并添加元数据:

aws s3api put-object --bucket a-bucket --key test.txt --body test.txt --metadata '{"x-amz-meta-cms-id":"34533452"}'

文档:AWS S3API DOCS

事实上,自 1.9.10

以来,已经添加了对元数据选项的支持

aws s3 Added support for custom metadata in cp, mv, and sync.

所以将你的 aws cli 升级到这个版本(或者更好到最新版本)- metadata 值需要是一个映射所以

aws s3 cp test.txt s3://a-bucket/test.txt --metadata '{"x-amz-meta-cms-id":"34533452"}'

元数据指令 "COPY" 选项存在错误。

aws s3api copy-object --bucket testkartik --copy-source testkartik/costs.csv --key costs.csv --metadata-directive "COPY" --metadata "SomeKey=SomeValue"

以下是使用 JQ 解决方法了解 cli 命令的三个步骤。

  1. 安装 JQ library 以使用命令行处理 json 元数据。
  2. 读取现有元数据。

    aws s3api head-object --bucket <bucket> --key <key> | jq '.Metadata' | jq --compact-output '. +{"new":"metadata", "another" : "metadata"}'

  3. 添加新元数据。

    aws s3api copy-object --bucket <bucket-name> --copy-source <bucket/key> --key <key> --metadata-directive "REPLACE" --metadata $(READ-THE-EXISTING-From-Step-2)

    一次完成命令。

    aws s3api copy-object --bucket <bucket-name> --copy-source <bucket/key> --key <key> --metadata-directive "REPLACE" --metadata $(aws s3api head-object --bucket <bucket> --key <key> | jq '.Metadata' | jq --compact-output '. +{"new":"metadata", "another" : "metadata"}')

安装 s3cmd 工具(免费)并像这样调用:

s3cmd modify --add-header x-amz-meta-foo:bar s3://<bucket>/<object>

With x-amz-meta-foo:bar header you will get foo as key and bar as value of that key.