我将要创建一个具有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中的错误吗?
答案 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
}