Terraform部署Azure Databricks时虚拟网络未找到及操作取消问题
Azure Databricks Terraform部署错误:虚拟网络未找到/操作被取消
错误根因
1. ResourceNotFound(虚拟网络未找到)
- 核心问题是资源创建顺序错误:Terraform默认并行创建无依赖的资源,Databricks工作区会在虚拟网络完成部署前发起关联请求,导致Azure端找不到目标虚拟网络。
- 额外可能:Provider中配置的
resource_group与虚拟网络所在资源组不匹配,导致Terraform在错误的资源组下查找虚拟网络。
2. Operation was canceled(虚拟网络操作被子网取消)
- 这是子网与虚拟网络并发创建的冲突:未声明依赖时,Terraform同时触发虚拟网络和子网的创建请求。Azure要求子网必须依附已存在的虚拟网络,当子网请求先到达时,会触发虚拟网络创建,但后续虚拟网络的独立创建请求会被子网的关联操作覆盖,导致原创建任务被取消。
错误复现
- 编写未声明依赖的Terraform代码(示例如下):
resource "azurerm_resource_group" "example" { name = "example-rg" location = "eastus" } resource "azurerm_virtual_network" "example" { name = "example-vnet" address_space = ["10.0.0.0/16"] location = azurerm_resource_group.example.location resource_group_name = azurerm_resource_group.example.name } resource "azurerm_subnet" "databricks" { name = "databricks-subnet" resource_group_name = azurerm_resource_group.example.name virtual_network_name = azurerm_virtual_network.example.name address_prefixes = ["10.0.1.0/24"] } resource "azurerm_databricks_workspace" "example" { name = "example-databricks" location = azurerm_resource_group.example.location resource_group_name = azurerm_resource_group.example.name sku = "Premium" custom_virtual_network_id = azurerm_virtual_network.example.id public_subnet_name = azurerm_subnet.databricks.name private_subnet_name = azurerm_subnet.databricks.name } - 执行
terraform init && terraform apply,首次运行会触发ResourceNotFound,因为Databricks工作区先尝试关联未创建的虚拟网络。 - 移除Provider中的
resource_group配置后再次执行terraform apply,会触发Operation was canceled错误,因为子网与虚拟网络的创建请求并发导致冲突。
修复方案
- 显式声明资源依赖:通过
depends_on强制指定创建顺序,确保虚拟网络先于子网创建,子网先于Databricks工作区创建:resource "azurerm_subnet" "databricks" { name = "databricks-subnet" resource_group_name = azurerm_resource_group.example.name virtual_network_name = azurerm_virtual_network.example.name address_prefixes = ["10.0.1.0/24"] depends_on = [azurerm_virtual_network.example] } resource "azurerm_databricks_workspace" "example" { name = "example-databricks" location = azurerm_resource_group.example.location resource_group_name = azurerm_resource_group.example.name sku = "Premium" custom_virtual_network_id = azurerm_virtual_network.example.id public_subnet_name = azurerm_subnet.databricks.name private_subnet_name = azurerm_subnet.databricks.name depends_on = [azurerm_subnet.databricks, azurerm_virtual_network.example] } - 统一资源组配置:确保Provider中指定的
resource_group与所有资源的resource_group_name一致,避免跨资源组查找错误。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

