Terraform部署Azure本地网络网关时插件崩溃求助
解决Terraform部署Azure本地网络网关的插件Panic错误
问题现象
执行terraform apply部署Azure本地网络网关时,出现插件无响应,同时azurerm_v3.0.0_x5插件触发panic错误:
interface conversion: interface {} is nil, not string
配置代码参考
local_gw.tf
resource "azurerm_local_network_gateway" "local_gw" { name = var.azurerm_local_network_gateway_name location = var.location resource_group_name = var.rg_name gateway_address = var.gateway_address address_space = var.local_gw_address_space # The gateway IP address to connect with tags = merge(var.common_tags) }
main.tf
locals { azurerm_local_network_gateway_name = "local-gw" gateway_address = "" local_gw_address_space = [""] common_tags = { "environment" = "test" "managedby" = "devops" "developedby" = "jananath" } project = "mysvg" resource_location = "Germany West Central" } # Local Gateway module "local_gateway" { source = "./modules/local-gateway" location = local.resource_location rg_name = var.rg_name azurerm_local_network_gateway_name = var.azurerm_local_network_gateway_name gateway_address = var.gateway_address local_gw_address_space = var.local_gw_address_space common_tags = merge( local.common_tags, { "Name" = "${local.project}-${var.azurerm_local_network_gateway_name}" }, ) }
provider.tf
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "=3.0.0" } } backend "azurerm" { resource_group_name = "shared-resources" storage_account_name = "janasvtfstate" container_name = "tfstate" key = "terraform.tfstate" } } # Configure the Microsoft Azure Provider provider "azurerm" { features {} }
错误原因分析
- 无效配置传递:
gateway_address被设为空字符串,local_gw_address_space包含空字符串,这些无效值传递给AzureRM插件后,v3.0.0版本的插件无法正确处理,触发类型转换panic。 - 变量传递错误:模块调用时使用了未赋值的
var.gateway_address和var.local_gw_address_space,而非local中定义的变量,导致实际传入资源的是nil或空值。 - 插件版本缺陷:azurerm v3.0.0存在已知的空值处理bug,对必填字段的空值校验不严谨,容易触发panic。
修复步骤
1. 修正配置值,提供有效参数
gateway_address必须是本地网关的公网IP地址,local_gw_address_space必须是本地网络的CIDR地址列表,不能为空。修改main.tf中的locals:
locals { azurerm_local_network_gateway_name = "local-gw" gateway_address = "1.2.3.4" # 替换为实际的本地网关公网IP local_gw_address_space = ["192.168.0.0/24", "10.0.0.0/16"] # 替换为实际的本地网络CIDR # 其余配置保持不变 }
2. 修正模块变量传递
模块调用时应使用local中定义的有效变量,而非未赋值的var:
module "local_gateway" { source = "./modules/local-gateway" location = local.resource_location rg_name = var.rg_name azurerm_local_network_gateway_name = local.azurerm_local_network_gateway_name gateway_address = local.gateway_address local_gw_address_space = local.local_gw_address_space common_tags = merge( local.common_tags, { "Name" = "${local.project}-${local.azurerm_local_network_gateway_name}" }, ) }
3. 升级AzureRM插件版本
v3.0.0版本存在较多已知问题,建议升级到较新的稳定版本,修改provider.tf中的版本约束:
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = ">= 3.60.0" # 使用最新稳定版本,或指定具体版本如3.89.0 } } # 其余backend配置保持不变 }
4. 重新初始化并部署
执行以下命令应用修复:
terraform init -upgrade terraform apply
内容的提问来源于stack exchange,提问作者Jananath Banuka
相关产品推荐
相关产品推荐

