web-dev-qa-db-ja.com

awscliを使用して中断されたs3ダウンロードを再開する

私はawscliを使用してファイルをダウンロードしていました:

$ aws s3 cp s3://mybucket/myfile myfile

しかし、ダウンロードは中断されました(コンピューターがスリープ状態になりました)。ダウンロードを続行するにはどうすればよいですか? S3はRangeヘッダーをサポートしていますが、awscli s3 cpでは指定できません。

ファイルは一般公開されていないため、curlを使用して手動でヘッダーを指定することはできません。

13
hraban

S3への低レベルアクセスを許可するawscliツールに「非表示」コマンドがあります:s3api。†ユーザーフレンドリーではありません(s3:// URLもプログレスバーもありません)が、範囲指定子をサポートしていますget-object

   --range  (string) Downloads the specified range bytes of an object. For
   more   information   about   the   HTTP    range    header,    go    to
   http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.

ダウンロードを続行する方法は次のとおりです。

$ size=$(stat -f%z myfile) # assumes OS X. Change for your OS
$ aws s3api get-object \
            --bucket mybucket \
            --key myfile \
            --range "bytes=$size-" \
            /dev/fd/3 3>>myfile

基本的な進行状況バーには pv を使用できます。

$ aws s3api get-object \
            --bucket mybucket \
            --key myfile \
            --range "bytes=$size-" \
            /dev/fd/3 3>&1 >&2 | pv >> myfile

(この名前のないパイプrigmaroleの理由は、s3apiが操作の最後にstdoutにデバッグメッセージを書き込み、ファイルを汚染するためです。このソリューションはstdoutをstderrに再バインドし、エイリアスを介して通常のファイルコンテンツ用にパイプを解放します。 pvは技術的にはstderr(/dev/fd/2および2>)に書き込むことができますが、エラーが発生した場合、s3apiはstderrに書き込み、ファイルに追加されます。したがって、そこでも専用パイプを使用してください。)

†Git Speakでは、s3は磁器、s3apiは配管です。

9
hraban

使用する - s3cmd--continue関数が組み込まれています。例:

# Start a download
> s3cmd get s3://yourbucket/yourfile ./
download: 's3://yourbucket/yourfile' -> './yourfile' [1 of 1]
    123456789 of 987654321     12.5% in 235s   0.5 MB/s

[ctrl-c] interrupt

# Pick up where you left off
> s3cmd --continue get s3://yourbucket/yourfile ./
2
David Parks