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

Terraform Azure CDN Frontdoor规则动态块多条件内容配置问题

Terraform Azure CDN Frontdoor 规则动态条件块实现方案

核心思路

每个Terraform动态块只能对应一种特定的条件类型(比如host_name_condition、is_device_condition),不能在单个动态块中混合生成多种条件。正确的做法是为每种条件类型单独定义动态块,通过变量传入的配置来控制是否生成对应块。

实现步骤

1. 定义模块变量

创建一个变量接收所有条件的配置,每个条件包含类型标识和对应参数:

variable "rule_conditions" {
  type = list(object({
    type                = string
    # 通用可选参数
    name                = optional(string)
    negate_condition    = optional(bool, false)
    # 各类型专属参数
    host_name           = optional(string)
    operator            = optional(string)
    device_type         = optional(string)
    post_args_name      = optional(string)
    post_args_values    = optional(list(string))
  }))
  default = []
  description = "Frontdoor规则条件列表,支持类型:host_name_condition、is_device_condition、post_args_condition"
}

2. 编写动态块

为每种条件类型单独编写动态块,通过for_each筛选对应类型的配置:

resource "azurerm_cdn_frontdoor_rule" "example" {
  name                     = "example-rule"
  cdn_frontdoor_rule_set_id = azurerm_cdn_frontdoor_rule_set.example.id
  order                    = 1

  # 主机名条件动态块
  dynamic "host_name_condition" {
    for_each = [for c in var.rule_conditions : c if c.type == "host_name_condition"]
    content {
      name                = host_name_condition.value.name
      negate_condition    = host_name_condition.value.negate_condition
      host_name           = host_name_condition.value.host_name
      operator            = host_name_condition.value.operator
    }
  }

  # 设备类型条件动态块
  dynamic "is_device_condition" {
    for_each = [for c in var.rule_conditions : c if c.type == "is_device_condition"]
    content {
      name                = is_device_condition.value.name
      negate_condition    = is_device_condition.value.negate_condition
      device_type         = is_device_condition.value.device_type
    }
  }

  # POST参数条件动态块
  dynamic "post_args_condition" {
    for_each = [for c in var.rule_conditions : c if c.type == "post_args_condition"]
    content {
      name                = post_args_condition.value.name
      negate_condition    = post_args_condition.value.negate_condition
      post_args_name      = post_args_condition.value.post_args_name
      operator            = post_args_condition.value.operator
      post_args_values    = post_args_condition.value.post_args_values
    }
  }

  # 示例规则动作
  action {
    url_redirect_action {
      redirect_type = "Moved"
      destination   = "https://example.com"
    }
  }
}

3. 模块使用示例

调用模块时,按需传入需要的条件配置:

module "frontdoor_rule" {
  source = "./modules/frontdoor-rule"

  rule_conditions = [
    {
      type                = "host_name_condition"
      name                = "MatchHost"
      negate_condition    = false
      host_name           = "*.example.com"
      operator            = "Equal"
    },
    {
      type                = "is_device_condition"
      name                = "MobileDevice"
      negate_condition    = false
      device_type         = "Mobile"
    }
  ]
}

关键说明

  • 每个动态块仅处理一种条件类型,避免了"单个动态块多个content"的报错。
  • 通过for_each的筛选逻辑,只有当rule_conditions中存在对应类型的配置时,才会生成对应的条件块,解决了必填参数缺失的问题。
  • 变量中的optional关键字确保不同条件类型的专属参数可以按需传入,不会强制要求所有参数都存在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:59:57