Я пытаюсь использовать код ниже
data "azurerm_resource_group" "rg_tst_na" {
name = "test1"
}
data "azurerm_resource_group" "rg_dev_na" {
name = "test2"
}
resource "azurerm_role_assignment" "test_role_assign" {
for_each = var.test_role_assignment
principal_id = azurerm_user_assigned_identity.test_setup["${each.key}_${each.value}"].principal_id # this is created as separate resource using a for_each loop this resource is validate by terraform apply
role_definition_name = "Network Contributor"
scope = data.azurerm_resource_group."${each.key}_${each.value}".id
}
variable "var.test_role_assignment" {
type = map(string)
default = {
"na" = "dev",
"na" = "tst",
}
}
Я получаю сообщение об ошибке, что область действия не может быть прочитана во время плана терраформирования. Как я могу изменить ввод атрибута ресурса?
scope = data.azurerm_resource_group.rg_"${each.value}"_"${each.key}".id
Это возможно?
Могу ли я использовать переменную в значении области в качестве атрибута ресурса, но с переменным значением? Это нарушение правил терраформирования?
Есть несколько вещей, на которые следует обратить внимание:
variable "var.test_role_assignment"
должно быть только variable "test_role_assignment"
scope
, терраформирование работает не так, и ее невозможно сделать.Однако вы можете использовать тот же for_each
для источника данных и сослаться на него в блоке ресурсов. Что-то вроде этого должно работать:
data "azurerm_resource_group" "rg_na" {
for_each = var.test_role_assignment
name = each.value
}
resource "azurerm_role_assignment" "test_role_assign" {
for_each = var.test_role_assignment
principal_id = azurerm_user_assigned_identity.test_setup["${each.key}_${each.value}"].principal_id # this is created as separate resource using a for_each loop this
resource is validate by terraform apply
role_definition_name = "Network Contributor"
scope = data.azurerm_resource_group.rg_na[each.key].id
}
variable "test_role_assignment" {
type = map(string)
default = {
"na" = "dev",
"na" = "tst",
}
}
Как я уже упоминал в ответе в пункте 2, это невозможно.
Terraform использует статический анализ ссылок, чтобы понять зависимости между ресурсами, поэтому ссылку от одного ресурса на другой необходимо записывать как статическую ссылку; динамическая оценка выражения не допускается.
Однако вы можете добиться аналогичного эффекта, определив локальное значение, которое действует как таблица поиска для ваших объектов ресурсов:
locals {
resource_groups = {
tst_na = azurerm_resource_group.rg_tst_na
dev_na = azurerm_resource_group.rg_dev_na
}
}
В выражении типа local.resource_groups.tst_na
только часть local.resource_groups
важна для анализа зависимостей Terraform: Terraform придет к выводу, что local.resource_groups
зависит как от azurerm_resource_group.rg_tst_na
, так и от azurerm_resource_group.rg_dev_na
, и поэтому все, что ссылается на local.resource_groups
, косвенно зависит от обоих этих ресурсов, независимо от того, какой другой атрибут доступы могут появиться после этой ссылки.
Таким образом, вы можете создать поиск атрибутов для этого объекта, используя произвольные выражения:
local.resource_groups["${each.value}_${each_key}"]
... и результатом будет тот же объект, как если бы вы напрямую ссылались на соответствующий ресурс.
эта информация полезна, большое спасибо
Можем ли мы изменить некоторую часть локального имени атрибута ресурса, используя for_each для блока данных справа? data.azurerm_resource.rg_[эта часть]...? это вообще возможно