【问题标题】:Creating a resource group with terraform in azure: Cannot find resource group directly after creating it在 azure 中使用 terraform 创建资源组:创建后无法直接找到资源组
【发布时间】:2019-01-26 18:20:44
【问题描述】:

我即将在 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 中的错误吗?

【问题讨论】:

  • 这只是一个与stackoverflow.com/questions/51932165/… 一样的通用依赖排序问题。使用depends on 或将资源组的结果插入到虚拟网络资源中,以便 Terraform 知道按什么顺序执行操作。我猜我们可能应该为此创建一个通用的、规范的问题/答案组合。
  • 这是一个插值示例。正如 ydestskorR 所说,这将为您设置依赖项。 resource_group_name = "${azurerm_resource_group.simple_vm.name}"

标签: azure terraform


【解决方案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) 依赖项。

【讨论】:

  • 我不敢相信我自己没有弄清楚这一点。谢谢。
  • 对于我们这些使用 terraform 0.12 resource_group_name = azurerm_resource_group.simple_vm.name
【解决方案2】:

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

【讨论】:

  • 您能解释一下如何导出提供者值吗?
  • 这解决了我的问题。我忘记在提供程序块中包含租户和订阅。 provider "azurerm" { subscription_id = var.subscription_id tenant_id = var.tenant_id features {} }
【解决方案3】:

您正在尝试使用使用顶部代码创建的资源组 (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
}

【讨论】:

    猜你喜欢
    • 2020-11-18
    • 2020-10-31
    • 2022-07-24
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2020-11-20
    相关资源
    最近更新 更多