ひとつの 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 の使用も、オブジェクトをコピーするための 1 つの方法です。
4. オブジェクトが正しくコピーされていることを確認します。
5. 既存の API 呼び出しをターゲットバケット名で書き換えます。
この作業を開始する前に、以下を考慮してください。
- S3 バケットに (1,000 万個を超える) 多数のオブジェクトがある場合は、S3 Batch Operations の使用をご検討ください。S3 Batch Operations を使用すると、コピープロセスの自動化が行えます。
- オブジェクトのコピーを AWS アカウント間で実行する場合には、バケットおよび関連する AWS Identity and Access Management (IAM) ロールに対して、適切なクロスアカウントのアクセス許可を設定します。
- AWS CLI バージョン 2 を使用してバケット間でオブジェクトをコピーする場合は、IAM ロールにも適切なアクセス許可が必要です。IAM ロールがソースオブジェクトの s3:GetObjectTagging、およびターゲットオブジェクトの s3:PutObjectTagging にアクセスできることを確認します。
- 同期プロセスのパフォーマンスを向上させるには、AWS CLI を調整して、より高い一致を使用します。また、異なるプレフィックスに合わせ sync コマンドを分割することで、S3 バケットのパフォーマンスを最適化することも可能です。ワークロードのパフォーマンスの最適化の詳細については、ベストプラクティスの設計パターン: Amazon S3 パフォーマンスの最適化をご参照ください。
解決方法
新しい S3 バケットを作成します。
1. Amazon S3 コンソールを開きます。
2. [バケットを作成する] をクリックします。
3. 新規バケットのための DNS 準拠名を選択します。
4. 使用している AWS リージョンを選択します。
ヒント: クロスリージョンのトラフィックによって引き起こされるパフォーマンスの問題を回避するには、ターゲットバケットをソースバケットと同じリージョンに作成します。
5. オプションで、[Copy settings from an existing bucket] (既存のバケットから設定をコピー) をクリックし、ソースバケットの設定をコピーします。
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 コマンドラインインターフェイスからのコマンド出力の制御をご参照ください。
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 コマンドを実行することが必要になる場合があります。