2014-05-08 74 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末尾 –