Amazon S3 バケットのすべてのオブジェクトを別のバケットにコピーする方法を教えてください。
Amazon Simple Storage Service (Amazon S3) バケットにあるすべてのオブジェクトを、別のバケットにコピーまたは移動しようと考えています。S3 バケット間でオブジェクトを移行する必要があります。
簡単な説明
2 つの S3 バケット間でオブジェクトをコピーするには、以下の手順に従います。
1. 新しい S3 バケットを作成します。
2. AWS コマンドラインインターフェイス (AWS CLI) をインストールし、設定します。
3. S3 バケット間でオブジェクトをコピーします。
注: aws s3 ls コマンドまたは aws s3 sync コマンドを大きなバケット (オブジェクトが 1,000 万個以上) で使用すると負荷がかかり過ぎて、タイムアウトになるおそれがあります。バケットが大きいためにタイムアウトになった場合は、Amazon CloudWatch メトリクスでバケット内のオブジェクトのサイズと数を計算することをを考えてください。また、S3 バッチオペレーションを使用してオブジェクトをコピーすることもを考えてください。
4. オブジェクトがコピーされていることを確認します。
5. 既存の API コールをターゲットバケット名に更新します。
更新前に、以下のことを考慮してください。
- S3 バケットに (1,000 万個を超える) 多数のオブジェクトがある場合は、S3 バッチオペレーションの使用を考えてください。S3 バッチオペレーションを使用すると、コピープロセスを自動化できます。
- 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. オプションで、[既存のバケットから設定をコピー] を選択して、ソースバケットの設定をミラーリングします。
AWS CLI をインストールして設定します。
2. 次のコマンドを実行して AWS CLI を設定します。
aws configure
注: AWS CLI コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
3. アクセスキー (アクセスキー ID とシークレットアクセスキー)を入力します。
4. Enter を押して、デフォルトのリージョンオプションとデフォルトの出力オプションをスキップします。Amazon S3 リージョンのパラメータの詳細については、「AWS service endpoints」を参照してください。
注: AWS CLI の出力は JSON、テキスト、またはテーブルですが、すべてのコマンドがこれらの各出力タイプをサポートしているわけではありません。詳細については、「AWS CLI からのコマンド出力を制御する」を参照してください。
S3 バケット間でのオブジェクトのコピー
1. S3 オブジェクトを Amazon Simple Storage Service Glacier ストレージクラスにアーカイブした場合は、オブジェクトを復元します。
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 コマンドを実行する必要が生じる可能性があります。
関連情報
Amazon S3 で大量の削除を実行した後に、リストコマンドが応答しない場合のトラブルシューティング方法を教えてください。
関連するコンテンツ
- 質問済み 4年前lg...
- 質問済み 6年前lg...
- 質問済み 1ヶ月前lg...
- AWS公式更新しました 9ヶ月前
- AWS公式更新しました 8ヶ月前