Terraform:嵌套for_each的dynamic资源中如何访问列表值
解决Terraform dynamic块中列表值访问问题
你的问题出在dynamic块的上下文混淆:外层databricks_cluster资源的each和内部dynamic "init_scripts"块的each是两个不同的迭代上下文,你现在用的each.value指向的是外层集群对象,而非当前循环的脚本路径。
正确写法及优化点
直接用dynamic块的名称作为迭代器引用,同时简化for_each的写法:
variable "clusters" { type = map(object({ cluster_name = string # 建议用下划线命名,符合Terraform惯例 init_scripts = list(string) })) } resource "databricks_cluster" "cluster" { for_each = var.clusters cluster_name = each.value.cluster_name # 用each.value直接访问集群属性,更简洁 dynamic "init_scripts" { # 直接遍历当前集群的init_scripts列表,空列表会自动跳过生成块 for_each = each.value.init_scripts content { file { # 用dynamic块的名称init_scripts来引用当前循环的脚本值 destination = init_scripts.value } } } }
关键说明
- 上下文区分:dynamic块会创建自己的迭代上下文,默认迭代器名称就是dynamic块的名称(这里是
init_scripts),所以要用init_scripts.value访问当前循环的列表元素,而不是外层的each.value。 - 简化for_each:外层
each.value就是当前集群的对象,直接用each.value.init_scripts代替var.clusters[each.key].init-scripts,代码更简洁易读。 - 空列表处理:如果
init_scripts是空列表,for_each = each.value.init_scripts会自动跳过,不需要额外的if判断;如果要处理可能的null值,可以写成for_each = coalesce(each.value.init_scripts, [])。
内容的提问来源于stack exchange,提问作者Siva Rajadurai
相关产品推荐
相关产品推荐

