使用Terraform创建AWS IAM Policy时JSON策略验证失败求助
解决Terraform AWS IAM策略JSON无效问题
排查与修复步骤
检查变量插值结果
先确认module.rds_staging.secrets_manager_secret_arn和module.rds_staging.secrets_manager_kms_key_arn的实际值:执行terraform plan,查看输出中这两个ARN是否符合标准格式(Secrets Manager ARN格式为arn:aws:secretsmanager:地区:账号ID:secret:xxx,KMS密钥ARN格式为arn:aws:kms:地区:账号ID:key/xxx)。如果是空值或格式错误,会直接导致策略JSON无效。修正JSON格式细节
手动检查JSON语法:- 移除多余的空格:你的代码中第103行
Resource字段末尾有多余空格(}"),虽然JSON允许空格,但建议删除以避免解析异常; - 确认逗号使用正确:确保数组、对象中最后一个元素后没有多余逗号,你的代码中Action数组的写法是正确的。
- 移除多余的空格:你的代码中第103行
改用
jsonencode函数生成策略
避免手动编写JSON的格式问题,用Terraform内置的jsonencode自动生成合法JSON,示例代码如下:
resource "aws_iam_policy" "aws_dms_secret_sql_server_policy" { name = "${var.application}-${replace(var.service, "-", "")}-${replace(data.aws_region.current.name, "-", "")}-${terraform.workspace}-dms_secret_sql_server_policy" policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Action = "secretsmanager:GetSecretValue" Resource = module.rds_staging.secrets_manager_secret_arn }, { Effect = "Allow" Action = ["kms:Decrypt", "kms:DescribeKey"] Resource = module.rds_staging.secrets_manager_kms_key_arn } ] }) tags = local.common_tags }
这种方式会由Terraform自动处理变量插值和JSON格式,彻底规避手动编写的语法错误。
- 验证策略合法性
将插值后的完整JSON(可通过terraform console获取变量实际值并替换到策略中)放到AWS IAM控制台的策略编辑器中验证,排查是否存在AWS层面的策略逻辑错误(比如Action名称拼写错误、Resource ARN不合法)。
内容的提问来源于stack exchange,提问作者Ross Bush
相关产品推荐
相关产品推荐

