Azure Key Vault需两次terraform destroy清理的原因及单步解决方法咨询
1. 首次terraform destroy无法完成Key Vault清理的原因
Azure Key Vault启用软删除(soft_delete_retention_days=7)后,执行删除操作时,Vault不会被直接彻底删除,而是进入软删除状态。Terraform的azurerm provider在purge_protection_enabled=false的配置下,会在destroy流程中自动尝试调用purge操作,彻底清除处于软删除状态的Vault。
但purge软删除Vault的操作需要订阅级别的Microsoft.KeyVault/locations/deletedVaults/purge/action权限,你的服务主体(SPN)仅拥有资源组级权限,因此首次执行purge时触发权限错误,导致Key Vault无法被彻底清理。
第二次执行terraform destroy时,Terraform会再次检测到软删除状态的Vault,此时由于操作上下文的权限验证逻辑变化(或凭据缓存刷新),purge操作得以成功执行,最终完成清理。
2. 实现单次terraform destroy完成所有资源清理的方案
方案1:授予SPN最小权限的订阅级权限
创建仅包含purge软删除Vault权限的自定义Azure角色,分配给SPN至订阅范围,既满足清理需求,又符合安全约束(无需授予Owner权限)。
操作步骤:
- 创建自定义角色定义文件
kv-purge-role.json:
{ "Name": "Key Vault Purge Access", "IsCustom": true, "Description": "仅允许清理软删除状态的Key Vault", "Actions": [ "Microsoft.KeyVault/locations/deletedVaults/purge/action" ], "NotActions": [], "AssignableScopes": [ "/subscriptions/你的订阅ID" ] }
- 通过Azure CLI创建角色并分配给SPN:
# 创建自定义角色 az role definition create --role-definition ./kv-purge-role.json # 分配角色给SPN az role assignment create --assignee 你的SPN对象ID --role "Key Vault Purge Access" --scope "/subscriptions/你的订阅ID"
方案2:调整Terraform配置(适合非紧急清理场景)
如果无需立即彻底删除Key Vault,可以修改配置,让Terraform在destroy时仅将Vault移入软删除状态,等待7天后自动彻底删除。
修改azurerm_key_vault资源的purge_protection_enabled为true:
resource "azurerm_key_vault" "kv" { # 原有配置... purge_protection_enabled = true # 原有配置... }
此配置下,执行terraform destroy时,Vault会进入软删除状态,无法被立即purge,7天后会自动彻底删除,无需额外权限。
内容的提问来源于stack exchange,提问作者Frédéric De Lène Mirouze

