awscli s3:通过stdin上传

buk*_*zor 5 amazon-s3 amazon-web-services aws-cli

我想将一个tarball上传到s3而不会产生临时文件的成本(我们在磁盘上很低).使用其他实用程序,我将tar命令的输出传递给upload命令,但它不适用于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
Run Code Online (Sandbox Code Playgroud)

有什么办法可以做我想要的吗?

Mik*_*ell 16

这应该做的伎俩:

tar cv aws-test|aws s3 cp - s3://bucket/aws-test.tar.gz
Run Code Online (Sandbox Code Playgroud)

编辑:确保您使用的是aws cli的较新版本.我已经验证它适用于1.7.3并且它不适用于1.2.9

请注意,如果文件超过5GB,则应使用以下字节传递文件大小的估计值expected-size,例如:

tar cv /home/folder | gzip | s3 cp --expected-size=1234567890 - s3://bucket/folder.tar.gz
Run Code Online (Sandbox Code Playgroud)

来源:s3 cp参考文档

  • 这在http://docs.aws.amazon.com/cli/latest/reference/s3/cp.html结尾处有记载. (3认同)

buk*_*zor 7

这个简单的脚本似乎做的工作,但我太多,而没有创造我自己的这个工具.

#!/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}"
Run Code Online (Sandbox Code Playgroud)

  • 尽管如此,这仍然是一些非常好的黑客技术。完成工作+1。对于非分段上传,它最多只能达到 5GB 的限制。 (2认同)