Можно ли использовать адресное пространство VNET для префикса адреса источника NSG? - PullRequest
0 голосов
/ 24 января 2019

Я хотел бы разрешить трафик через NSG из всех локальных подсетей (не включая одноранговые подсети). Поскольку у меня есть только одно адресное пространство, кажется, что наиболее прямой способ сделать это - использовать адресное пространство 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

1 Ответ

0 голосов
/ 24 января 2019

В Terraform pre 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"
  }
}
...