Terraform配置IAM策略报错:JSON格式无效,请求协助排查
解决Terraform IAM策略JSON无效的报错
问题诊断
报错"policy" contains an invalid JSON: invalid character 'a' looking for beginning of value说明policy字段的内容不是合法JSON,通常是因为生成的JSON字符串开头不是{,而是其他字符(比如字母a),大概率是资源引用解析异常或配置语法问题导致的。
解决方案
方案1:直接在IAM策略资源中生成JSON(绕过data资源)
跳过aws_iam_policy_document data资源,直接在aws_iam_policy里用jsonencode生成策略,同时用循环简化资源列表,避免重复编写:
resource "aws_iam_policy" "lambda_s3_access_iam_policy" { name = "lambda_s3_access" policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Action = ["s3:ListBucket", "s3:*Object"] Resource = flatten([ for bucket in [aws_s3_bucket.bronze-stage, aws_s3_bucket.silver-stage, aws_s3_bucket.gold-stage] : [ bucket.arn, "${bucket.arn}/*" ] ]) } ] }) }
方案2:修复data资源的引用与配置
如果坚持用aws_iam_policy_document,先确认以下几点:
- 确保S3 Bucket资源已正确定义:检查
aws_s3_bucket.bronze-stage、silver-stage、gold-stage这三个资源是否存在且配置正确,比如:
resource "aws_s3_bucket" "bronze-stage" { bucket = "bronze-stage-bucket-test" } resource "aws_s3_bucket" "silver-stage" { bucket = "silver-stage-bucket-test" } resource "aws_s3_bucket" "gold-stage" { bucket = "gold-stage-bucket-test" }
- 验证data资源的输出:执行
terraform console,输入data.aws_iam_policy_document.lambda_s3_access.json,查看输出是否为合法的JSON字符串。如果输出不是预期的JSON,说明data资源生成过程有问题,需要排查配置错误。 - 升级Terraform与AWS Provider:老版本的Terraform或AWS Provider可能存在
aws_iam_policy_document的bug,升级到最新稳定版再尝试。
方案3:正确使用EOF语法
如果用EOF编写策略,确保变量替换正确且JSON格式无错误:
resource "aws_iam_policy" "lambda_s3_access_iam_policy" { name = "lambda_s3_access" policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:ListBucket", "s3:*Object"], "Resource": [ "${aws_s3_bucket.bronze-stage.arn}", "${aws_s3_bucket.bronze-stage.arn}/*", "${aws_s3_bucket.silver-stage.arn}", "${aws_s3_bucket.silver-stage.arn}/*", "${aws_s3_bucket.gold-stage.arn}", "${aws_s3_bucket.gold-stage.arn}/*" ] } ] } EOF }
额外提示
s3:*Object是合法的IAM动作通配符,但如果需要更精细的权限,可以指定具体动作(比如s3:GetObject、s3:PutObject)。- 执行
terraform validate可以提前检测配置语法错误,避免后续执行报错。
内容的提问来源于stack exchange,提问作者david backx
相关产品推荐
相关产品推荐

