はじめに
インプルの矢島です。
S3のログデータを管理アカウントに同期したい。別の環境を管理しているアカウントにバックアップをとりたい。というようにアカウントを跨いでバケットをレプリケーションをしたいと思いませんか?
そんな時に行う設定が、S3のクロスアカウントレプリケーションです!
今回はS3のクロスアカウントレプリケーションの設定方法をご紹介いたします。
S3レプリケーションとは
S3レプリケーションとは、S3バケットに新しいオブジェクトがアップロードされたら、自動的にレプリケーション先のバケットにコピーが生成される仕組みです。
同じリージョン内でも、他のリージョンでも、他のアカウントにもレプリケーション先のバケットに指定できます。
ほとんどのオブジェクトは15分以内にレプリケートされますが、場合によっては、数時間かかることもあります。RTCを活用すれば99.99%のオブジェクトを15分以内にレプリケートすることができます。
やること
- レプリケート先のバケットを作成
- レプリケート元のバケットを作成して、レプリケート設定
- レプリケート先のバケットポリシーで、レプリケート元のIAMロールの実行権限を設定
- 動作確認

レプリケート先のバケットを作成
バケットを作成します。(バケットのスペルが間違えてますがご容赦ください。。)

パブリックアクセスはブロックします。バージョニングは有効にしてください。
※バージョニングが有効でないとレプリケーションできないです。

ここまで作成が終わったらレプリケート先のアカウントID(12桁の数字)とバケット名を控えておきましょう。後ほど使います。
レプリケート元のバケットを作成して、レプリケート設定
レプリケート先と同様にバケットを作成していきます。(こちらもバケットのスペルが間違えています。。申し訳ございません)

バケットの管理からレプリケーションルールを作成します。

スコープはとりあえず全てのオブジェクトに適用します。

送信先で、先ほど控えたアカウントIDとバケット名を入力しましょう。

IAMロールは作成します。

追加のレプリケーションルールはなしにします。
作成完了したら、IAMロールが新しく生成されているはずなので、確認しましょう。
自動でs3_crr_role_for_send-buketというロールが作成されていますね。このARNを控えておきましょう。この後使います。

レプリケート先のバケットポリシーで、レプリケート元のIAMロールの実行権限を設定
S3のアクセス許可からバケットポリシーを設定します。
ポリシージェネレータとか使って設定するか、下記をコピーして設定してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "<<レプリケート元のIAMロールARN>>"
},
"Action": [
"s3:ReplicateDelete",
"s3:ReplicateObject",
"s3:ReplicateTags",
"s3:ObjectOwnerOverrideToBucketOwner"
],
"Resource": "arn:aws:s3:::<<レプリケート先バケット名>>/*"
}
]
}
動作確認
設定できたら、send-buketにオブジェクトをアップロードしてみましょう。

recive-backetを確認してみましょう。無事test.pdfが届いていましたね!

以上です!ご覧いただきありがとうございました!
参考
- https://dev.classmethod.jp/articles/try-s3-cross-account-replication/
- https://dev.classmethod.jp/articles/s3-replication-best-practices/
- https://developers.play.jp/entry/2023/03/31/191640#:~:text=Amazon%20S3%20Replication-,S3%E3%81%AE%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%81%AF,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82