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

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,无需额外数据源查询:

  1. 删除modules/spoke/vnet/main.tf中的data "azurerm_subnet" "vnet_subnets"块
  2. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:45:41