高速なs3バケット複製


93

私はs3cmdよりもバケットを複製するためのより良いコマンドラインツールを見つけようとしています。 s3cmd各ファイルをダウンロードしてアップロードしなくてもバケットを複製できます。s3cmdを使用してバケットを複製するために通常実行するコマンドは次のとおりです。

s3cmd cp -r --acl-public s3://bucket1 s3://bucket2

これは機能しますが、APIを介して各ファイルを1つずつコピーするため、非常に低速です。場合s3cmd並列モードで実行することができ、私はとても幸せに思います。

より高速なバケットを複製するためにコマンドラインツールまたはコードとして使用できる他のオプションはありますs3cmdか?

編集:s3cmd-modificationがまさに私が探しているもののようです。残念ながらうまくいきません。他のオプションはありますか?


6
多くの開発者がそれに遭遇したように見えるので、なぜこの質問が繰り返し閉じられているのかわかりません。とにかく、私は非常に並行してそれを解決しました、ここにリンクがあります:github.com/cobbzilla/s3s3mirror ありがとう!-ジョナサン。
cobbzilla 2013年

回答:


166

AWS CLIは完全にその仕事をするようであり、公式にサポートされているツールであることのボーナスがあります。

aws s3 sync s3://mybucket s3://backup-mybucket

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

デフォルトで同時転送をサポートします。http://docs.aws.amazon.com/cli/latest/topic/s3-config.html#max-concurrent-requestsを参照してください

多数の小さなファイルをすばやく転送するには、EC2インスタンスからスクリプトを実行してレイテンシmax_concurrent_requestsを減らし、レイテンシの影響を減らすために増やします。例えば:

aws configure set default.s3.max_concurrent_requests 200

4
ファイルの変更時刻、サイズなどに基づいた非同時同期をサポートします。私が試したとき、それは非常に高速でした。オブジェクトはローカルマシンにダウンロードせずにS3に直接コピーされると思います。デフォルトでは並行して実行されませんが、複数の同期コマンドを別々のサブフォルダーで同時に実行できると思います。とにかく並列処理を必要としないほど高速です。数分で100GBのデータを複製しました。
python1981

10
ファイルの数が多い場合は、地獄のように遅くなります。
フオングエン

14
多くの小さなファイルを転送する場合、レイテンシが重要な制約になるため、EC2インスタンスからこのコマンドを実行することが不可欠です。
python1981

1
私はこれを使ってドッカーを構築し、かなりうまくいきましたgithub.com/sunshineo/s3-bucket-copier
Gordon Sun

3
今では、同時同期:-)サポートしていますdocs.aws.amazon.com/cli/latest/topic/...
python1981

70

AWSコンソールを使用してもかまわない場合は、次のことができます。

  1. 最初のバケット内のすべてのファイル/フォルダーを選択します
  2. [アクション]> [コピー]をクリックします
  3. 新しいバケットを作成して選択します
  4. [アクション]> [貼り付け]をクリックします

それはまだかなり遅いですが、あなたはそれをそのままにして、それをその仕事に任せることができます。


これは、宛先にコピーするときに、ソースバケットの内容を自分のマシンにコピーしていますか?多くのネットワークアクティビティがあり、ブラウザインスペクタの速度が非常に遅いため、分析が困難です。私のマシンでは600K / s。そうすれば、amazonネットワーク内での転送の開始がはるかに速くなります...代わりにそこで試すことになります。
ブラッドゴス2013

9
今日はこの方法を使いました。ファイルをローカルマシンにダウンロードするのではなく、直接コピーを実行するため、はるかに高速です。
グレッグベネディクト

7
それでもファイルリストを取得します。リストが長すぎる場合(私の場合は数十万のファイル)、それはひどく遅いです。タイムアウト/ハングが非常に可能性がある
フオングエン

