Можно ли использовать адресное пространство VNET для префикса адреса источника NSG?

Я хотел бы разрешить трафик через NSG из всех локальных подсетей (кроме одноранговых подсетей). Поскольку у меня есть только одно адресное пространство, кажется, что наиболее прямой способ сделать это - использовать address_space VNET в качестве префикса source_address_prefix правила безопасности.

resource "azurerm_resource_group" "west01-rg" {
  name     = "west01-rg"
  location = "West US"
}

resource "azurerm_virtual_network" "virtual-network" {
  name                = "west01-vnet"
  location            = "${azurerm_resource_group.west01-rg.location}"
  resource_group_name = "${azurerm_resource_group.west01-rg.name}"
  address_space       = ["10.10.20.0/21"]
}

resource "azurerm_subnet" "servers-subnet" {
  name                 = "ServersNet"
  resource_group_name  = "${azurerm_resource_group.west01-rg.name}"
  virtual_network_name = "${azurerm_virtual_network.virtual-network.name}"
  address_prefix       = "10.10.20.0/24"
}

resource "azurerm_network_security_group" "dc-nsg" {
  name                = "dc-nsg"
  location            = "${azurerm_resource_group.west01-rg.location}"
  resource_group_name = "${azurerm_resource_group.west01-rg.name}"

  security_rule {
    name                       = "AllowCidrSubnet"
    priority                   = 100
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "*"
    source_port_range          = "*"
    destination_port_range     = "*"
    source_address_prefix      = "${azurerm_virtual_network.virtual-network.address_space}"
    destination_address_prefix = "*"
  }

  tags {
    environment = "Testing"
  }
}

Согласно документации, это значение может быть в нотации CIDR. Однако мой пример выше приводит к ошибке

Error: azurerm_network_security_group.dc: security_rule.0.source_address_prefix must be a single value, not a list

Если я переключаюсь на source_address_prefixes, который должен принимать список, я получаю эту ошибку

Error: azurerm_network_security_group.dcx: security_rule.0.source_address_prefixes: should be a list

Таким образом, кажется, что значение является одновременно списком, а не списком. Должно ли это сработать? Или мне следует поступить иначе?

  • Terraform v0.11.11
  • provider.azurerm v1.21.0

person pinecone of mirth    schedule 24.01.2019    source источник


Ответы (1)


В Terraform до 0.12 каждая переменная по умолчанию является строковым типом, и если вы хотите использовать тип списка или карты, вы должны использовать этот тип последовательно при передаче переменной. Это должно измениться в Terraform 0.12, поскольку HCL2 лучше поддерживает типы, включая больше обработка сложных типов.

Чтобы решить вашу проблему, вам нужно либо проиндексировать список, чтобы вернуть один элемент, который тогда был бы строкой, либо вам нужно соответствовать вашему типу списка.

Итак, любой из них должен работать:

resource "azurerm_network_security_group" "dc-nsg" {
  name                = "dc-nsg"
  location            = "${azurerm_resource_group.west01-rg.location}"
  resource_group_name = "${azurerm_resource_group.west01-rg.name}"

  security_rule {
    name                       = "AllowCidrSubnet"
    priority                   = 100
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "*"
    source_port_range          = "*"
    destination_port_range     = "*"
    source_address_prefix      = "${azurerm_virtual_network.virtual-network.address_space[0]}"
    destination_address_prefix = "*"
  }

  tags {
    environment = "Testing"
  }
}

или используя список напрямую:

resource "azurerm_network_security_group" "dc-nsg" {
  name                = "dc-nsg"
  location            = "${azurerm_resource_group.west01-rg.location}"
  resource_group_name = "${azurerm_resource_group.west01-rg.name}"

  security_rule {
    name                       = "AllowCidrSubnet"
    priority                   = 100
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "*"
    source_port_range          = "*"
    destination_port_range     = "*"
    source_address_prefixes    = ["${azurerm_virtual_network.virtual-network.address_space}"]
    destination_address_prefix = "*"
  }

  tags {
    environment = "Testing"
  }
}
person ydaetskcoR    schedule 24.01.2019