You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Terraform处理Azure Key Vault中已存在的软删除密钥?

可行解决方案

方案1:显式开启软删除密钥自动恢复(最适配现有配置)

你遇到的冲突本质是purge_soft_delete_on_destroy = false会默认关闭recover_soft_deleted_keys的隐式启用逻辑,只需要在provider的key_vault配置块里显式加一行配置即可:

provider "azurerm" {
  features {
    key_vault {
      purge_soft_delete_on_destroy    = false
      recover_soft_deleted_keys       = true
    }
  }
}

该配置可以同时满足两个需求:

  • 创建同名密钥时自动恢复处于软删除状态的现有密钥,不会报409冲突
  • 销毁资源时不会尝试purge密钥,避开清除保护触发的403报错
    完全适配你用count创建集群、节点删除重建复用名称的场景,无需修改现有资源代码。

方案2:用null_resource前置执行密钥恢复逻辑(兼容性更强)

如果后续provider版本特性有变动,或者你需要更灵活的控制逻辑,可以添加一个前置的null_resource,用Azure CLI检查并恢复软删除密钥:

data "azurerm_key_vault" "existing" {
  name                = "你的Key Vault名称"
  resource_group_name = "你的Key Vault资源组名"
}

resource "null_resource" "recover_deleted_key" {
  count = var.vm_count # 和你的VM count参数保持一致

  provisioner "local-exec" {
    command = <<EOT
    az keyvault key show --name "vm${count.index}-custom-disk-encryption" --vault-name ${data.azurerm_key_vault.existing.name} || \
    az keyvault key recover --name "vm${count.index}-custom-disk-encryption" --vault-name ${data.azurerm_key_vault.existing.name}
    EOT
  }

  triggers = {
    vm_index = count.index
  }
}

# 原有的磁盘加密密钥资源添加依赖即可
resource "azurerm_key_vault_key" "disk_encryption" {
  count = var.vm_count
  # 原有配置保持不变
  depends_on = [null_resource.recover_deleted_key]
}

这个方案不依赖provider的特性配置,跨版本兼容性更强,还可以根据业务需要自定义恢复逻辑。

方案3:测试环境临时适配方案

如果是纯测试集群,不需要长期保留软删除密钥,可以给Terraform使用的服务主体额外添加Microsoft.KeyVault/vaults/purge/action权限,直接使用默认的features {}配置即可,销毁时的purge操作会正常执行,不会报错。注意该方案不适合生产环境,生产环境开启清除保护的核心目的就是禁止手动purge,不要开放purge权限。

内容的提问来源于stack exchange,提问作者Db0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:36:05