dehio3’s diary

仕事、生活、趣味のメモ

S3のバケットにポリシーを設定しようとするとアクセス拒否される

事象

terraformでS3にバケットポリシーを設定しようとしたら以下のメッセージが出た

aws_s3_bucket_policy.test: Error putting S3 policy: AccessDenied: Access Denied

AWSコンソールから作業しても「アクセス拒否」のメッセーが表示されて、ポリシーが保存できない

設定したいポリシーはこちら

{
  "Id": "AllowVPCE",
  "Statement": [
    {
      "Action": "s3:GetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Resource": "arn:aws:s3:::your-bucket-name/*",
      "Sid": "AllowS3Download"
    }
  ],
  "Version": "2012-10-17"
}

原因

S3に保存するデータに公開する要件がないため、アカウントレベルでパブリックアクセスを制限していた。

aws.amazon.com

そのため以下に該当してしまった。

docs.aws.amazon.com

このオプションを TRUE 設定すると、指定されたバケットポリシーでパブリックアクセスが許可されている場合、Amazon S3 は PUT Bucket ポリシーへの呼び出しを拒否します。この設定により、バケットやその中に含まれるオブジェクトを公に共有することを許可せずに、ユーザーがバケットポリシーを管理できるようになります。この設定を有効にしても、既存のバケットポリシーには影響しません。

対応

Principalが指定されていないとパブリック扱いになるため、明示的にアカウント情報を指定した。

{
  "Id": "AllowVPCE",
  "Statement": [
    {
      "Action": "s3:GetObject",
      "Effect": "Allow",
      "Principal": {"AWS": ["arn:aws:iam::<アカウントID>:root"]},
      "Resource": "arn:aws:s3:::your-bucket-name/*",
      "Sid": "AllowS3Download"
    }
  ],
  "Version": "2012-10-17"
}