はじめに
S3 バケットの内容を別のバケットに同期したいユースケースで使用する AWS CLI の s3 sync
ですが、クロスアカウントで実施したいパターンも多々あると思います。
そこで一番簡素な手順と思われサクッと実施するパターンを備忘として残しておきます。
1. コピー元のアカウントで実施すること
以下のポリシーを持つ IAM ユーザーまたはロールを作成する。
例: ユーザー sample-s3-bucket-sync
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<コピー元バケット名>",
"arn:aws:s3:::<コピー元バケット名>/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::<コピー先のバケット名>",
"arn:aws:s3:::<コピー先のバケット名>/*"
]
}
]
}
2. コピー先のアカウントで実施すること
コピー先バケットのバケットポリシーに以下を設定する。
{
"Version": "2012-10-17",
"Id": "S3AccessPolicy",
"Statement": [
{
"Sid": "AllowS3PutObject",
"Effect": "Allow",
"Principal": {
"AWS": "<1で作成したユーザーまたはロールのarn>"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<コピー先バケット名>/*"
},
{
"Sid": "AllowS3ListBucket",
"Effect": "Allow",
"Principal": {
"AWS": "<1で作成したユーザーまたはロールのarn>"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::<コピー先バケット名>"
}
]
}
3. sync 実施
s3 sync
コマンドを実行します。
- 1で作成したユーザーにて実行します
- 1でロールを作成した場合は、使用ユーザーに assume role してから実施して下さい
aws s3 sync s3://<コピー元バケット名> s3://<コピー先バケット名> --acl bucket-owner-full-control