在Azure中创建具有Terraform的资源组:创建资源组后无法直接找到它

时间:2018-08-20 15:15:58

标签: azure terraform

我将要创建一个具有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."

在显示的Web界面上,已创建资源组。再次调用terraform apply可以正确找到它并在资源组内创建VNet。

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

我做错什么了吗?这是Terraform中的错误吗?

3 个答案:

答案 0 :(得分:1)

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

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的documentation很有用。通常,除非绝对必要,否则您不想设置显式(depends_on)依赖项。

答案 1 :(得分:1)

在运行计划和应用之前,请确保已正确导出“提供商”值。有时terraform可能不知道需要关联哪个订阅/资源组,因此可能会出现找不到资源(404错误)的情况。

答案 2 :(得分:0)

您正尝试使用通过顶部代码(azurerm_resource_group.simple_vm.name)创建的资源组

我还可以看到您使用的是同一位置,因此可以在vnet模块中设置如下位置: azurerm_resource_group.simple_location

因此您的代码应如下所示

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            = azurerm_resource_group.simple_vm.location
  resource_group_name = azurerm_resource_group.simple_vm.name
}