Edited at

同一リージョンとクロスアカウントでレプリケーション


同一リージョンでレプリケーション

今日はポリシーのテンプレ貼ります。

バケット名とアカウントIDを差し替えれば使える感じです。

S3に大して何かやりたいときって、そのS3バケットの所有者がどのアカウントかが重要です。

おおまかには、

同一アカウント内だったら、みんなAアカウントが持ってるので

IAMロールでS3リソースに何ができるかを設定したらOK。

BアカウントにあるS3バケットに大して、Aアカウントから何かをしたいとき。

これは、AアカウントでIAMロール設定とBアカウント側でバケットポリシーの設定が必要になります。


同一アカウントでレプリケーションするときのIAMロールにつけるポリシー

{

"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetReplicationConfiguration",
"s3:GetObjectVersion",
"s3:GetObjectVersionAcl",
"s3:GetObjectVersionTagging",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::source-bucket",
"arn:aws:s3:::source-bucket/*" <転送元バケット
]
},
{
"Effect": "Allow",
"Action": [
"s3:ReplicateObject",
"s3:ReplicateDelete",
"s3:ReplicateTags"
],
"Resource": "arn:aws:s3:::dist-bucket/*" <転送先バケット
}
]
}

Getの部分を省略して書くこともできます。たぶん、S3://Replicateも短縮できるかもですが、実際試してないのでたぶんです。

{

"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::source-bucket",
"arn:aws:s3:::source-bucket/*" <転送元バケット
]
},
{
"Effect": "Allow",
"Action": [
"s3:ReplicateObject",
"s3:ReplicateDelete",
"s3:ReplicateTags"
],
"Resource": "arn:aws:s3:::dist-bucket/*" <転送先バケット
}
]
}

S3の認証周りでポリシーを設定するときって、

単純にレプリケーションしたいだけでもいろいろActionに書かなきゃいけないので

とりあえず、なにも考えずにアスタリスク!でいいとおもいます。


クロスアカウントでレプリケーションするときにつけるバケットポリシー

 {

"Version": "2008-10-17",
"Id": "S3-Console-Replication-Policy",
"Statement": [
{
"Sid": "S3ReplicationPolicyStmt1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::アカウントID番号:root"
},
"Action": [
"s3:GetBucketVersioning",
"s3:PutBucketVersioning",
"s3:ReplicateObject",
"s3:ReplicateDelete"
],
"Resource": [
"arn:aws:s3:::dist-bucket",
"arn:aws:s3:::dist-bucket/*" <転送先バケット
]
}
]
}

転送先のバケットがあるアカウント側のバケットポリシーにいれましょう。


クロスアカウントのIAMロールを作る

スクリーンショット 2019-11-08 11.08.47.png

これ地味に忘れてて、すこしはまったんですが、

このロールは、転送先のアカウントで作成します。

転送元のアカウントからのリソース操作を許可するので。

案外これ使うんで、お役に立てばうれしいです。

「とりあえず、S3の中身同期しといて、レプリケートかけるようにする」

がやれます。

現場からは以上です。