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

如何使用Terraform动态块或for循环构建多账户授权S3 Bucket Policy

报错原因

你遇到的报错是两处语法错误导致的:

  1. 代码中Action = [ ... ]的省略号是非法占位符,Terraform无法识别该写法,必须替换为实际需要授权的S3操作权限列表
  2. jsonencode函数的参数括号匹配错误,在Statement数组结束后多写了一个多余的闭合大括号,导致语法解析失败,触发逗号缺失的报错

你用for循环批量生成Statement的思路是正确的,不需要使用动态块:动态块仅适用于资源顶层参数的动态生成,无法嵌套在jsonencode的函数参数内部。


修正后完整代码

locals {
  account_ids = [
    987654321098,
    765432109876,
    432109876543
  ]
}

resource "aws_s3_bucket_policy" "bucket" {
  bucket = aws_s3_bucket.bucket.id

  policy = jsonencode({
    # AWS IAM策略必填字段,固定取值
    Version = "2012-10-17"
    Statement = [
      for account in local.account_ids : {
        Effect    = "Allow"
        # 替换为你实际需要授予的S3操作权限
        Action    = [
          "s3:GetObject",
          "s3:PutObject"
        ]
        Principal = { AWS = [ "arn:aws:iam::${account}:root" ] }
        Resource  = "${aws_s3_bucket.bucket.arn}/states/${account}/*"
      }
    ]
  })
}

注意事项

  • 必须在策略中补充Version字段,取值固定为2012-10-17,这是AWS IAM策略的强制要求,缺失该字段的策略即使创建成功也不会生效
  • 请将代码中Action数组的示例权限替换为你实际需要授予的操作权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:36:04