ひとつの Amazon S3 バケットから別のバケットにすべてのオブジェクトをコピーするにはどうすればよいですか。

最終更新日: 2022 年 1 月 7 日

Amazon Simple Storage Service (Amazon S3) バケットにある全オブジェクトを、別のバケットにコピーもしくは移動したいと考えています。S3 バケット間でオブジェクトを移行するにはどうすればよいですか?

簡単な説明

ある S3 バケットから別のバケットにオブジェクトをコピーするには、以下のステップに従います。

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

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

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

注: aws s3 ls または aws s3 sync コマンドを (1,000 万個以上のオブジェクトがある) 大きなバケットで使用すると、コストがかかり、タイムアウトが発生する可能性があります。バケットが大きいためにタイムアウトが発生した場合は、Amazon CloudWatch メトリクスを使用して、バケット内のオブジェクトのサイズと数を計算することを検討してください。また、S3 Batch Operations を使ってオブジェクトをコピーすることも検討してください。

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

5.    既存の API 呼び出しをターゲットバケット名で書き換えます。

この作業を開始する前に、以下を考慮してください。

解決方法

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

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

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

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

4.    使用している AWS リージョンを選択します。

ヒント: クロスリージョンのトラフィックによって引き起こされるパフォーマンスの問題を回避するには、ターゲットバケットをソースバケットと同じリージョンに作成します。

5.    オプションで、[Copy settings from an existing bucket] (既存のバケットから設定をコピー) をクリックし、ソースバケットの設定をコピーします。

AWS CLI をインストールおよび設定する

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

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

aws configure

注: AWS CLI コマンドの実行中にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください

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

4.    Enter を押して、デフォルトのリージョンオプションとデフォルトの出力オプションをスキップします。Amazon S3 リージョンのパラメータの詳細については、「AWS service endpoints」 (AWS のサービスエンドポイント) を参照してください。

注: AWS CLI の出力は JSON、text、あるいは table の形式ですが、全コマンドが、これらすべての出力タイプをサポートしているわけではありません。詳細については、「AWS CLI からのコマンド出力の制御」を参照してください。

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

1.    Amazon Simple Storage Service Glacier ストレージクラスに S3 オブジェクトをアーカイブしている場合は、オブジェクトを復元します。

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

aws s3 sync s3://DOC-EXAMPLE-BUCKET-SOURCE s3://DOC-EXAMPLE-BUCKET-TARGET

注: この syncコマンド内のソースおよびターゲットバケットの名前は、ご自身のものに置き換えてください。

sync コマンドでは、CopyObject API を使用しながら S3 バケット間でのオブジェクトのコピーを実行します。sync コマンドは、ソースとターゲットのバケットをリストアップし、ソース側に存在しターゲット側にないバケットを特定します。また、このコマンドは、LastModified の日付がターゲットバケット内のものと異なる、ソースバケット内のオブジェクトも識別します。バージョンが更新されたバケットで sync コマンドを実行した場合は、現行バージョンのオブジェクトのみがコピーされ、古いバージョンのものはコピーされません。デフォルトでは、この動作はオブジェクトメタデータを保持します。

レプリケート元バケットでアクセスコントロールリスト (ACL) が有効になっている場合、ACL はレプリケート先バケットにコピーされません。これは、ACL がレプリケート先バケットで有効になっているかどうかに関係なく当てはまります。レプリケート元バケットとレプリケート先バケットの両方で ACL が有効になっている場合、コピー先オブジェクト ACL はコピーを実行したアカウントに FULL_CONTROL を付与します。このオペレーションが失敗した場合には、sync コマンドをもう一度実行できます。また、以前にコピーされたオブジェクトは複製されません。sync オペレーションに関する問題のトラブルシューティングについては、「2 つの Amazon S3 バケット間でオブジェクトをコピーできないのはなぜですか。」を参照してください。

3.    (オプション) タイムアウトが発生した場合は、cloudwatch get-metric-statistics コマンドを使用して、バケット内のオブジェクト数をカウントします。

$ aws cloudwatch get-metric-statistics --namespace AWS/S3 --metric-name NumberOfObjects --dimensions Name=BucketName,Value=DOC-EXAMPLE-BUCKET-SOURCE Name=StorageType,Value=AllStorageTypes --start-time 2021-05-11T00:00 --end-time 2021-05-11T00:10 --period 600 --statistic Average --output json

4.    (オプション) タイムアウトが発生した場合は、cloudwatch get-metric-statistics コマンドを使用してバケットサイズを取得します。

$ aws cloudwatch get-metric-statistics --namespace AWS/S3 --metric-name BucketSizeBytes --dimensions Name=BucketName,Value=DOC-EXAMPLE-BUCKET-SOURCE Name=StorageType,Value=StandardStorage --start-time 2021-05-11T00:00 --end-time 2021-05-11T00:10 --period 3600 --statistics Average --unit Bytes --output json

注: Listcalls は処理量が非常に多くなり得るので、コマンドのタイムアウトの原因になります。バケットが大きい場合は、Amazon CloudWatch メトリクスを使用して、バケットのサイズとオブジェクトの総数を計算することを検討してください。ただし、Amazon CloudWatch メトリクスが取得されるのは 1 日に 1 度だけであるため、これによりレポートされるオブジェクト数とバケットサイズが、list コマンドの結果と異なる場合があります。

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

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

aws s3 ls --recursive s3://DOC-EXAMPLE-BUCKET-SOURCE --summarize > bucket-contents-source.txt
        
aws s3 ls --recursive s3://DOC-EXAMPLE-BUCKET-TARGET --summarize > bucket-contents-target.txt

注: この list コマンド内のソースおよびターゲットバケットの名前は、ご自身のものに置き換えてください。

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

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

  Total Objects: 1        Total Size: 15362

既存の API 呼び出しを新しいバケット名で書き換える

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