7

一時ファイルのコストを発生させずに 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

私がやりたいことをする方法はありますか?

4

2 に答える 2

26

これでうまくいくはずです:

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 リファレンス ドキュメント

于 2015-01-25T18:05:08.103 に答える
6

この単純なスクリプトで十分に機能しているように見えますが、このための独自のツールを発明したくはありません。

#!/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}"
于 2014-05-08T23:52:06.650 に答える