如何让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
相关产品推荐
相关产品推荐

