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

Terraform Cloudflare规则集模块问题:多规则生成多规则集

解决Cloudflare规则集Terraform模块多规则集问题

问题本质

你在cloudflare_ruleset资源层级用for_each遍历规则变量,这会让Terraform把每个规则都当成独立的资源实例,自然生成多个规则集。而直接在rules嵌套块写for_each会报错,因为Terraform不支持在嵌套块上直接用for_each,得用dynamic块来动态生成规则条目。

解决方案

把遍历逻辑移到dynamic "rule"块内部,让单个cloudflare_ruleset资源实例包含多条规则:

1. 模块内的资源定义

resource "cloudflare_ruleset" "example" {
  zone_id     = var.zone_id
  name        = "my-ruleset"
  description = "Single ruleset with multiple rules"
  kind        = "zone"
  phase       = "http_request_firewall_managed"

  # 用dynamic块遍历规则变量,生成多个rule嵌套块
  dynamic "rule" {
    for_each = var.rules
    content {
      action = rule.value.action
      expression = rule.value.expression
      description = rule.value.description
      enabled = rule.value.enabled

      # 如果有其他规则配置(比如action_parameters),按需添加
      action_parameters {
        # 示例:重定向配置,根据你的规则需求调整
        redirect {
          url = rule.value.action_parameters.redirect.url
        }
      }
    }
  }
}

2. 模块的变量定义

假设你用list(object)类型的规则变量(也可以用map,根据你的需求调整):

variable "rules" {
  type = list(object({
    action = string
    expression = string
    description = string
    enabled = bool
    action_parameters = optional(object({
      redirect = object({
        url = string
      })
    }))
  }))
  description = "List of rules to include in the ruleset"
}

3. 调用模块时传参

module "cloudflare_ruleset" {
  source = "./path/to/your/module"

  zone_id = "your-zone-id"
  rules = [
    {
      action = "redirect"
      expression = "(http.host eq 'old.example.com')"
      description = "Redirect old domain to new one"
      enabled = true
      action_parameters = {
        redirect = {
          url = "https://new.example.com$request.path"
        }
      }
    },
    {
      action = "block"
      expression = "(ip.geoip.country eq 'CN')"
      description = "Block traffic from specific country"
      enabled = true
    }
  ]
}

关键说明

  • dynamic "rule"块会遍历var.rules中的每个元素,为每个元素生成一个rule嵌套块,这样整个cloudflare_ruleset就是一个包含多条规则的单规则集。
  • 如果你的规则变量是map类型,rule.key可以用来作为规则的唯一标识符(比如规则ID),按需在rule块内使用rule.key即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:32:22