使用Terraform创建Azure应用网关时遇变量及后端池报错求助
解决Terraform创建Azure应用网关的三个错误
1. 修复"Unknown variable 'var'"错误
这两个错误的核心是未定义IS_CUSTOM_NAMING变量。你在dynamic块中引用了var.IS_CUSTOM_NAMING,但代码里没有声明这个变量,Terraform无法识别该变量,才会抛出误导性的"没有名为'var'的变量"提示。
添加该变量的定义即可解决:
variable "IS_CUSTOM_NAMING" { type = bool default = false description = "控制是否使用自定义命名的后端地址池" }
2. 修复"Insufficient backend_address_pool blocks"错误
Azure应用网关强制要求至少配置1个后端地址池,当前逻辑存在两种会导致无后端池生成的情况:
IS_CUSTOM_NAMING = true但BACKEND_ADDRESS_POOL_CONFIGURATION为空列表IS_CUSTOM_NAMING = false但BACKEND_CONFIGURATION为空map
可以通过两种方式修复:
方式一:强制用户提供至少一个后端池配置
修改变量默认值,去掉空列表/空map的默认设置,强制用户必须输入配置:
variable "BACKEND_ADDRESS_POOL_CONFIGURATION" { type = list(object({ name = string backend_address_pool_ips = optional(list(string)) backend_address_pool_fqdns = optional(list(string)) })) # 移除default = [],强制用户提供配置 description = "Definition of Backend Address Pools." } variable "BACKEND_CONFIGURATION" { type = map(object({ backend_pool_ips = optional(list(string)) backend_pool_fqdns = optional(list(string)) backend_cookie_affinity = string backend_path = optional(string) backend_port = number backend_protocol = string backend_request_timeout = optional(number) trusted_root_certificate_names = optional(list(string), []) pick_host_name_from_backend_address = optional(bool) probe_interval = optional(number) probe_protocol = optional(string) probe_path = optional(string) probe_timeout = optional(number) probe_unhealthy_threshold = optional(number) probe_port = optional(number) probe_host = optional(string) probe_match_body = optional(string) probe_match_status_code = optional(list(string)) probe_pick_host_name_from_backend_http_settings = optional(bool) })) # 移除default = {},强制用户提供配置 description = "Provide settings for Application Gateway backend pool." }
方式二:添加兜底默认后端池
如果需要保留变量默认值,可以新增一个兜底的后端池块,仅当其他后端池都未配置时生效:
# 兜底默认后端池,仅无其他配置时生成 backend_address_pool { count = (length(var.BACKEND_ADDRESS_POOL_CONFIGURATION) == 0 && length(var.BACKEND_CONFIGURATION) == 0) ? 1 : 0 name = "beap-agw-default" ip_addresses = ["127.0.0.1"] # 需填写有效IP/FQDN,Azure不允许空后端池 }
3. 修复dynamic块的命名冲突
你定义了两个同名的dynamic "backend_address_pool"块,会导致Terraform报错重复块定义。可以通过两种方式解决:
方式一:合并逻辑
将两个dynamic块的逻辑合并为一个,通过变量切换取值:
dynamic "backend_address_pool" { for_each = var.IS_CUSTOM_NAMING ? var.BACKEND_ADDRESS_POOL_CONFIGURATION : values(var.BACKEND_CONFIGURATION) content { name = var.IS_CUSTOM_NAMING ? backend_address_pool.value.name : "beap-agw-${backend_address_pool.key}" ip_addresses = var.IS_CUSTOM_NAMING ? backend_address_pool.value.backend_address_pool_ips : backend_address_pool.value.backend_pool_ips fqdns = var.IS_CUSTOM_NAMING ? backend_address_pool.value.backend_address_pool_fqdns : backend_address_pool.value.backend_pool_fqdns } }
方式二:设置不同迭代器名称
给两个dynamic块指定不同的iterator名称,避免冲突:
dynamic "backend_address_pool" { for_each = var.IS_CUSTOM_NAMING ? var.BACKEND_ADDRESS_POOL_CONFIGURATION : [] iterator = custom_pool content { name = custom_pool.value.name ip_addresses = custom_pool.value.backend_address_pool_ips fqdns = custom_pool.value.backend_address_pool_fqdns } } dynamic "backend_address_pool" { for_each = var.IS_CUSTOM_NAMING ? {} : var.BACKEND_CONFIGURATION iterator = default_pool content { name = "beap-agw-${default_pool.key}" ip_addresses = default_pool.value.backend_pool_ips fqdns = default_pool.value.backend_pool_fqdns } }
内容的提问来源于stack exchange,提问作者Sabrina Meziani
相关产品推荐
相关产品推荐

