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

如何在Terraform中实现GCP防火墙规则allow/deny块的条件切换?

GCP Terraform 防火墙规则allow/deny块条件切换实现方法

核心实现依赖Terraform的dynamic动态嵌套块能力,为allow和deny块配置互斥的生成条件,即可保证同一时间只会生成其中一类块,符合GCP防火墙规则的配置约束。

实现代码示例

假设你原有的var.somevariable变量每个规则项新增action字段,可选值为allow/deny,适配后的资源配置如下:

resource "google_compute_firewall" "fw" {
  count = length(keys(var.somevariable))
  # 此处保留你原有其他通用配置,比如名称、所属VPC、源目地址范围等
  name    = "fw-rule-${element(keys(var.somevariable), count.index)}"
  network = var.vpc_network

  # 动作是allow时才生成allow块
  dynamic "allow" {
    for_each = var.somevariable[element(keys(var.somevariable), count.index)]["action"] == "allow" ? [1] : []
    content {
      protocol = var.somevariable[element(keys(var.somevariable), count.index)]["protocol"]
      ports    = var.somevariable[element(keys(var.somevariable), count.index)]["ports"]
    }
  }

  # 动作是deny时才生成deny块
  dynamic "deny" {
    for_each = var.somevariable[element(keys(var.somevariable), count.index)]["action"] == "deny" ? [1] : []
    content {
      protocol = var.somevariable[element(keys(var.somevariable), count.index)]["protocol"]
      ports    = var.somevariable[element(keys(var.somevariable), count.index)]["ports"]
    }
  }
}

其他适配场景

如果你不需要按单条规则单独控制动作,想用全局变量统一控制所有规则的动作,只需修改两个dynamic块的判断条件即可:

  • 首先定义全局控制变量:
variable "default_fw_action" {
  type    = string
  default = "allow"
  validation {
    condition     = contains(["allow", "deny"], var.default_fw_action)
    error_message = "动作只能是allow或deny。"
  }
}
  • 将dynamic块的for_each改为对应判断:
    • allow块:for_each = var.default_fw_action == "allow" ? [1] : []
    • deny块:for_each = var.default_fw_action == "deny" ? [1] : []

注意事项

该实现要求Terraform版本 >= 0.12.20,更早版本不支持dynamic动态块语法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:24:03