У меня есть конфигурация, которая создает 6 групп ресурсов в azure, а затем зацикливает их, чтобы назначить доступ участника к этим группам ресурсов для определенного участника службы. Код такой:
автоматически генерируется перед запуском terraform :
locals {
pod_rg_key_list = ["non_regional_web_rg","regional_data_rg['centralus']","regional_data_rg['eastus2']","regional_web_rg['centralus']","regional_web_rg['eastus2']"]
pod_rg_list = [azurerm_resource_group.non_regional_web_rg,azurerm_resource_group.regional_data_rg["centralus"],azurerm_resource_group.regional_data_rg["eastus2"],azurerm_resource_group.regional_web_rg["centralus"],azurerm_resource_group.regional_web_rg["eastus2"]]
}
main.tf :
...
locals {
injected_rg_key_list = ["cfg"]
injected_rg_list = [azurerm_resource_group.cfg]
all_rg_key_list = concat(local.pod_rg_key_list, local.injected_rg_key_list)
all_rg_list = concat(local.pod_rg_list, local.injected_rg_list)
}
resource "azurerm_role_assignment" "pod_sp_contributor_to_pod_rgs" {
for_each = toset(local.all_rg_key_list)
scope = local.all_rg_list[index(local.all_rg_key_list, each.value)].id
role_definition_id = data.azurerm_role_definition.contributor.id
principal_id = azuread_service_principal.sp.id
}
...
Это единственный способ заставить terraform создавать назначения ролей, не жалуясь на то, что for_each
не удалось разрешить из-за динамического c бла-бла-бла и предлагая запустить terraform, примените с -target.
Итак, он отлично создает назначения ролей. Однако, когда я запускаю команду разрушения, terraform сначала уничтожает группы ресурсов, а затем продолжает уничтожать назначения ролей, что неправильно, и, конечно, это не удается.
Дополнительные сведения
В общем, мой код является частью автоматизированной сборки, которая принимает базовую c конфигурацию, идентифицирует все группы ресурсов, добавляет другой файл terraform и затем запускает terraform для всего shebang.
Итак, он идентифицирует группы ресурсов путем запуска terraform plan -out main.tfplan
с переменными, которые гарантируют развертывание с нуля. Затем план преобразуется в json и адреса групп ресурсов извлекаются. Затем они могут быть введены в дополнительный код terraform, который добавляется сборкой перед повторным запуском terraform plan
и, наконец, terraform apply
.
Так что я не могу жестко закодировать оператор depends_on
, потому что список действительных группы ресурсов выводятся при сборке во время выполнения. Мне бы также пришлось автоматически сгенерировать оператор depends_on
, которого я пытаюсь избежать. Мои причины - в настоящее время все автоматически сгенерированные вещи - это просто локальные переменные, которые находятся в отдельном файле. Если я вынужден автоматически сгенерировать оператор depends_on
, мне придется нарушить это хорошее разделение.
Я чувствую, что должен быть лучший способ добиться того, что я делаю.
РЕДАКТИРОВАТЬ
Итак, я изменил код - я переместил ресурс назначения роли в файл, где я делаю замены. Это позволило мне автоматически сгенерировать оператор depends_on
. Вот новый файл:
locals {
pod_rg_key_list = ["non_regional_web_rg", "regional_data_rg['centralus']", "regional_data_rg['eastus2']", "regional_web_rg['centralus']", "regional_web_rg['eastus2']", "cfg"]
pod_rg_list = [azurerm_resource_group.non_regional_web_rg, azurerm_resource_group.regional_data_rg["centralus"], azurerm_resource_group.regional_data_rg["eastus2"], azurerm_resource_group.regional_web_rg["centralus"], azurerm_resource_group.regional_web_rg["eastus2"], azurerm_resource_group.cfg]
}
### Grant Contributor access to the resource groups
data "azurerm_role_definition" "contributor" {
name = "Contributor"
scope = "/subscriptions/${data.azurerm_subscriptions.sub.subscriptions.0.subscription_id}"
}
resource "azurerm_role_assignment" "pod_sp_contributor_to_pod_rgs" {
for_each = toset(local.pod_rg_key_list)
depends_on = [azurerm_resource_group.non_regional_web_rg, azurerm_resource_group.regional_data_rg["centralus"], azurerm_resource_group.regional_data_rg["eastus2"], azurerm_resource_group.regional_web_rg["centralus"], azurerm_resource_group.regional_web_rg["eastus2"], azurerm_resource_group.cfg]
scope = local.pod_rg_list[index(local.pod_rg_key_list, each.value)].id
role_definition_id = data.azurerm_role_definition.contributor.id
principal_id = azuread_service_principal.sp.id
}
Но он все равно не работает:
Error: Invalid index
on ..\..\modules\bootstrap\powershell.tf line 5, in locals:
5: pod_rg_list = [azurerm_resource_group.non_regional_web_rg, azurerm_resource_group.regional_data_rg["centralus"], azurerm_resource_group.regional_data_rg["eastus2"], azurerm_resource_group.regional_web_rg["centralus"], azurerm_resource_group.regional_web_rg["eastus2"], azurerm_resource_group.cfg]
|----------------
| azurerm_resource_group.regional_data_rg is object with no attributes
The given key does not identify an element in this collection value.
Error: Invalid index
on ..\..\modules\bootstrap\powershell.tf line 5, in locals:
5: pod_rg_list = [azurerm_resource_group.non_regional_web_rg, azurerm_resource_group.regional_data_rg["centralus"], azurerm_resource_group.regional_data_rg["eastus2"], azurerm_resource_group.regional_web_rg["centralus"], azurerm_resource_group.regional_web_rg["eastus2"], azurerm_resource_group.cfg]
|----------------
| azurerm_resource_group.regional_data_rg is object with no attributes
The given key does not identify an element in this collection value.
Error: Invalid index
on ..\..\modules\bootstrap\powershell.tf line 5, in locals:
5: pod_rg_list = [azurerm_resource_group.non_regional_web_rg, azurerm_resource_group.regional_data_rg["centralus"], azurerm_resource_group.regional_data_rg["eastus2"], azurerm_resource_group.regional_web_rg["centralus"], azurerm_resource_group.regional_web_rg["eastus2"], azurerm_resource_group.cfg]
|----------------
| azurerm_resource_group.regional_web_rg is object with no attributes
The given key does not identify an element in this collection value.
Error: Invalid index
on ..\..\modules\bootstrap\powershell.tf line 5, in locals:
5: pod_rg_list = [azurerm_resource_group.non_regional_web_rg, azurerm_resource_group.regional_data_rg["centralus"], azurerm_resource_group.regional_data_rg["eastus2"], azurerm_resource_group.regional_web_rg["centralus"], azurerm_resource_group.regional_web_rg["eastus2"], azurerm_resource_group.cfg]
|----------------
| azurerm_resource_group.regional_web_rg is object with no attributes
The given key does not identify an element in this collection value.
Обратите внимание, что он ломается только при разрушении среды.
РЕДАКТИРОВАТЬ 2
Фактические назначения ролей уничтожаются соответствующими группами ресурсов, но я не понимаю, почему terraform пытается уничтожить их ПОСЛЕ групп ресурсов, несмотря на очистить сообщение от depends_on
.