Amazon S3 バケット間でオブジェクトをコピーする方法を教えてください。

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

Amazon Simple Storage Service (S3) バケットにある全オブジェクトを、別の S3 バケットに移動する必要があります。S3 バケット間でオブジェクトを移行するにはどうすればよいですか? 

簡単な説明

S3 バケット間でオブジェクトをコピーするには、以下の手順を実行します。

1.    新しい S3 バケットを作成します。

2.    AWS コマンドラインインターフェイス (AWS CLI) をインストールし設定します。

3.    S3 バケット間でオブジェクトをコピーします。

4.    オブジェクトが正しくコピーされていることを確認します。

5.    既存の API コールを、新しいバケット名に合わせて修正します。

同期プロセスのパフォーマンスを向上させるため、前出の作業を開始する前に、AWS CLI の同時実行性が高くなるよう調整してください。設定オプションの詳細については、「AWS CLI S3 Configuration」を参照してください。データ転送にかかる料金の詳細については、「Amazon S3 の料金」を参照してください。

S3 バケット内に (1000 万個のオブジェクトを超えるような) 大量のオブジェクトがあるは場合は、Amazon S3 インベントリのレポートAmazon CloudWatch メトリクスの使用をご検討ください。これらのレポートは、コピーされたオブジェクトの検証に要する、コストとパフォーマンスを最適化するのに役立ちます。また、異なるプレフィックスに合わせ sync コマンドを分割することで、S3 バケットのパフォーマンスを最適化することも可能です。ワークロードのパフォーマンスを最適化する方法の詳細については、「リクエスト率およびパフォーマンスのガイドライン」をご参照ください。

解決方法

新しい S3 バケットを作成します。

1.    Amazon S3 コンソールを開きます。

2.    [バケットを作成する] をクリックします。

3.    新規バケットのための DNS 準拠名を選択します。

4.    AWS リージョンを選択します。
: トラフィックがリージョンをまたぐことが原因となり、パフォーマンスに問題が生じるのを回避するため、新しいバケットはソースバケットと同じリージョンに作成することを推奨します。

5.    必要に応じて、[既存のバケットから設定をコピー] をクリックし、ソースバケットの設定をコピーします。

AWS コマンドラインインターフェイス (AWS CLI) をインストールおよび設定する

1.    AWS CLI をインストールします

2.    次のコマンドを実行し AWS CLI を設定します。

aws configure

3.    ご自身のアクセスキー (アクセスキー ID とシークレットアクセスキー) を入力します。

4.    [Enter] をクリックし、デフォルトリージョンとデフォルト出力オプションをスキップします。リージョンパラメータの詳細については、 Amazon S3 の AWS リージョンとエンドポイントを参照してください。
: AWS CLI の出力は JSON、text、あるいは table の形式ですが、全コマンドが、これらすべての出力タイプをサポートしているわけではありません。お客様が選択したフォーマットをコマンド出力がサポートしていない場合は、コマンドのデフォルトフォーマットが使用されます。詳細については、「AWS Command Line Interface からのコマンド出力の制御」をご参照ください。

S3 バケット間でオブジェクトをコピーする

1.    Amazon Simple Storage Service Glacier にアーカイブされた S3 オブジェクトがある場合は、Amazon S3 Glacier に格納されているオブジェクトをリストアします。

2.    次の sync コマンドを実行し、オブジェクトをソースバケットからターゲットバケットへコピーします。

aws s3 sync s3://SOURCE_BUCKET_NAME s3://NEW_BUCKET_NAME

: コマンドラインに、ご自身のターゲットおよびソースバケットの名前を書き込んでください。

sync コマンドは CopyObject API を使って、S3 バケット間のオブジェクトコピーを行います。sync コマンドは、ソースとターゲットのバケットをリストアップし、ソース側に存在しターゲット側にないバケットを特定します。またこのコマンドは、LastModified の日付がターゲットバケット内のものと異なる、ソースバケット内のオブジェクトも見つけだします。バージョンが更新されたバケットで sync コマンドを実行すると、現行バージョンのオブジェクトのみをコピーして、古いバージョンのものはコピーされません。デフォルトでは、オブジェクトのメタデータは保持されますが、AWS アカウントのアクセスコントロールリスト (ACL) だけは FULL_CONTROL に設定され、ACL に追加された内容は削除されます。この処理に失敗した場合は、コピー済みのオブジェクトを含めずに、再度 sync コマンドを実行してみてください。

オブジェクトが正しくコピーされたことを確認する

1.    次のコマンドを実行して、ソースとターゲットバケットの内容を確認します。

aws s3 ls --recursive s3://SOURCE_BUCKET_NAME --summarize > bucket-contents-source.txt
aws s3 ls --recursive s3://NEW_BUCKET_NAME --summarize > bucket-contents-new.txt

: コマンドラインに、ご自身のソースおよびターゲットバケットの名前を書き込んでください。

2.    AWS CLI ディレクトリにあるファイルに記録された出力情報を見て、ソースバケットとターゲットバケット内のオブジェクトを比較してください。次の出力例を参照してください。

$ aws s3 ls --recursive s3://BUCKETNAME --summarize
2017-11-20 21:17:39      15362 s3logo.png

  Total Objects: 1        Total Size: 15362

既存の API コールを新しいバケット名で書き換える

新しいバケット名が使用できるように、既存のアプリケーションやワークロードをすべて修正します。頻繁に書き込みを行う場合などに、ソースバケットとターゲットバケット間の不整合を処理するため、sync コマンドの実行が必要になる場合があります。