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

