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

如何在Terraform中根据条件向映射添加键值对

解决Terraform locals中动态条件生成映射键的问题

要实现根据route_table的值动态决定是否在子网配置映射中包含rtbl_id键,可以利用Terraform的merge函数结合条件表达式来实现,具体修改如下:

locals {
  snet_mappings = {
    for key in keys(module.subnet.snet-ids) : key => merge(
      # 基础配置:始终包含子网ID和NSG ID
      {
        snet_id = module.subnet.snet-ids[key]
        nsg_id  = module.nsg.nsg-ids[var.snet_config[key]["nsg"]]
      },
      # 条件添加路由表ID:仅当route_table不为空时才包含该字段
      var.snet_config[key]["route_table"] != "" ? {
        rtbl_id = module.route-table.rtbl-ids[var.snet_config[key]["route_table"]]
      } : {}
    )
  }
}

原理说明

  1. 先构建包含snet_id和nsg_id的基础对象,这是所有子网都必须包含的配置项。
  2. 通过条件表达式判断route_table的值:
    • 若值不为空字符串,则生成包含rtbl_id的对象;
    • 若为空,则生成空对象{},不会添加任何新键。
  3. 最后用merge函数合并基础对象和条件生成的对象,从而动态控制rtbl_id字段的存在。

扩展适配

如果需要兼容route_table字段不存在的场景(而非仅为空字符串),可以改用lookup函数做更健壮的判断:

lookup(var.snet_config[key], "route_table", "") != "" ? {
  rtbl_id = module.route-table.rtbl-ids[var.snet_config[key]["route_table"]]
} : {}

内容的提问来源于stack exchange,提问作者AndyB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:15:19