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
相关产品推荐
相关产品推荐

