如何在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] : []
- allow块:
注意事项
该实现要求Terraform版本 >= 0.12.20,更早版本不支持dynamic动态块语法。
内容的提问来源于stack exchange,提问作者floormind
相关产品推荐
相关产品推荐

