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

Terraform变量类型不匹配报错:传入值不符合map(list(object))类型

问题分析与解决

核心问题:类型不匹配

你的模块中policy变量声明的类型是map(list(object({...})))(即键为字符串、值为对象列表的映射),但你传入的each.value是var.policies.policies中单个键对应的对象列表(list(object)类型),两者类型不匹配,因此报错。

你误解了each.value的结构:var.policies.policies本身是一个map,结构是:

{
  "policy-test-1" = [
    { capabilities = ["read", "create"], path = "/foo/lala" },
    { capabilities = ["read", "create"], path = "/bar/lala" }
  ],
  "policy-test-2" = [
    { capabilities = ["update", "delete"], path = "/foo/lala" }
  ]
}

当用for_each = var.policies.policies遍历时,each.key是policy-test-1/policy-test-2,而each.value就是对应的值——也就是上面的对象列表,不是包含键的map。


两种解决方案

方案1:修改模块变量类型(推荐)

既然每个模块实例对应一个策略集合(比如policy-test-1),直接把模块的policy变量类型改为list(object)更合理:

variable "policy" {
  description = "The policy to be created"
  type = list(object({
    path = string
    capabilities = list(string)
  }))
}

这样each.value(对象列表)就能直接匹配变量类型,无需额外处理。

方案2:包装传入值以匹配原类型

如果不想修改模块,就把each.value包装成符合map(list(object))要求的结构:

module "policies" {
  source = "../path/to/module/above"

  for_each = var.policies.policies
 
  policy = {
    each.key = each.value
  }
}

此时传入的policy是一个单键map,键为当前策略名称,值为对应的对象列表,完全匹配模块的变量类型要求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:55:20