Как я могу связать NSG и подсети, создаваемые циклами в Terraform?

Вот код, который я использую для создания подсетей и nsgs.Я хочу связать NSG и подсеть в одном скрипте, но я не могу понять, как я могу получить идентификаторы подсети и идентификаторы NSG, которые создаются здесь, и использовать их в ассоциации. ресурс. Заранее спасибо за помощь !

Первая часть кода используется для создания n подсетей и групп безопасности сети в зависимости от параметра

provider "azurerm" {

  version = "2.0.0"
  features {}
}

resource "azurerm_resource_group" "new-rg" {
  name     = var.rg_name
  location = "West Europe"
}

resource "azurerm_virtual_network" "new-vnet" {
  name                = var.vnet_name
  address_space       = ["${var.vnet_address_space}"]
  location            = azurerm_resource_group.new-rg.location
  resource_group_name = azurerm_resource_group.new-rg.name


}

resource "azurerm_subnet" "test" {
  count                = "${length(var.subnet_prefix)}"
  name                 = "${element(var.subnet_subnetname, count.index)}"
  resource_group_name  = azurerm_resource_group.new-rg.name
  virtual_network_name = azurerm_virtual_network.new-vnet.name
  address_prefix       = "${element(var.subnet_prefix, count.index)}"

}


resource "azurerm_network_security_group" "new-nsg" {

    count        =  "${length(var.subnet_prefix)}"
  name                = "${element(var.subnet_subnetname, count.index)}-nsg"
  location            = azurerm_resource_group.new-rg.location
  resource_group_name = azurerm_resource_group.new-rg.name
}

Ниже приведен ресурс, в который я должен передать параметры для создания ассоциации для указанных выше подсетей и создаваемых nsgs.

Вторая часть кода. Необходимо сделать приведенный ниже код пригодным для использования в указанном выше решении при отсутствии ассоциаций.

resource "azurerm_subnet_network_security_group_association" "example" {

  subnet_id                 = azurerm_subnet.example.id
  network_security_group_id = azurerm_network_security_group.example.id
}

Как можно связать количество n подсетей и создаваемых nsgs, используя вторую часть кода, я не могу найти свой путь к этому


comment
как добавить правила безопасности nsg внутри azurerm_network_security_group new-nsg с помощью цикла, такого как security_rule {}, если у нас более одного правила для каждой подсети?   -  person s_k_t    schedule 16.02.2021


Ответы (2)


Похоже, это хороший случай для for_each. Вот код, который я использую для AWS (насколько я могу судить, применяется та же логика) -

(var.nr_azs - это просто int, используется formatlist, потому что for_each нравятся только строки)

locals {
  az_set = toset(formatlist("%s", range(var.nr_azs))) # create a list of numbers and convert them to strings)
}

resource "aws_subnet" "private" {
  for_each                = local.az_set
  availability_zone       = random_shuffle.az.result[each.key]
  cidr_block              = cidrsubnet(aws_vpc.main.cidr_block, 8, each.key)
  vpc_id                  = aws_vpc.main.id
  map_public_ip_on_launch = false
}

resource "aws_eip" "nat_gw" {
  vpc = true
}

resource "aws_nat_gateway" "gw" {
  for_each      = aws_subnet.private
  allocation_id = aws_eip.nat_gw.id
  subnet_id     = each.value.id
}

resource "aws_route_table" "private_egress" {
  for_each = aws_nat_gateway.gw
  vpc_id   = aws_vpc.main.id

  route {
    cidr_block     = "0.0.0.0/0"
    nat_gateway_id = each.value.id
  }
}

resource "aws_route_table_association" "private" {
  for_each       = local.az_set
  subnet_id      = aws_subnet.private[each.key].id
  route_table_id = aws_route_table.private_egress[each.key].id
}

person Community    schedule 04.06.2020
comment
Спасибо, Кайл, за ответ, я согласен с вашим решением, но в моем случае я использую цикл подсчета и хочу найти решение для этого с циклом подсчета, так как у меня есть особый подход к тому, что я делаю! Я очень ценю ваш ответ, и он дал мне новый подход, спасибо. - person Sarmad; 05.06.2020
comment
@Sarmad, как добавить правила безопасности nsg внутри azurerm_network_security_group new-nsg, используя цикл, такой как security_rule {}, если у нас более одного правила для каждой подсети? - person s_k_t; 16.02.2021
comment
@s_k_t Я не уверен, что вы имеете в виду, если вы можете уточнить больше. - person Sarmad; 21.02.2021

Итак, я смог решить проблему, упомянутую мной выше, следующий код содержит решение для упомянутого сценария проблемы.

resource "azurerm_subnet_network_security_group_association" "snet-nsg-association" {

count = length(var.subnet_subnetname)
subnet_id                 = element(azurerm_subnet.multi-snet.*.id, count.index)
network_security_group_id = element(azurerm_network_security_group.new-nsg.*.id, count.index)

}

person Sarmad    schedule 05.06.2020
comment
Это ошибка. Он будет уничтожен на следующем terraform apply github.com/terraform-providers/terraform- поставщик-лазурь / - person Mrinal Saurabh; 25.08.2020