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

Terraform AWS IAM角色策略配置报错:无效JSON策略求助

排查Terraform配置IAM策略时的JSON无效错误

问题场景

编写Terraform代码为AWS EMR实例角色配置ec2-connect IAM策略,赋予EC2实例连接权限时,执行terraform plan报错:"policy" contains an invalid JSON policy。

错误原因分析

  • Resource格式不符合IAM要求:IAM策略的Resource字段需要AWS资源ARN(如arn:aws:ec2:region:account-id:instance/i-xxxxxx),但代码中直接使用jsonencode(data.aws_instances.emr_cluster_ec2s.ids)生成的是实例ID数组,并非ARN格式,不符合IAM策略规范。
  • JSON语法错误:策略模板中Statement数组的闭合符号错误,最后一个}应该是],导致JSON结构无效。

修复后的代码

data "aws_instances" "emr_cluster_ec2s" {
  filter {
    name = "key-name"
    values = ["linkedin-learning-emr-key"]
  }
}

data "aws_iam_role" "emr_instance_role" {
  name = "AmazonEMR-InstanceProfile-20230407T155038"
}

# 获取当前AWS账号ID和区域
data "aws_caller_identity" "current" {}
data "aws_region" "current" {}

resource "aws_iam_role_policy" "emr_ec2_connect" {
  name = "ec2-connect"
  role = data.aws_iam_role.emr_instance_role.id

  policy = jsonencode({
    "Version": "2012-10-17",
    "Statement": [
      {
        "Action": [
          "ec2-instance-connect:SendSSHPublicKey"
        ],
        "Effect": "Allow",
        "Resource": [
          for instance_id in data.aws_instances.emr_cluster_ec2s.ids :
          "arn:aws:ec2:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:instance/${instance_id}"
        ]
      },
      {
        "Action": [
          "ec2:DescribeInstances"
        ],
        "Effect": "Allow",
        "Resource": "*"
      }
    ]
  })
}

修复说明

  • 使用jsonencode直接生成完整的JSON策略,避免手动编写JSON时的语法错误。
  • 通过for循环将实例ID转换为符合要求的EC2实例ARN格式,确保Resource字段符合IAM策略规范。
  • 引入aws_caller_identity和aws_region数据源动态获取当前账号ID和区域,提升代码的通用性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:07:52