Я собираюсь создать небольшую виртуальную машину с terraform в лазурном и столкнулся с любопытной проблемой. Terraform создает мою группу ресурсов, но сразу перестает работать при создании следующего объекта (виртуальной сети), который является частью группы ресурсов:

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 во второй раз правильно находит его и создает виртуальную сеть внутри группы ресурсов.

Мне кажется, что terraform пытается создать объекты в группе ресурсов, пока она еще не полностью создана в Azure. Я наблюдал похожее поведение с общедоступными IP-адресами: я создал виртуальную машину с общедоступным IP-адресом и включил output ... для печати общедоступного IP-адреса виртуальной машины. При первом запуске вывод пуст (хотя сообщения об ошибке нет). После terraform refresh вывод заполняется IP.

Я делаю что-то неправильно? Это ошибка в terraform?

0
briconaut 20 Авг 2018 в 18:15

3 ответа

Лучший ответ

Вам нужно создать неявную зависимость, например:

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 знает , что ему нужно сначала создать группу ресурсов, прежде чем она сможет создать виртуальную сеть.

С точки зрения Terraform ваш исходный код просто имеет 2 независимых ресурса.

документация Terraform по этому вопросу полезна. В общем случае вы не хотите устанавливать явные (depends_on) зависимости, если только вам это не нужно.

3
KJH 20 Авг 2018 в 21:04

Вы пытаетесь использовать группу ресурсов, созданную с помощью кода сверху (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
}
0
ubèr 10 Мар 2020 в 14:25

Убедитесь, что ваши значения «провайдера» правильно экспортированы, прежде чем запускать план и применять. Иногда terraform может не знать, какую подписку / группу ресурсов нужно связать, и, следовательно, может возникнуть ресурс не найден (ошибка 404).

0
MeowRude 4 Мар 2020 в 01:58
51933811