首页 > 解决方案 > 在 azure 中使用 terraform 创建资源组:创建后无法直接找到资源组

问题描述

我即将在 azure 中创建一个带有 terraform 的小型 VM,但遇到了一个奇怪的问题。Terraform 创建了我的资源组,但在创建属于资源组的下一个对象(VNet)时立即失败:

resource "azurerm_resource_group" "simple_vm" {
  name     = "simple_vm"
  location = "westeurope"
}

resource "azurerm_virtual_network" "main" {
  name                = "main"
  address_space       = ["10.0.0.0/16"]
  location            = "westeurope"
  resource_group_name = "simple_vm"
}

调用terraform apply结果:

* azurerm_virtual_network.main: 1 error(s) occurred:

* azurerm_virtual_network.main: Error Creating/Updating Virtual Network "main" (Resource Group "simple_vm"): network.VirtualNetworksClient#CreateOrUpdate: Failure sending request: StatusCode=0 -- Original Error: autorest/azure: Service returned an error. Status=404 Code="ResourceGroupNotFound" Message="Resource group 'simple_vm' could not be found."

查看网页界面显示,资源组已创建。第二次调用terraform apply正确找到它并在资源组内创建 VNet。

对我来说,这看起来像是 terraform 尝试在资源组中创建对象,而它尚未在 azure 中完全实例化。我观察到公共 IP 的类似行为:我创建了一个具有公共 IP 的 VM,并包含一个output ...用于打印 VM 的公共 IP。第一次运行时,输出为空(但没有错误消息)。输出后terraform refresh填充IP。

难道我做错了什么?这是 terraform 中的错误吗?

标签: azureterraform

解决方案


您需要像这样创建一个隐式依赖项:

resource "azurerm_virtual_network" "main" {
  name                = "main"
  address_space       = ["10.0.0.0/16"]
  location            = "westeurope"
  resource_group_name = "${azurerm_resource_group.simple_vm.name}"
}

通过这种方式,Terraform知道它需要先创建资源组,然后才能创建 vNet。

从 Terraform 的角度来看,您的原始代码仅具有 2 个独立资源。

Terraform 关于这方面的文档很有用。depends_on通常,除非绝对必须,否则您不希望设置显式 ( ) 依赖项。


推荐阅读