Получить идентификатор подсети из подсетей типа карта (объект)

Мне нужно получить идентификатор подсети из ресурса данных azurerm_subnet, поскольку подсеть используется в динамическом блоке azurerm_virtual_network как тип карты (объекта).

resource "azurerm_virtual_network" "example" {
  name                = "example-vnet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name

  dynamic "subnet" {
    for_each = var.subnets
    content {
      name           = subnet.value.name
      address_prefix = subnet.value.address_prefix
      security_group = azurerm_network_security_group.example[subnet.key].id
    }
  }
}

Получите второй идентификатор подсети, чтобы прикрепить его к учетной записи хранения.

resource "azurerm_storage_account" "example" {
  count                    = length(var.subnets)
  name                     = "storageaccountname"
  resource_group_name      = azurerm_resource_group.example.name
  location                 = azurerm_resource_group.example.location
  account_tier             = "Standard"
  account_replication_type = "GRS"

  network_rules {
    default_action             = "Deny"
    virtual_network_subnet_ids = ["${data.azurerm_subnet.subnetid.id}"]
  }
}

Пожалуйста, может ли кто-нибудь помочь решить, поскольку я хочу объявить подсеть в azurerm_virtual_network как динамический блок и получить подсеть, если из ресурса данных, и, пожалуйста, найдите мой terraform.tfvars, как показано ниже.

subnets = {
  subnet1 = {
    name           = "subnet1"
    address_prefix = "10.0.0.0/24"
  }
  subnet2 = {
    name           = "subnet2"
    address_prefix = "10.0.1.0/24"
  }
  subnet3 = {
    name           = "subnet3"
    address_prefix = "10.0.2.0/24"
  }
}

Текущий подход имеет несколько недостатков. (1). вы используете счет на azurerm_storage_account с length(var.subnets), который по вашему tfvars равен 3. что логически неверно, вы не можете создать три учетные записи хранения с одинаковым именем. (2). Вы используете источник данных для ввода, но не определили его в коде. Необходимы дополнительные сведения, сообщение об ошибке и то, чего именно вы хотите достичь, одна учетная запись хранения с сетевыми правилами, разрешающая одну подсеть или динамическую stg. учетные записи на основе подсетей и с сопоставлением один к одному в сетевых правилах.

ishuar 18.02.2023 14:31
security_group = azurerm_network_security_group.example[subnet.key].id. это также выглядит подозрительно, но, поскольку соответствующий код не используется совместно, я не могу делать прямые комментарии.
ishuar 18.02.2023 14:35

Registry.terraform.io/providers/hashicorp/azurerm/latest/doc‌​s/…

srilakshmi ch 19.02.2023 05:50

Ниже я использовал для получения определенного идентификатора подсети по имени как var.subnets.subnet2.name (но мне нужно решение без указания имени, и оно должно получить второй идентификатор подсети) данные блока данных «azurerm_subnet» «subnetid» { name = var. subnets.subnet2.name имя_виртуальной_сети = azurerm_virtual_network.example.name имя_группы_ресурсов = azurerm_virtual_network.example.имя_группы_ресурсов depend_on = [ azurerm_virtual_network.example] }

srilakshmi ch 19.02.2023 18:08
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
2
4
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ВАЖНЫЙ

count = length(var.subnets) в ресурсе "azurerm_storage_account" "example" {} все еще есть в вашем вопросе, который логически неверен, как я указал в комментариях.

Отвечать

Учитывая ваши комментарии, я предполагаю, что вы хотите использовать id из subnet2 в network_rules ресурса "azurerm_storage_account" "example" {}. С вашим текущим подходом, когда при создании подсетей в виртуальном сетевом ресурсе вы должны использовать выражения splat и локальные, чтобы создать карту из set объекта, а затем можете напрямую ссылаться туда, где это необходимо.

При выполнении ссылок даже с помощью locals и splat expressions по-прежнему требуется использовать имя подсети, поскольку terraform не может знать, что вы хотите, без каких-либо данных.

resource "azurerm_virtual_network" "example" {
  name                = "example-vnet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name

  dynamic "subnet" {
    for_each = var.subnets

    content {
      name           = subnet.value.name
      address_prefix = subnet.value.address_prefix
      # security_group = azurerm_network_security_group.example[subnet.key].id ## I have ignored it as no relevant code is shared### 
    }
  }
}

locals {
  subnets = { for subnet in azurerm_virtual_network.example.subnet : subnet.name => subnet }
}

resource "azurerm_storage_account" "example" {
  #count                    = length(var.subnets) ## Removed it too as logically incorrect with the current code ##
  name                     = "storageaccountname"
  resource_group_name      = azurerm_resource_group.example.name
  location                 = azurerm_resource_group.example.location
  account_tier             = "Standard"
  account_replication_type = "GRS"

  network_rules {
    default_action             = "Deny"
    virtual_network_subnet_ids = [local.subnets.subnet2.id]
  }

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

Тем не менее, я предлагаю использовать ресурс azurerm_subnet для удобства использования, несмотря на создание подсетей в самом ресурсе виртуальной сети, поскольку вам могут понадобиться Microsoft.Storage service_endpoints в ваших подсетях для работы с учетной записью хранения с network_rules.

Привет, Ишуар, спасибо за ваш ответ, и это сработало. Просто хочу проверить, есть ли у нас какое-либо решение для получения именно 2-й подсети на карте (объект) вместо жестко заданного значения virtual_network_subnet_ids = [local.subnets.subnet2.id] (subnet2). И я полностью согласен с вашим утверждением об отделении ресурса подсети от ресурса azurerm_virtual_network.

srilakshmi ch 21.02.2023 01:20

Другие вопросы по теме