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

Terraform中无法访问对象列表属性问题求助

Terraform dynamic block 访问对象属性报错解决

问题根源

你的var.policy类型是map(list(object(...))),意味着这个变量的每个值都是对象列表,而非单个对象。如果直接遍历var.policy,循环中的迭代变量实际指向的是整个列表,而不是列表里的单个对象——列表本身没有path或capabilities属性,自然会报错。

错误代码示例(还原你的场景)

data "vault_policy_document" "this" {
  dynamic "rule" {
    for_each = var.policy
    content {
      path         = rule.value.path  # 错误:rule.value是列表,不是单个对象
      capabilities = rule.value.capabilities
    }
  }
}

variable "policy" {
  type = map(list(object({
    path         = string
    capabilities = list(string)
  })))
  default = {
    "admin" = [
      { path = "secret/*", capabilities = ["create", "read"] },
      { path = "auth/*", capabilities = ["sudo"] }
    ],
    "reader" = [
      { path = "secret/*", capabilities = ["read"] }
    ]
  }
}

解决方案:扁平化列表或嵌套循环

方案1:扁平化所有对象列表(推荐)

用flatten函数把var.policy中所有嵌套的对象列表合并成一个单层列表,这样遍历的时候每个迭代项都是单个对象:

data "vault_policy_document" "this" {
  dynamic "rule" {
    # 提取所有map值(列表),再扁平化合并为单个对象列表
    for_each = flatten(values(var.policy))
    content {
      path         = rule.value.path
      capabilities = rule.value.capabilities
    }
  }
}

方案2:嵌套dynamic块(保留map分组信息)

如果需要保留原map的键作为分组依据,可以嵌套两层dynamic块,先遍历map的每个键值对,再遍历对应列表里的对象:

data "vault_policy_document" "this" {
  dynamic "rule_group" {
    for_each = var.policy
    content {
      dynamic "rule" {
        for_each = rule_group.value
        content {
          path         = rule.value.path
          capabilities = rule.value.capabilities
        }
      }
    }
  }
}

关键说明

  • values(var.policy)会提取map中所有的值,得到一个list(list(object))类型的结果
  • flatten()函数会把嵌套的列表"拍平",变成list(object),此时每个元素都是包含path和capabilities的单个对象,就能正常访问属性了

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:10:23