Terraform报错:模块weu_vnet中未声明azurerm_virtual_network数据源
问题原因
报错核心是vnet模块中引用了未声明的数据源data.azurerm_virtual_network.vnet:
模块内实际创建的是资源resource "azurerm_virtual_network" "vnet",但在data "azurerm_subnet"块中错误使用了data.azurerm_virtual_network.vnet(该数据源从未定义),导致Terraform无法找到对应资源。
解决方案
推荐两种修复方式,第二种更简洁高效:
方式1:修正数据源引用(保留data块)
修改modules/spoke/vnet/main.tf中的data "azurerm_subnet"块,将所有data.azurerm_virtual_network.vnet替换为已创建的资源azurerm_virtual_network.vnet:
resource "azurerm_virtual_network" "vnet" { name = local.vnet_name subnet { name = "vms" } ... } data "azurerm_subnet" "vnet_subnets" { name = azurerm_virtual_network.vnet.subnets[count.index] virtual_network_name = azurerm_virtual_network.vnet.name resource_group_name = azurerm_virtual_network.vnet.resource_group_name count = length(azurerm_virtual_network.vnet.subnets) }
方式2:直接从资源提取子网ID(更优,无需data块)
由于子网是通过azurerm_virtual_network的嵌套subnet块创建的,Terraform会自动在资源属性中包含子网ID,无需额外数据源查询:
- 删除
modules/spoke/vnet/main.tf中的data "azurerm_subnet" "vnet_subnets"块 - 修改
modules/spoke/vnet/outputs.tf,直接从虚拟网络资源提取子网ID:
output "vnet_subnet_ids" { value = [for subnet in azurerm_virtual_network.vnet.subnets : subnet.id] }
验证
修改完成后执行terraform init和terraform plan,报错会消失,VM模块可正常获取子网ID。
内容的提问来源于stack exchange,提问作者Carlos Garcia
相关产品推荐
相关产品推荐

