Назад | Перейти на главную страницу

Terraform - код состояния = 404 (ResourceNotFound)

Я использую Terraform несколько недель, и это отличный инструмент.

Однако в последнее время во время развертывания я получал множество ошибок.

У меня есть базовый файл .tf для развертывания Azure, в котором создаются все необходимые компоненты. Но по какой-то причине я продолжаю получать ResourceNotFound. Если я перезапущу скрипт, он будет работать нормально.

Главный виновник - ресурс «azurerm_virtual_network». Кажется, что любые ресурсы, которые являются зависимыми от них, терпят неудачу, потому что виртуальная сеть все еще «Создает ...», когда пытается добавить правила NSG или «azurerm_subnet».

Это не шоу-стоп, это скорее досада! Есть ли способ предотвратить эту ошибку?

На стороне нет: мне также, кажется, нужно развернуть правила NSG после того, как все было применено, иначе правила NSG, похоже, не влияют. В настоящее время у меня есть 2 файла .tf в разных папках, которые я запускаю по порядку, и правила NSG отлично справляются с этим. Хотя, если возможно, я бы предпочел все это в одном файле?

// Virtual Network
resource "azurerm_virtual_network" "Prod_VirtualNetwork" {
  name          = "virtual-network"
  address_space = ["10.1.0.0/16"]
  location      = "${var.azurerm_location}"

  resource_group_name = "${azurerm_resource_group.Prod_RG.name}"
}

// Subnet configurtion
resource "azurerm_subnet" "Prod_subnet" {
  name                 = "${var.azurerm_prefix}-subnet"
  resource_group_name  = "${azurerm_resource_group.Prod_RG.name}"
  virtual_network_name = "virtual-network"
  address_prefix       = "10.1.12.0/24"
}

// Network Security group for Web Servers
resource "azurerm_network_security_group" "Prod_nsg_Webservers" {
  name     = "${var.azurerm_prefix}-nsg-web-01"
  location = "${var.azurerm_location}"
  resource_group_name = "${azurerm_resource_group.Prod_RG.name}"
}

// Network Security group for DB Servers
resource "azurerm_network_security_group" "Prod_nsg_DBservers" {
  name     = "${var.azurerm_prefix}-nsg-db-01"
  location = "${var.azurerm_location}"
  resource_group_name = "${azurerm_resource_group.Prod_RG.name}"
}

// Network Security group rule for RDP inbound to Web01
resource "azurerm_network_security_rule" "Prod_nsgrule_RDP_Web01" {
  name                        = "Web-RDP-IN"
  priority                    = 200
  direction                   = "Inbound"
  access                      = "Allow"
  protocol                    = "Tcp"
  source_port_range           = "3389"
  destination_port_range      = "3389"
  source_address_prefix       = ""
  destination_address_prefix  = "10.1.12.5"
  resource_group_name         = "${azurerm_resource_group.Prod_RG.name}"
  network_security_group_name = "${var.azurerm_prefix}-nsg-web-01"
}

// Network Security group rule for web/80 inbound to Web01
resource "azurerm_network_security_rule" "Prod_nsgrule_http_Web01" {
  name                        = "Web-HTTP-IN"
  priority                    = 100
  direction                   = "Inbound"
  access                      = "Allow"
  protocol                    = "Tcp"
  source_port_range           = "80"
  destination_port_range      = "80"
  source_address_prefix       = "*"
  destination_address_prefix  = "10.1.12.5"
  resource_group_name         = "${azurerm_resource_group.Prod_RG.name}"
  network_security_group_name = "${var.azurerm_prefix}-nsg-web-01"
}

// Network Security group rule for Octopus Deploy inbound to Web01
resource "azurerm_network_security_rule" "Prod_nsgrule_octopus_Web01" {
  name                        = "Web-Octo-IN"
  priority                    = 110
  direction                   = "Inbound"
  access                      = "Allow"
  protocol                    = "Tcp"
  source_port_range           = "10933"
  destination_port_range      = "10933"
  source_address_prefix       = ""
  destination_address_prefix  = "10.1.12.5"
  resource_group_name         = "${azurerm_resource_group.Prod_RG.name}"
  network_security_group_name = "${var.azurerm_prefix}-nsg-web-01"
}

// Network Security group rule for Octopus Deploy inbound to DB01
resource "azurerm_network_security_rule" "Prod_nsgrule_octopus_DB01" {
  name                        = "DB-Octo-IN"
  priority                    = 120
  direction                   = "Inbound"
  access                      = "Allow"
  protocol                    = "Tcp"
  source_port_range           = "10933"
  destination_port_range      = "10933"
  source_address_prefix       = ""
  destination_address_prefix  = "10.1.12.4"
  resource_group_name         = "${azurerm_resource_group.Prod_RG.name}"
  network_security_group_name = "${var.azurerm_prefix}-nsg-db-01"
}

// Network Security group rule for RDP inbound to DB01
resource "azurerm_network_security_rule" "Prod_nsgrule_RDP_DB01" {
  name                        = "DB-RDP-IN"
  priority                    = 220
  direction                   = "Inbound"
  access                      = "Allow"
  protocol                    = "Tcp"
  source_port_range           = "3389"
  destination_port_range      = "3389"
  source_address_prefix       = ""
  destination_address_prefix  = "10.1.12.4"
  resource_group_name         = "${azurerm_resource_group.Prod_RG.name}"
  network_security_group_name = "${var.azurerm_prefix}-nsg-db-01"
}

Я не вижу явной зависимости между вашей виртуальной сетью и подсетью, вы жестко запрограммировали имя сети, поэтому я не думаю, что Terraform создаст зависимость.

Если вы измените определение подсети на:

resource "azurerm_subnet" "Prod_subnet" {
  name                 = "${var.azurerm_prefix}-subnet"
  resource_group_name  = "${azurerm_resource_group.Prod_RG.name}"
  virtual_network_name = "${azurerm_virtual_network.Prod_VirtualNetwork.name}"
  address_prefix       = "10.1.12.0/24"
}

Это должно дать Terraform ключ к пониманию того, что один должен быть создан раньше другого.