S3バケットレプリケーションを使用する機会があったのでまとめます。
また、既存オブジェクトがあるS3バケットを別の新規S3バケットと同期をする方法についてもまとめます。
S3バケットレプリケーションとは
簡単にいうと、異なるS3バケット間でオブジェクトを自動でコピー(レプリケート)できる機能。
同じリージョン間やAWSアカウント内の別リージョン間はもちろん、別のAWSアカウントとレプリケートすることもできます。
レプリケーションを使用すると、Amazon S3 バケット間でオブジェクトを自動で非同期的にコピーできます。オブジェクトのレプリケーション用に設定されたバケットは、同じ AWS アカウント が所有することも、異なるアカウントが所有することもできます。オブジェクトは、単一または複数の送信先バケットにレプリケートできます。送信先バケットは、異なる AWS リージョン でも、ソースバケットと同じリージョン内でも配置することができます。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/replication.html
レプリケーションは2種類ある
ライブレプリケーション
新規で作成されたオブジェクトや更新されたオブジェクトを自動でレプリケートする機能です。
- レプリケーション設定前にバケットにあったオブジェクトはレプリケートされないのが注意点
- レプリケーション設定前の既存オブジェクトをレプリケートするには後述する「オンデマンドレプリケーション」の設定が必要
レプリケート元のバケットに書き込まれる際に、新しく作成されたオブジェクトまたは更新されたオブジェクトを自動的にレプリケートするには、ライブレプリケーションを使用します。ライブレプリケーションでは、レプリケーションを設定する前にバケットに存在していたオブジェクトはレプリケートされません。レプリケーションを設定する前に存在していたオブジェクトをレプリケートするには、オンデマンドレプリケーションを使用します。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/replication.html
また、ライブレプリケーションには次の2つがある。名前のとおりレプリケーションするバケットが別リージョンか同じリージョンかの違いだからイメージしやすいはず。
- クロスリージョンレプリケーション (CRR)
- 同一リージョンレプリケーション (SRR)
オンデマンドレプリケーション(S3 バッチレプリケーション)
前述のとおりでレプリケーション設定前の既存オブジェクトをレプリケートする際に使用する。
S3 バッチレプリケーションを使用するとのこと。
(今回はこのオンデマンドレプリケーションをちゃんと使ってみたい)
レプリケート元のバケットから 1 つ以上のレプリケート先バケットにオンデマンドで既存のオブジェクトをレプリケートするには、S3 バッチレプリケーションを使用します。既存のオブジェクトのレプリケーションの詳細については、「S3 バッチレプリケーションを使用する状況」を参照してください。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/replication.html
ライブレプリケーションを試す
これは過去に設定したことがありますが、一応記録として残します。
今回は同一アカウント内でクロスリージョンレプリケーションを実施します。
リソース作成・設定
次のリソースを作成します。詳細設定は後述します。
- S3バケット(プライマリ(東京リージョン))
- S3バケット(レプリケーション先(大阪リージョン))
- IAMロール
S3バケット(共通設定)
レプリケーション元(プライマリ)、レプリケーション先どちらのS3バケットにも バージョニング設定 が必要なので設定します。
バージョニング設定
プライマリのS3バケットでレプリケーションルール作成
プライマリ(レプリケーション元)のS3バケットでレプリケーションルールを作成します。
項目 | 内容 |
---|---|
レプリケーションルール名 | 適当 |
ステータス | 有効 |
ルールスコープ | バケット内のすべてのオブジェクトに適用 |
送信先 | このアカウントのバケットを選択する |
バケット名 | レプリケーション先S3バケット |
IAMロール | 新しいロールの作成 |
送信先ストレージクラス | レプリケートされたオブジェクト用のストレージクラスを変更 |
ストレージクラス | Intelligent-Tiering (Glacier Deep Archiveとか色々選択できる) |
削除マーカーのレプリケーション | チェック (レプリケーション元で削除されたものをレプリケーション先でも削除するようになる) |
3 . 既存のオブジェクトをレプリケートしますか?」と聞かれますが一旦「いいえ」としておきます
IAMロール
自動作成されたIAMロールを記載しておく
S3バケット名は適宜変更をお願いします
IAMポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListBucket",
"s3:GetReplicationConfiguration",
"s3:GetObjectVersionForReplication",
"s3:GetObjectVersionAcl",
"s3:GetObjectVersionTagging",
"s3:GetObjectRetention",
"s3:GetObjectLegalHold"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::s3-replication-test-primary-d05def17",
"arn:aws:s3:::s3-replication-test-primary-d05def17/*",
"arn:aws:s3:::s3-replication-test-replica-d05def17",
"arn:aws:s3:::s3-replication-test-replica-d05def17/*"
]
},
{
"Action": [
"s3:ReplicateObject",
"s3:ReplicateDelete",
"s3:ReplicateTags",
"s3:ObjectOwnerOverrideToBucketOwner"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::s3-replication-test-primary-d05def17/*",
"arn:aws:s3:::s3-replication-test-replica-d05def17/*"
]
}
]
}
信頼ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
動作確認のためにテストファイルをアップロード・削除
適当にローカルでファイルを作成しアップロードする。
アップロード
アップロード直後はレプリケーション先S3バケットには何も存在しない。
少し(数秒?)待って更新してみると、レプリケーション先S3バケットにプライマリのS3バケットのファイルと同じものが存在していた。
ストレージクラスもレプリケーション先で変わっているので想定どおりの挙動。
削除
ライブレプリケーションはOK。
オンデマンドレプリケーション(S3 バッチレプリケーション)
次に既存オブジェクトをレプリケートする方法を試す。
※先ほどプライマリS3バケットで設定したレプリケーション設定は一旦削除しておいた。
リソース作成・設定
S3ファイル準備
プライマリのS3バケットでレプリケーションルール作成
先ほどと同様、プライマリ(レプリケーション元)S3バケットにてレプリケーション設定を実施
設定内容は先ほどと同様のため詳細省略(設定した項目表のみ記載しておきます)
項目 | 内容 |
---|---|
レプリケーションルール名 | 適当 |
ステータス | 有効 |
ルールスコープ | バケット内のすべてのオブジェクトに適用 |
送信先 | このアカウントのバケットを選択する |
バケット名 | レプリケーション先S3バケット |
IAMロール | 新しいロールの作成 |
送信先ストレージクラス | レプリケートされたオブジェクト用のストレージクラスを変更 |
ストレージクラス | Intelligent-Tiering (Glacier Deep Archiveとか色々選択できる) |
削除マーカーのレプリケーション | チェック (レプリケーション元で削除されたものをレプリケーション先でも削除するようになる) |
既存のオブジェクトをレプリケートする
先ほどは「いいえ」とした設定。
既存のオブジェクトをレプリケートしたいため「はい、既存のオブジェクトをレプリケートします。」を選択。
上記で「送信」をクリックすると次の画面が表示される。
各項目設定し保存することで、既存オブジェクトをレプリケートするバッチジョブが始まる。
項目 | 内容 |
---|---|
ジョブ実行オプション | 準備ができたらジョブを自動的に実行します |
完了レポートの生成 | チェック |
完了レポートの範囲 | すべてのタスク |
完了レポートの送信先 | レポート用のS3バケット |
アクセス許可 | 新しいロールの作成 |
IAMロール
バッチオペレーションジョブにおいて自動作成されたIAMロールを記載しておく
S3バケット名は適宜変更をお願いします
IAMポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:InitiateReplication",
"s3:GetReplicationConfiguration",
"s3:PutInventoryConfiguration"
],
"Resource": [
"arn:aws:s3:::s3-replication-test-primary-d05def17",
"arn:aws:s3:::s3-replication-test-primary-d05def17/*"
]
},
{
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::test-report-20250710/*"
}
]
}
信頼ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "batchoperations.s3.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
オンデマンドレプリケーション(S3 バッチレプリケーション)開始・完了確認
開始を確認
ジョブ実行オプションで「準備ができたらジョブを自動的に実行します」と選択したためすぐにバッチオペレーションが開始された。
完了
ステータスが完了済みとなっておりバッチオペレーションが完了したことがわかる。
詳細を見ると完了レポートが別のS3バケットに作成されていることも確認できる
完了レポートを見てみる
どんなのかイメージもつかないがどのような内容なのか確認してみる。
manifest.json
{
"Format": "Report_CSV_20180820",
"ReportCreationDate": "2025-07-09T16:50:10.039908116Z",
"Results": [{
"TaskExecutionStatus": "succeeded",
"Bucket": "test-report-20250710",
"MD5Checksum": "5bf051e8bb81db10e77dfd96c3b010a2",
"Key": "job-bf0a959f-6da0-4c0d-864d-33928408aa59/results/0d7de2b917f2540f3849319264b23cde99923ce4.csv"
}],
"ReportSchema": "Bucket, Key, VersionId, TaskStatus, ErrorCode, HTTPStatusCode, ResultMessage"
}
csvファイル
どのオブジェクトがどんな結果だったのか確認できる状態になっていた。
s3-replication-test-primary-d05def17 | test1.txt | F8s0rBWlbmr4LsA2pXds5SLnGTCzOlKq | succeeded | 200 | success | |
s3-replication-test-primary-d05def17 | test.txt | 8.rJG2QWcD0gmVdLZR3GWgd1dA9AnJV5 | succeeded | 200 | success | |
s3-replication-test-primary-d05def17 | test2.txt | zuyPrpsBxvXqyn6xTDhcQvlGtEHT3sSM | succeeded | 200 | success | |
s3-replication-test-primary-d05def17 | test3.txt | p2pglmqtiyTmYuQO.8f_I5bS7zotQMUo | succeeded | 200 | success | |
s3-replication-test-primary-d05def17 | test.txt | s35owxbIpqovrd_nrpZ78LFqfGSgYYPc | succeeded | 200 | success |
s3-replication-test-primary-d05def17,test1.txt,F8s0rBWlbmr4LsA2pXds5SLnGTCzOlKq,succeeded,200,,success
s3-replication-test-primary-d05def17,test.txt,8.rJG2QWcD0gmVdLZR3GWgd1dA9AnJV5,succeeded,200,,success
s3-replication-test-primary-d05def17,test2.txt,zuyPrpsBxvXqyn6xTDhcQvlGtEHT3sSM,succeeded,200,,success
s3-replication-test-primary-d05def17,test3.txt,p2pglmqtiyTmYuQO.8f_I5bS7zotQMUo,succeeded,200,,success
s3-replication-test-primary-d05def17,test.txt,s35owxbIpqovrd_nrpZ78LFqfGSgYYPc,succeeded,200,,success
ファイルがレプリケートされたか確認
他のファイルなどの確認をしていて肝心なことを忘れていた。バッチオペレーションによってレプリケートされたかを確認する。
ちゃんとレプリケートされてた
バッチオペレーションで成功となっていたとおり全ての既存ファイルがレプリケーション先のS3バケットへレプリケートされていた。AWS優秀!
感想
あんま感想ないけどこんな簡単にレプリケーションできるんやって思いました。
参考URL
ライブレプリケーション
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/replication.html
https://dev.classmethod.jp/articles/lim-s3-replication/
オンデマンドレプリケーション(S3 バッチレプリケーション)
https://aws.amazon.com/jp/getting-started/hands-on/replicate-existing-objects-with-amazon-s3-batch-replication/ (これ公式やし画像つきやしわかりやすい)
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/s3-batch-replication-batch.html