• home
  • s3クロスアカウント時の連携はcli側のpolicyも必要

s3クロスアカウント時の連携はcli側のpolicyも必要

小ネタですが少々。

全く表題の通りなんですが、AWS アカウントAからBへの s3 cp 等を実現するにはいくつか方法がありますが、
受け取り側Bのpolicyをいじって、アカウントAのIAM Userへのアクセスを許可する場合を考えてみます。

受け取り側アカウントBのバケットポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Sample",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<アカウントA>:user/<クロスアカウントput用 IAM User>"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::<受け取り側Bucket>/<アクセスコントロールするパス>/*"
        }
    ]
}

受け取り側は基本的に以上のバケットポリシーを記述するだけで
アカウントAはアカウントBの s3://<受け取り側Bucket>/<アクセスコントロールするパス>/* 以下にアクセスできるのですが、ここで勘違いが一つ。
そのまま該当bucketにputしようとすると

aws s3 cp ./hoge.txt s3://<受け取り側Bucket>/<アクセスコントロールするパス>/ --profile put-user-b

upload failed: ./hoge.txt to s3://<受け取り側Bucket>/<アクセスコントロールするパス>/ hoge.txt An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

となり、アクセス権不足となります。

put主体となるアカウントA側にも、少なくとも以下を満たすポリシーが必要です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::<受け取り側Bucket>/<アクセスコントロールするパス>/*"
        }
    ]
}