如何在Terraform资源块中按索引调用本地映射值?
解决Terraform资源块按索引获取本地变量值的问题
问题分析
你当前的代码存在两个核心问题:
- 三元表达式中错误用
for循环生成映射(map),但name字段需要单个字符串值,而非集合类型 local.Vvn的键是字符串类型(如"0"),但你直接用数字索引访问,导致键类型不匹配;同时range(length(local.Vvn))生成序列0,1,2,但你的local.Vvn中无键"2",会触发查找错误
修正方案
步骤1:统一索引与键的匹配关系(可选但推荐)
如果local.Vvn是按顺序存储值,建议改为列表类型,更适配索引访问场景:
locals { Vvn = ["sam1", "sam2", "sam3"] # 索引0对应sam1,1对应sam2,2对应sam3 }
若必须保留原map结构,需修正键名保证索引连续:
locals { Vvn = { "0" = "sam1" "1" = "sam2" "2" = "sam3" # 将原"3"改为"2",匹配索引序列 } }
步骤2:为for_each元素分配对应索引
由于你已用var.sampleconfig作为for_each数据源,需给每个元素分配递增索引,才能对应local.Vvn的位置:
locals { # 给每个sampleconfig元素添加索引字段 sample_config_with_idx = { for idx, (config_key, config_val) in enumerate(var.sampleconfig) : config_key => merge(config_val, { index = idx }) } }
步骤3:修正资源块的name字段逻辑
现在可通过元素索引正确获取local.Vvn的值:
resource "null_resource" "sample" { for_each = local.sample_config_with_idx # 三元表达式返回单个字符串,而非集合 name = each.value.flag ? # 若用列表类型的local.Vvn,直接写:local.Vvn[each.value.index] lookup(local.Vvn, tostring(each.value.index), "default_name") : # map类型需转字符串键 "string.${each.value.name}" }
关键说明
enumerate函数遍历var.sampleconfig时,会同时返回元素的递增索引和键值对lookup函数用于安全访问map,第三个参数是键不存在时的默认值,避免报错
内容的提问来源于stack exchange,提问作者Katey
相关产品推荐
相关产品推荐

