如何从对象列表创建Terraform动态块?代码报错求解
Terraform动态块遍历数组错误修复
变量定义
variable "volumes" { default = [ { "name" : "mnt", "value" : "/mnt/cvdupdate/" }, { "name" : "efs", "value" : "/var" }, ] }
错误的动态块实现
dynamic "volume" { for_each = var.volumes == "" ? [] : [true] content { name = volume["name"] } }
执行报错信息
name = volume["name"] │ │ The given key does not identify an element in this collection value.
期望生成的配置
volume { name = "mnt" } volume { name = "efs" }
问题分析与修复
核心问题点
- for_each逻辑完全错误
var.volumes是数组类型,和字符串""做相等判断没有意义,而且返回[true]只会让动态块执行一次,无法遍历数组内的每个元素。 - 迭代器元素引用错误
Terraform动态块的迭代器(这里命名为volume),其对应数组元素的引用是volume.value,直接写volume["name"]会把迭代器对象当成映射来取值,自然报错。
修复后的代码
dynamic "volume" { for_each = var.volumes content { name = volume.value["name"] } }
如果需要兼容var.volumes为空的场景,直接使用var.volumes即可——空数组会让动态块不生成任何volume块,无需额外判断。
内容的提问来源于stack exchange,提问作者bruvio
相关产品推荐
相关产品推荐

