2014-05-08 73 views
3

我想上传一个tarball到s3而不会产生临时文件的费用(我们在磁盘上很低)。其他实用程序,我会管tar命令上传命令的输出,但它不只是awscli工作:awscli s3:通过stdin上传

$ echo ok | aws s3 cp /dev/stdin s3://my-bucket/test 
upload failed: /dev/stdin to s3://my-bucket/test [Errno 29] Illegal seek 

有没有办法做我想要什么?

+0

我推出了自己的工具,该工具读取'STDIN'并执行分段上传,因为找不到我喜欢的解决方案。你有没有用fifo试过aws工具? –

回答

4

这个简单的脚本似乎做的工作,但我会而不是创造我自己的工具。

#!/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}" 
+0

不过,这是一些非常不错的hackery。 +1完成工作。它只能处理非多部分上传的5GB限制。 –

13

这应该做的伎俩:

tar cv aws-test|aws s3 cp - s3://bucket/aws-test.tar.gz 

编辑:请确保您使用的AWS CLI更新verison。我已经验证它可以与1.7.3兼容,但它不适用于1.2.9

+2

这是记录在http://docs.aws.amazon.com/cli/latest/reference/s3/cp.html末尾 –