AWS S3 をマルチアカウントで使う時、結構厳しめな感じなので注意しましょう。
S3 Bucket multi-account-testを アカウント A
で作成します。
bucket policy に
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::<AccountB>:root", "arn:aws:iam::<AccountC>:root" ] }, "Action": [ "s3:PutObject", "s3:PutObjectAcl", "s3:GetObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::multi-account-test/sample/*", "arn:aws:s3:::multi-account-test/sample" ] } ] }
こんな感じで、アカウント B
C
にアクセス権を付与します。
この状態で
AWS_PROFILE=B aws s3 cp sample.txt s3://multi-account-test/sample/sample.txt --acl bucket-owner-full-control
とやってアカウントBからファイルをアップロードすると、 アカウントA,Bからは読めますが、Cからは読めません。
AWS_PROFILE=C aws s3 cp s3://multi-account-test/sample/sample.txt sample.txt fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
オブジェクトに対するアクセス権は、Bucket の持ち主であるAアカウントであれば、bucket policy に従うのですが、アクセス権を得ている他のアカウントがアップロードしたオブジェクトに関しては、bucket policy が適用されません。
アップロードアカウント | ACL | A | B | C |
---|---|---|---|---|
A | none | o | o | o |
B | none | x | o | x |
B | bucket-owner-full-control | o | o | x |
C | none | x | x | o |
C | bucket-owner-full-control | o | x | o |