我想将 tarball 上传到 s3 而不会产生临时文件的成本(我们的磁盘空间不足)。使用其他实用程序,我会将 tar 命令的输出通过管道传输到上传命令,但它不仅仅适用于 awscli:
$ echo ok | aws s3 cp /dev/stdin s3://my-bucket/test
upload failed: /dev/stdin to s3://my-bucket/test [Errno 29] Illegal seek
有什么办法可以做我想做的事吗?
我想将 tarball 上传到 s3 而不会产生临时文件的成本(我们的磁盘空间不足)。使用其他实用程序,我会将 tar 命令的输出通过管道传输到上传命令,但它不仅仅适用于 awscli:
$ echo ok | aws s3 cp /dev/stdin s3://my-bucket/test
upload failed: /dev/stdin to s3://my-bucket/test [Errno 29] Illegal seek
有什么办法可以做我想做的事吗?
这应该可以解决问题:
tar cv aws-test|aws s3 cp - s3://bucket/aws-test.tar.gz
编辑:确保您使用的是 aws cli 的更新版本。我已验证它适用于 1.7.3,但不适用于 1.2.9
请注意,如果文件超过 50GB,您应该使用 传递文件大小的估计值(以字节为单位expected-size
),例如:
tar cv /home/folder | gzip | s3 cp --expected-size=1234567890 - s3://bucket/folder.tar.gz
来源:s3 cp 参考文档
这个简单的脚本似乎可以完成这项工作,但我宁愿不为此发明自己的工具。
#!/bin/bash
configfile="aws.ini"
file="/test"
bucket="my-bucket"
resource="/${bucket}${file}"
contentType="application/x-compressed-tar"
# Grab the config values
eval $(cat aws.ini | grep -P "^\w+=[-'/\w]+$")
# Calculate the signature.
dateValue=$(date -R)
stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}"
signature=$(
echo -en "${stringToSign}" |
openssl sha1 -hmac "${aws_secret_access_key}" -binary |
base64
)
# PUT!
curl \
-X PUT \
--data @- \
-H "Host: ${bucket}.s3.amazonaws.com" \
-H "Date: ${dateValue}" \
-H "Content-Type: ${contentType}" \
-H "Authorization: AWS ${aws_access_key_id}:${signature}" \
"https://${bucket}.s3.amazonaws.com${file}"