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

Terraform创建aws_iam_role_policy报错:需字符串却传入ARN列表

解决Terraform中IAM策略Resource字段同时包含单个SSM参数ARN与ARN列表的问题

你遇到的错误是因为Terraform字符串模板无法直接解析列表类型的值,需要先把单个ARN和批量获取的ARN列表合并成一个完整的列表,再通过jsonencode函数将其转换为IAM策略所需的JSON数组格式。

具体实现步骤

  1. 合并ARN列表:使用concat函数将单个SSM参数的ARN(包装成单元素列表)与aws_ssm_parameters_by_path返回的ARN列表合并,得到一个包含所有目标ARN的完整列表。
  2. 生成策略JSON:在policy参数中用jsonencode直接构造整个IAM策略文档,这样Terraform会自动处理列表到JSON数组的转换,避免字符串模板的类型冲突。

完整示例代码

# 批量获取指定路径下的SSM参数ARN
data "aws_ssm_parameters_by_path" "all_parameters" {
  path      = "/your/ssm/path/"
  recursive = true
}

# 配置IAM角色策略
resource "aws_iam_role_policy" "ssm_access_policy" {
  name = "ssm-access-policy"
  role = aws_iam_role.your_role.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect   = "Allow"
        Action   = ["ssm:GetParameter", "ssm:GetParameters"]
        # 合并单个ARN与批量获取的ARN列表
        Resource = concat(
          ["arn:aws:ssm:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:parameter/single-specific-param"],
          data.aws_ssm_parameters_by_path.all_parameters.arns
        )
      }
    ]
  })
}

# 可选:获取当前区域和账号ID,避免硬编码
data "aws_region" "current" {}
data "aws_caller_identity" "current" {}

关键说明

  • concat函数用于将多个列表合并为一个,这里把单个ARN包装成["单个ARN"]的形式,确保和另一个列表的类型匹配。
  • jsonencode会自动将Terraform的列表类型转换为JSON数组,完美适配IAM策略中Resource字段的格式要求,彻底解决字符串模板无法解析列表的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:22:39