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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 11:47:43