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
相关产品推荐
相关产品推荐

