Amazon S3 バケット間で大量のデータを転送する最善の方法は何ですか ?

最終更新日: 2019 年 12 月 16 日

Amazon Simple Storage Service (Amazon S3) バケットから別のバケットに大量のデータ (1 TB 以上) を転送したいと考えています。どうすればよいですか? 

簡単な説明

ユースケースに応じて、次のいずれかのオプションを使用してバケット間のデータ転送を実行できます。

  • AWS コマンドラインインターフェイス (AWS CLI) を使用して並列アップロードを実行する
  • AWS SDK を使用する
  • クロスリージョンレプリケーションまたは同一リージョンレプリケーションを使用する
  • Amazon S3 バッチオペレーションを使用する
  • Amazon EMR で S3DistCp を使用する

解決方法

AWS CLI を使用して並列アップロードを実行する

注意 : ベストプラクティスのために、AWS CLI の最新バージョンを使用していることを確認してください。詳細については、AWS CLI のインストールを参照してください。

転送を相互に排他的な複数のオペレーションに分割することによって、マルチスレッドで転送時間を短縮できます。例えば、AWS CLI を使用して、aws s3 cpaws s3 mv、 または aws s3 sync の複数の並列インスタンスを実行できます。AWS CLI の各インスタンスに対して --exclude および --include パラメータを使用しながら、より多くのアップロードスレッドを作成できます。これらのパラメータは、ファイル名でオペレーションをフィルタリングします。

注意 : --exclude および --include パラメータは、クライアント側で処理されます。このため、ローカルマシンのリソースがオペレーションのパフォーマンスに影響を与える可能性があります。

例えば、すべてのファイル名が数字で始まるバケット間で大量のデータをコピーするには、AWS CLI の 2 つのインスタンスで次のコマンドを実行します。まず、このコマンドを実行して、名前が 0~4 で始まるファイルをコピーします。

aws s3 cp s3://source-awsexamplebucket/ s3://destination-awsexamplebucket/ --recursive --exclude "*" --include "0*" --include "1*" --include "2*" --include "3*" --include "4*"

次に、このコマンドを実行して、名前が 5~9 で始まるファイルをコピーします。

aws s3 cp s3://source-awsexamplebucket/ s3://destination-awsexamplebucket/ --recursive --exclude "*" --include "5*" --include "6*" --include "7*" --include "8*" --include "9*"

さらに、次の AWS CLI 設定をカスタマイズして、データ転送を高速化できます。

  • multipart_chunksize : この値で、単一ファイルのマルチパートアップロードで AWS CLI がアップロードする各パートのサイズを設定します。この設定では、大きなファイル (300 MB など) を小さなパートに分割して、アップロードを高速化できます。
    注意 : マルチパートアップロードでは、1 つのファイルを 10,000 以下の分割ファイルでアップロードする必要があります。設定したチャンクサイズが、分割ファイルのサイズとパート数のバランスを取っていることを確認する必要があります。
  • max_concurrent_requests : この値で、Amazon S3 に一度に送信できるリクエストの数を設定します。デフォルト値は 10 です。50 のような高い値に増やすことができます。
    注意 : より多くのスレッドを実行すると、マシンのリソースもその分多く消費されます。同時リクエストの最大量をサポートするために十分なリソースがマシンにあることを確認する必要があります。

AWS SDK を使用する

AWS SDK を使用して、大量のオブジェクトに対してデータ転送を実行するためのカスタムアプリケーションを構築することを検討します。AWS CLI はコピーオペレーションを実行できますが、数億のオブジェクトというような規模で転送を実行するには、カスタムアプリケーションの方がより効率的である可能性があります。

クロスリージョンレプリケーションまたは同一リージョンレプリケーションを使用する

レプリケート元バケットで クロスリージョンレプリケーション (CRR) または同一リージョンレプリケーション (SRR) を設定すると、Amazon S3 はソースバケットから送信先パケットに、新しいオブジェクトを自動的かつ非同期的にレプリケートします。プレフィックスまたはタグを使用して、レプリケートされるオブジェクトをフィルタリングすることを選択できます。レプリケーション設定とフィルタ指定の詳細については、レプリケーション設定の概要を参照してください。

レプリケーションが設定されると、新しいオブジェクトのみがレプリケート先バケットにレプリケートされます。レプリケート先バケットに、既存のオブジェクトはレプリケートされません。既存のオブジェクトをレプリケートするには、レプリケート元バケットでレプリケーションを設定した後、次の cp コマンドを実行します。

aws s3 cp s3://source-awsexamplebucket s3://source-awsexamplebucket --recursive --storage-class STANDARD

このコマンドは、ソースバケットのオブジェクトをソースパケットにコピーします。これにより、送信先パケットに対するレプリケーションをトリガーします。

注意 : 実稼働環境以外で cp コマンドをテストすることがベストプラクティスです。これにより、実際のユースケースに合わせてパラメータを設定できます。

Amazon S3 バッチオペレーションを使用する

Amazon S3 のバッチオペレーションを使用することで、単一のリクエストで複数のオブジェクトをコピーできます。バッチオペレーションジョブを作成するときは、Amazon S3 インベントリレポートまたは CSV ファイルを使用して、オペレーションを実行するオブジェクトを指定します。次に、Amazon S3 バッチオペレーションが API を呼び出してオペレーションを実行します。

バッチオペレーションジョブが完了すると、通知が届きます。そして、ジョブに関する完了レポートを受け取ることを選択できます。

Amazon EMR で S3DistCp を使用する

Amazon EMR の S3DistCp オペレーションでは、Amazon S3 バケット間で大量のオブジェクトの並列コピーを実行できます。S3DistCp はまず、ソースバケットから Amazon EMR クラスターのワーカーノードにファイルをコピーします。次に、オペレーションがワーカーノードから送信先バケットにファイルを書き込みます。S3DistCp の使用に関する詳細なガイダンスについては、 Amazon EMR で S3DistCp を使用して HDFS と Amazon S3 間で効率的にデータを移動するための 7 つのヒントを参照してください。

重要 : このオプションでは Amazon EMR を使用する必要があるため、Amazon EMR の料金を確認してください。


この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合