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

如何在Terraform资源块中按索引调用本地映射值?

解决Terraform资源块按索引获取本地变量值的问题

问题分析

你当前的代码存在两个核心问题:

  1. 三元表达式中错误用for循环生成映射(map),但name字段需要单个字符串值,而非集合类型
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:52:41