【AWS】S3 sync コマンドによるS3バケット間でのオブジェクトコピー

本記事では、S3 sync コマンドによるS3バケット間でのオブジェクトコピー方法について、具体例付きで解説します。

S3 Bucket Policy

前提


リソースの名称は下記とする。

・バケット A:test-bucket-a

・バケット B:test-bucket-b

説明


S3 SyncはバケットA・Bのオブジェクトを同期する。

欠損しているオブジェクトだけでなく、バージョンの違いが発生していた場合も同期することが出来る。

例として

バケットAにtest1.text・・・test10.txtがあり、

バケットBにtest1.txtしかなかった場合、

s3 sync コマンドを利用することで、バケットAのtest2.txtからtest10.txtがバケットBに同期される。

注意


s3 sync コマンドは同じファイルサイズの場合、そのオブジェクトは同期されない。

そのため、同じサイズのファイルをタイムスタンプが違う場合に同期したい場合、 --exact-timestanmps オプションを使用することで同期可能。

実際のコマンド


aws s3 sync s3://<同期元バケット名> s3://<同期先バケット名> --exact-timestamps

aws s3 sync s3://test-bucket-a s3://test-bucket-b --exact-timestamps

エラー


実行時下記エラーが起きたため、調べた。

copy failed: s3://test-bucket-a/test2.txt to s3://test-bucket-b/test2.txt An error occurred (AccessDenied) when calling the CopyObject operation: VPC endpoints do not support cross-region requests

原因


上記エラーは、異なるリージョン間(具体的には東京と大阪で試した)のオブジェクトのコピーに S3 の VPC エンドポイントを使用した場合に発生する。

S3 の VPC エンドポイントは、現時点ではクロスリージョンのオブジェクトコピーに対応していない。

解決策


下記 2 つの方法がある。

①VPC エンドポイントを使用しないように VPC の設定を変更する

②一度コピー対象のオブジェクトをローカル環境にダウンロードし、その後別リージョンの S3 バケットにS3 syncによるアップロードを行う

今回は少量だったため、②で実行した。

aws s3 sync s3://test-bucket-a ./ --exact-timestamps