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

如何在Terraform的for_each中动态选映射并跳过指定条目

Terraform for_each 动态映射选择与条目过滤整合方案

直接将映射选择逻辑与过滤规则整合到同一个for表达式即可,最终实现代码如下:

for_each = {
  for k, v in (var.subnet_size == "large" ? var.subnet_map_large : var.subnet_map_small) :
  k => v
  if k != "AppGatewaySubnet" && v.Add_NSG
}

逻辑拆解

  • 动态映射选择:通过三元运算符var.subnet_size == "large" ? var.subnet_map_large : var.subnet_map_small先确定要迭代的目标映射集合。
  • 双重过滤规则:在for表达式的if分句中同时实现两个跳过逻辑:
    1. 排除键为"AppGatewaySubnet"的条目:k != "AppGatewaySubnet"
    2. 排除Add_NSG属性为false的条目:v.Add_NSG(布尔值可直接作为判断条件,等价于v.Add_NSG == true)

变量结构要求

确保subnet_map_large和subnet_map_small变量的结构包含Add_NSG布尔属性,示例定义如下:

variable "subnet_map_large" {
  type = map(object({
    cidr_block = string # 子网的其他必要属性,可根据实际需求调整
    Add_NSG    = bool
  }))
}

variable "subnet_map_small" {
  type = map(object({
    cidr_block = string
    Add_NSG    = bool
  }))
}

兼容你找到的compact写法(可选)

如果偏好使用compact函数的过滤方式,也可以写成如下形式(但需要重复映射选择逻辑,不如第一种方案简洁):

for_each = {
  for k in compact([
    for k, v in (var.subnet_size == "large" ? var.subnet_map_large : var.subnet_map_small) :
    (k != "AppGatewaySubnet" && v.Add_NSG) ? k : ""
  ]) : k => (var.subnet_size == "large" ? var.subnet_map_large : var.subnet_map_small)[k]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:17:16