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] をクリックし、デフォルトリージョンとデフォルト出力オプションをスキップします。リージョンに関するパラメータの詳細は、「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 コマンドの実行が必要になる場合があります。