Как убедиться, что ресурс уничтожен до ресурсов в каком-либо модуле в terraform? - PullRequest
1 голос
/ 09 февраля 2020

У меня есть модуль, который устанавливает доступ по умолчанию к хранилищу ключей. Затем у меня есть ресурс, который устанавливает секрет в хранилище ключей:

module "default_kv_access" {
  source = "../default_kv_access"
  key_vault = azurerm_key_vault.kv
}
...
resource "azurerm_key_vault_secret" "secrets" {
  for_each = local.secrets

  name         = each.key
  value        = each.value
  key_vault_id = azurerm_key_vault.kv.id
}

При уничтожении терраформ сначала уничтожает модуль, а затем пытается уничтожить секреты (расточительно, потому что хранилище ключей все равно будет уничтожено). , но дано).

В любом случае, сначала уничтожив модуль, terraform удаляет все политики доступа и поэтому, когда дело доходит до уничтожения ресурса azurerm_key_vault_secret, происходит сбой, потому что субъект службы, выполняющий код, не выполняет иметь необходимый доступ к секретам.

Мне нужно сказать terraform, что azurerm_key_vault_secret зависит от модуля default_kv_access.

Итак, вопрос в том, как я могу это сделать, учитывая, что я не могу просто упомянуть модуль в выражении depends_on.

РЕДАКТИРОВАТЬ 1

Код модуля:

variable "key_vault" {}

locals {
  ctx = jsondecode(file("${path.root}/../${basename(abspath(path.root)) == "product" ? "" : "../"}metadata.g.json"))

  # Will have to be replaced when the hosting is ready
  hosting_ad_group_name = "AdminRole-Product-DFDevelopmentOps"
}

data "azurerm_client_config" "client" {}

data "azuread_service_principal" "hosting_sp" {
  display_name = local.ctx.HostingAppName
}

data "azuread_group" "hosting_ad_group" {
  name = local.hosting_ad_group_name
}

locals {
  allow_kv_access_to = {
    client = {
      object_id          = data.azurerm_client_config.client.object_id
      secret_permissions = ["get", "set", "list", "delete", "recover", "backup", "restore"]
    }
    hosting_sp = {
      object_id          = data.azuread_service_principal.hosting_sp.object_id
      secret_permissions = ["get", "set", "list", "delete", "recover", "backup", "restore"]
    }
    hosting_ad_group = {
      object_id          = data.azuread_group.hosting_ad_group.id
      secret_permissions = ["get", "list"]
    }
  }
}

resource "azurerm_key_vault_access_policy" "default" {
  for_each = local.allow_kv_access_to

  key_vault_id = var.key_vault.id
  tenant_id    = var.key_vault.tenant_id
  object_id    = each.value.object_id

  secret_permissions = each.value.secret_permissions
}

1 Ответ

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

Один способ, которым я видел это (depends_on с модулем), состоит в том, чтобы ссылаться на свойство модуля в свойстве locals, а затем depends_on на локальную ссылку в вашем ресурсе. У меня это работает в нескольких моих собственных конфигурациях, и я получаю желаемый результат, ресурс не уничтожается и не создается до модуля.

Пример:

module "default_kv_access" {
  source = "../default_kv_access"
  key_vault = azurerm_key_vault.kv
}

locals {
  module_depends_on = module.default_kv_access.name
}

resource "azurerm_key_vault_secret" "secrets" {
  depends_on = [local.module_depends_on]
  for_each = local.secrets

  name         = each.key
  value        = each.value
  key_vault_id = azurerm_key_vault.kv.id
}
...