AWS S3 をマルチアカウントで使う時の注意

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