13
残念ながら、このプロセスはブラウザに関連付けられています。:( ドキュメントから: "コピープロセスを開始した後、コピーの進行中はブラウザを開いたままにしておく必要があります。"
David Lemayian

4
800万のファイルが含まれているバケットでこれを実行しようとしています。すべてのチェックボックスを選択するのに何カ月かかるかわからない...
Chris Harrison

27

AWSウェブコンソールを使用して2つのバケット、s3cmdおよびAWS CLI を複製してみました。これらの方法はほとんどの場合機能しますが、非常に遅くなります。

次にs3s3mirror、2つのS3バケットを同期するための専用ツールが見つかりました。それはマルチスレッドで、私が試した他のアプローチよりもはるかに高速です。ギガバイトのデータをAWSリージョン間ですばやく移動しました。

https://github.com/cobbzilla/s3s3mirrorで確認するか、https: //registry.hub.docker.com/u/pmoust/s3s3mirror/からDockerコンテナーをダウンロードしてください。


1
転送するファイルがたくさんある場合、これは断然最適なツールです。残念なことに、これは答えのリストのはるか下にあります...
John Chrysostom

一部の人への注意:コンパイルするにはJava 6/7が必要です。
ブライアン

1
私はこれをEC2インスタンスから使用しており、信じられないほど高速に動作します!<source-bucket>と<destination-bucket>を実際のバケット名(エンドポイントやAWS CLIのようなものではない)に置き換える必要がありました。
鉄マウス2017年

1
多数のファイルに対して、他のツールよりも強く推奨される素晴らしいツール。コピースレッド数の制御は素晴らしいです。
Shaunak 2018

サードパーティ製のアプリケーションではなく、aws-cliを使用するほうが安全だと思いませんか?結局、これらのツールを使用するには、資格情報またはアクセスキーを提供する必要があります。
キートスガタダサ

10

アドホックソリューションの場合aws cli、バケット間の同期に使用します。

aws s3 sync速度は以下に依存します。
-S3エンドポイントへのAPI呼び出しのレイテンシ
-同時に行われたAPI呼び出しの量

同期速度を上げるために:
-実行aws s3 syncAWSインスタンス(FreeBSD上でc3.largeはOKです;-))から
-更新〜/ .aws /設定と:
- max_concurrent_requests = 128
-max_queue_size = 8096

次の構成とインスタンスタイプを使用して、バケット(309GB、72Kファイル、us-east-1)を474秒以内に同期できました。

より一般的なソリューションについては、AWS DataPipeLineまたはS3クロスリージョンレプリケーションを検討してください。


S3 cpを使用した場合に同じパフォーマンスが期待できるかどうか知っていますか?同期を使用したときに、実際にすべての309GBが転送されたことに確信がありますか?syncは、同じでないか、他のバケットに存在するファイルのみを同期します。
凍りつくような

また、私が1k以下のファイルを持っているが、サイズが大きい(10GB)場合の使用例について、これについてどう思いますか?私と同じようなパフォーマンスが見られると思いますか?
凍りつくような

@frosty、私の場合、宛先バケットは空でした。awscliドキュメントごと- aws sync新しいファイルと更新されたファイルのみをコピーします。おそらく高いパフォーマンスが期待できますaws cp(コピーは内部で行われ、クライアントはAPI呼び出しを発行するだけです)。パフォーマンスはこれらの要因に依存します。1. srcとdstリージョン間のレイテンシ(例:us-east-Xからus-west-X)2.クライアントとAWS APIエンドポイント間のレイテンシ(API呼び出しを発行できる速さ)3。同時リクエストの量(クライアントが1秒間に発行できるリクエストの数)。私の場合、309Gは同じリージョン(us-east-1)のバケット間でコピーされました
Tom Lime

3

これは、この主題に関するGoogleの最初のヒットに関するものであるため、追加情報を追加します。

'Cyno'は、新しいバージョンのs3cmd-modificationを作成しました。これにより、バケット間の同期が並列にサポートされるようになりました。まさに私が待っていたもの。

プルリクエストはhttps://github.com/pcorliss/s3cmd-modification/pull/2にあり、彼のバージョンはhttps://github.com/pearltrees/s3cmd-modificationにあります


s3cmd-modificationを使用すると、コピーする日を節約できました。
2013

2

他のS3コマンドラインツールについては知りませんが、ここで何も表示されない場合は、独自に作成するのが最も簡単です。

好きな言語とAmazon SDK / Toolkitを選択してください。次に、ソースバケットの内容を一覧表示/取得し、各ファイルをコピーするだけです(明らかに並列処理)。

s3cmd-modificationのソースを見ると(私はpythonについて何も知らないと認めています)、バケット間コードを並列化していないようですが、開始点として標準のアップロード/ダウンロード並列コードを使用できます。これを行う。


うん。私はこのアイデアをいじって、イベントマシンでイベント方式で、またはJRubyでスレッド化してルビーで書いています。ただし、s3cmdはすでにかなり完成しているので、それを使用するだけです。私はs3cmdの開発者と話していましたが、彼はパイプラインにパフォーマンスの問題に対処する可能性が高いいくつかのソリューションを持っています。
Sean McCleary、2011年

1

単純な方法aws s3 cp s3://[original-bucket] s3://[backup-bucket] --recursiveがうまく機能します(aws cliのセットアップがある場合)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.