You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Terraform中添加S3公共访问策略遇MalformedPolicy错误求助

解决Terraform配置S3存储桶公共访问策略时的MalformedPolicy错误

这个错误的核心是S3策略中的Resource字段格式无效,以下是具体的排查和修复方向:

  • 检查Resource的ARN格式是否正确
    S3桶的资源ARN有两种标准格式:

    1. 针对整个桶:arn:aws:s3:::你的桶名
    2. 针对桶内所有对象:arn:aws:s3:::你的桶名/*
      常见错误包括多写末尾斜杠(比如arn:aws:s3:::你的桶名/)、漏写:::之间的空段,这些都会触发格式无效报错。
  • 确认Terraform变量或桶名引用是否正确
    如果用变量指定桶名,要确保变量名和赋值都没有拼写错误。比如错误写法:

    resource "aws_s3_bucket_policy" "example" {
      bucket = aws_s3_bucket.example.id
      policy = jsonencode({
        Version = "2012-10-17"
        Statement = [
          {
            Effect = "Allow"
            Principal = "*"
            Action = ["s3:GetObject"]
            Resource = "arn:aws:s3:::${var.wrong_bucket_name}/*" # 变量名错误
          }
        ]
      })
    }
    

    需修正为正确的变量名,或直接填写准确的桶名。

  • 排查JSON语法错误
    手动编写JSON字符串时,容易出现引号不配对、逗号遗漏等问题。建议优先用jsonencode结合HCL结构生成策略,自动规避语法问题。

正确配置示例

resource "aws_s3_bucket" "public_bucket" {
  bucket = "my-public-bucket-12345" # 替换为你的桶名
}

resource "aws_s3_bucket_policy" "public_access" {
  bucket = aws_s3_bucket.public_bucket.id
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect    = "Allow"
        Principal = "*"
        Action    = ["s3:GetObject"]
        Resource  = "arn:aws:s3:::${aws_s3_bucket.public_bucket.bucket}/*"
      }
    ]
  })
}

额外注意事项

如果AWS账号开启了S3块公共访问设置,即使策略正确也可能无法生效,需添加以下配置关闭限制:

resource "aws_s3_bucket_public_access_block" "example" {
  bucket = aws_s3_bucket.public_bucket.id

  block_public_acls       = false
  block_public_policy     = false
  ignore_public_acls      = false
  restrict_public_buckets = false
}

内容的提问来源于stack exchange,提问作者Dini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 14:35:56