如何使用Terraform动态块或for循环构建多账户授权S3 Bucket Policy
报错原因
你遇到的报错是两处语法错误导致的:
- 代码中
Action = [ ... ]的省略号是非法占位符,Terraform无法识别该写法,必须替换为实际需要授权的S3操作权限列表 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
相关产品推荐
相关产品推荐

