Terraform создает ресурсы в правильном порядке, но уничтожает их в неправильном порядке - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть конфигурация, которая создает 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.

1 Ответ

0 голосов
/ 04 февраля 2020

Я был на грани открытия ошибки в Terraform, когда заметил, что у меня установлена ​​версия 0.12.18 вместо последней версии 0.12.20. Обновление до 0.12.20 решило проблему!

Я проверил журнал изменений на 0.12.20 и не заметил ничего релевантного с тех пор, как вышел 0.12.18. Но это факт - работа с 0.12.20, а не работа с 0.12.18.

...