事象
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に保存するデータに公開する要件がないため、アカウントレベルでパブリックアクセスを制限していた。
そのため以下に該当してしまった。
このオプションを 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" }