在terraform中的某个模块中的资源被销毁之前,如何确保资源被销毁?

在terraform中的某个模块中的资源被销毁之前,如何确保资源被销毁?,terraform,Terraform,我有一个模块,可以设置对密钥库的默认访问权限。然后我有一个资源在密钥库中设置一个秘密: 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

我有一个模块,可以设置对密钥库的默认访问权限。然后我有一个资源在密钥库中设置一个秘密:

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首先摧毁模块,然后试图摧毁机密(这是浪费,因为钥匙库无论如何都会被摧毁,但会被给予)

无论如何,通过先销毁模块,terraform会删除所有访问策略,因此当涉及到销毁
azurerm\u key\u vault\u secret
资源时,它会失败,因为运行代码的服务主体没有必要的访问机密的权限

我需要的是告诉terraform,
azurerm\u key\u vault\u secret
取决于
default\u kv\u 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
}

我看到这样做的一种方式(
依赖于模块)是在
本地
属性中引用模块的属性,然后
依赖于资源中的本地引用。在我自己的一些配置中,我已经完成了这项工作,并且我得到了期望的结果,在模块出现之前,资源不会被破坏或创建

例如:

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
}

我看到这样做的一种方式(
依赖于模块)是在
本地
属性中引用模块的属性,然后
依赖于资源中的本地引用。在我自己的一些配置中,我已经完成了这项工作,并且我得到了期望的结果,在模块出现之前,资源不会被破坏或创建

例如:

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
}

你能分享模块源代码吗?你能分享模块源代码吗?很有趣。我需要测试它。我实际上使用了类似的方法,但我在标记中引用了模块输出。我不知道
依赖于
可以引用局部变量。有趣。我需要测试它。我实际上使用了类似的方法,但我在标记中引用了模块输出。我不知道
依赖于
可以引用局部变量。