Мне нужно получить идентификатор подсети из ресурса данных 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"
}
}
security_group = azurerm_network_security_group.example[subnet.key].id
. это также выглядит подозрительно, но, поскольку соответствующий код не используется совместно, я не могу делать прямые комментарии.
Registry.terraform.io/providers/hashicorp/azurerm/latest/docs/…
Ниже я использовал для получения определенного идентификатора подсети по имени как 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] }
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.
Текущий подход имеет несколько недостатков. (1). вы используете счет на
azurerm_storage_account
сlength(var.subnets)
, который по вашемуtfvars
равен3
. что логически неверно, вы не можете создать три учетные записи хранения с одинаковым именем. (2). Вы используете источник данных для ввода, но не определили его в коде. Необходимы дополнительные сведения, сообщение об ошибке и то, чего именно вы хотите достичь, одна учетная запись хранения с сетевыми правилами, разрешающая одну подсеть или динамическую stg. учетные записи на основе подсетей и с сопоставлением один к одному в сетевых правилах.