Terraform创建S3 Bucket Policy遇400错误:MalformedPolicy问题求助
解决Terraform创建S3 Bucket Policy时的MalformedPolicy错误
报错信息
Error: putting S3 Bucket (web-net-app-andreiweb-aasdasfasfasdasg234dsf21312b) Policy: operation error S3: PutBucketPolicy, https response error StatusCode: 400, RequestID: 3082W83VXY47PFBR, HostID: hLSrf/QmpECefnmArGbhMy2bv4+lVCdqsdPj5SkRt2cgJ611hUZfJ2/6YuWF5pj1l4ACI3HH8pM=, api error MalformedPolicy: Policy has invalid resource
涉及资源:aws_s3_bucket_policy.s3bucket_allow_all,位于s3.tf第13行。
问题原因及修复步骤
1. Bucket Policy的Resource字段格式不符合S3要求
S3不允许直接用*作为Policy的Resource值,必须指定桶的完整ARN以及桶内对象的ARN路径通配符。
2. 公开访问控制配置冲突
你的aws_s3_bucket_public_access_block中设置了block_public_policy = true,该配置会直接阻止所有公开Bucket Policy的生效,和你想要配置的公开读取权限完全冲突,必须调整对应参数。
修改后的s3.tf关键代码片段
修正Bucket Policy部分
resource "aws_s3_bucket_policy" "s3bucket_allow_all" { bucket = aws_s3_bucket.myFirstBucket.id policy = jsonencode({ "Version" : "2012-10-17", "Statement" : [ { "Sid" : "AllowPublicRead", "Effect" : "Allow", "Principal" : "*", "Action" : [ "s3:GetObject" # 遵循最小权限原则,仅赋予公开读取所需权限,不建议用* ], "Resource" : [ "${aws_s3_bucket.myFirstBucket.arn}", "${aws_s3_bucket.myFirstBucket.arn}/*" ] } ] }) }
修正公开访问控制部分
如果需要桶支持公开访问,调整aws_s3_bucket_public_access_block参数:
resource "aws_s3_bucket_public_access_block" "myFirstBucket-public-access" { bucket = aws_s3_bucket.myFirstBucket.id block_public_acls = false block_public_policy = false # 必须设为false才能让公开策略生效 ignore_public_acls = false restrict_public_buckets = false }
额外提示
- 若你的桶不需要公开访问,应保留
block_public_policy = true,同时将Bucket Policy修改为私有访问策略(比如仅允许特定IAM用户访问)。 - S3对象的key不要以
/开头,比如/website/index.html应改为website/index.html,避免创建无效的对象路径。
内容的提问来源于stack exchange,提问作者AndreiWeb
相关产品推荐
相关产品推荐

