Amazon Simple Storage Service (Amazon S3) バケットにあるすべてのオブジェクトを、別のバケットにコピーまたは移動したいです。
簡単な説明
ある S3 バケットから別のバケットにオブジェクトをコピーするには、次のいずれかの手順を実行します。
- AWS コマンドラインインターフェイス (AWS CLI) から sync コマンドを実行する
- 多数のオブジェクトを含むバケットに S3 バッチ操作を使用する
sync コマンドは、それほど大きくないバケットに適しています。ただし、sync コマンドを実行して数百万のオブジェクトを含む大きなバケットをコピーすると、高いコストがかかり、コピー操作がタイムアウトする可能性があります。バケットをコピーするときにタイムアウトが発生した場合は、Amazon CloudWatch メトリクスを使用してバケット内のオブジェクトのサイズと数を計算します。S3 バケットに数百万のオブジェクトがある場合は、S3 バッチ操作を使用してオブジェクトをコピーするのがベストプラクティスです。
注: AWS Identity and Access Management (IAM) を使用してクロスアカウントアクセス許可を設定し、バケットから別の AWS アカウントが所有するバケットにオブジェクトをコピーします。IAM ロールには、ソースオブジェクトに対する s3:GetObjectTagging アクセス許可および、宛先オブジェクトに対する s3:PutObjectTagging アクセス許可が必要です。
同期のパフォーマンスを向上させ、オブジェクトのコピーを高速化するには、次のうち 1 つ以上を実行します。
解決策
注: AWS CLI のコマンドの実行時にエラーが発生する場合は、「AWS CLI でのエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
S3 バケット間でオブジェクトをコピーする
あるバケットから別のバケットにオブジェクトをコピーするには、次の手順を実行します。
-
S3 オブジェクトを Amazon Simple Storage Service Glacier ストレージクラスにアーカイブした場合は、オブジェクトを復元します。
-
次の sync コマンドを実行します。example_source_bucket と example_target_bucket は、実際の S3 バケット名に置き換えてください。
aws s3 sync s3://example_source_bucket s3://example_target_bucket
注: sync コマンドは、宛先バケットにまだないオブジェクトのみをコピーします。すべてのオブジェクトを明示的にコピーするには、sync コマンドではなく、cp コマンドを使用します。バージョン管理されたバケットで sync コマンドを使用すると、各オブジェクトの現在のバージョンのみがコピーされます。デフォルトでは、この動作ではオブジェクトメタデータが保持されます。
-
(オプション) タイムアウトが発生した場合は、CloudWatch の get-metric-statistics コマンドを使用して、バケットのサイズとオブジェクト数を計算します。
バケットのサイズを計算するには、次のコマンドを実行します。
aws cloudwatch get-metric-statistics --namespace AWS/S3 --metric-name BucketSizeBytes --dimensions Name=BucketName,Value=example_source_bucket Name=StorageType,Value=StandardStorage --start-time 2021-05-11T00:00 --end-time 2021-05-11T00:10 --period 3600 --statistics Average --unit Bytes --output json
バケット内のオブジェクト数を計算するには、次のコマンドを実行します。
aws cloudwatch get-metric-statistics --namespace AWS/S3 --metric-name NumberOfObjects --dimensions Name=BucketName,Value=example_source_bucket Name=StorageType,Value=AllStorageTypes --start-time 2021-05-11T00:00 --end-time 2021-05-11T00:10 --period 600 --statistic Average --output json
バケットサイズが大きく、数百万のオブジェクトが含まれている場合は、sync コマンドを使用しないでください。代わりに、バケットをコピーするときは S3 バッチ操作を使用してください。
重要: sync コマンドを実行しても、アクセスコントロールリスト (ACL) はソースバケットから宛先バケットにコピーされません。ソースバケットとターゲットバケットの両方で ACL が有効になっている場合、宛先オブジェクトの ACL により、コピーを実行したアカウントに FULL_CONTROL が付与されます。sync コマンドに関する問題のトラブルシューティングについては、「2 つの Amazon S3 バケット間でオブジェクトをコピーできない理由を知りたいです」を参照してください。
オブジェクトがコピーされたことを確認する
オブジェクトがコピーされたことを確認するには、次の手順を実行します。
- 次の ls コマンドを実行して、ソースバケットとターゲットバケットの内容を確認します。
aws s3 ls --recursive s3://example_source_bucket --summarize > bucket-contents-source.txt
aws s3 ls --recursive s3://example_target_bucket --summarize > bucket-contents-target.txt
注: ls コマンドは、バケットが大きいとタイムアウトすることがあります。バケットが大きい場合は、ls コマンドではなく、CloudWatch メトリクスを使用すると、バケットのサイズとオブジェクトの総数を計算できます。ただし、Amazon CloudWatch メトリクスは 1 日に 1 回しか取得されないため、CloudWatch の結果は ls コマンドの結果と異なる場合があります。
- 上記の ls コマンドで出力されたテキストファイルを使用して、ソースバケットとターゲットバケットのオブジェクトを比較します。出力は次の例のようになります。
2017-11-20 21:17:39 15362 s3logo.png
Total Objects: 1 Total Size: 15362
注: ソースバケットに API コールを行うアプリケーションまたはワークロードがある場合は、それらの API コールをターゲットバケットを対象として更新します。書き込みを頻繁に行う場合は、ソースバケットとターゲットバケット間の不一致に対処するために sync コマンドを実行しなければならない場合があります。
関連情報
Amazon S3 の料金
ディレクトリバケットにオブジェクトをコピーする
Amazon S3 で大量の削除を実行した後に、list コマンドが応答しない場合のトラブルシューティング方法を教えてください
別の AWS アカウントから Amazon S3 オブジェクトをコピーする方法を教えてください