Terraform配置GCP防火墙规则时按需生成log_config日志块的问题
GCP Terraform防火墙日志开关配置方案
你可以通过配置dynamic动态块的for_each条件实现按需生成log_config块的需求,修改后的完整资源配置如下:
resource "google_compute_firewall" "this" { name = var.name project = var.project network = var.network source_ranges = var.source_ranges source_tags = var.source_tags target_tags = var.target_tags priority = var.priority direction = var.direction allow { protocol = lower(var.protocol) ports = var.ports } # 按需生成日志配置块:firewall_logging为true时生成,为false时不生成 dynamic "log_config" { for_each = var.firewall_logging ? [1] : [] content { metadata = var.log_metadata } } }
实现原理
- Terraform的
dynamic块生成数量完全由for_each参数的集合长度决定:集合长度为0时不会生成对应块,长度大于0时会为每个元素生成一个块 - 三元表达式
var.firewall_logging ? [1] : []的作用是:变量为true时返回长度为1的列表,生成一个log_config块;变量为false时返回空列表,完全不生成该块
变量定义参考
你可以在variables.tf中补充对应变量声明,保证配置合法性:
variable "firewall_logging" { type = bool description = "是否启用防火墙访问日志" default = false } variable "log_metadata" { type = string description = "防火墙日志元数据配置,可选值为INCLUDE_ALL_METADATA、EXCLUDE_ALL_METADATA" default = "INCLUDE_ALL_METADATA" }
验证方式
修改配置后可以通过terraform plan命令验证效果:
- 当
var.firewall_logging设为false时,预览的资源配置中不会出现log_config相关字段 - 当
var.firewall_logging设为true时,预览的资源配置中会包含对应的log_config块
内容的提问来源于stack exchange,提问作者djsmiley2kStaysInside
相关产品推荐
相关产品推荐

