使用Terraform自动删除Recovery Service Vault时出现报错
解决Terraform自动销毁Azure备份资源时的Location header缺失错误
问题场景
使用Terraform部署以下Azure资源:
- 存储账户
- Azure文件共享
- Azure Blob容器
- Recovery Service Vault
- 配置Azure文件共享的备份策略
- 为文件共享和Blob容器启用备份
资源创建流程完全正常,但执行terraform destroy自动销毁时触发错误:
Error: deleting Azure File Share backups item StorageContainer;storage;<RESOURCE_GROUP_NAME>;<STORAGE_ACCOUNT_NAME> (Vault <RECOVERY_SERVICE_VAULT_NAME>): Location header missing or empty
根据Azure官方要求,删除Recovery Service Vault前必须完成三步操作:
- 禁用Vault的软删除功能
- 移除所有备份项
- 注销关联的存储账户
手动通过Azure Portal完成上述步骤后,销毁操作可成功执行;直接在控制台运行terraform_data中定义的Azure CLI命令也能正常完成,但通过Terraform自动销毁就会触发上述错误。
排查过程
进一步分析发现,自动销毁时Terraform会尝试重复销毁azurerm_backup_protected_file_share.shared_storage_backup和azurerm_backup_container_storage_account.shared_storage_register这两个资源,且这些销毁操作是并行执行的。而Azure的备份资源销毁存在依赖关系,必须按顺序序列化执行,并行操作会导致API返回异常,出现Location header缺失的错误。
解决方法
通过添加time_sleep资源并调整资源间的依赖关系,强制Terraform按正确顺序执行销毁操作:
- 先销毁备份保护项
azurerm_backup_protected_file_share - 等待一段时间确保备份项完全移除
- 再销毁存储账户的注册容器
azurerm_backup_container_storage_account - 最后销毁Recovery Service Vault
示例代码片段:
resource "time_sleep" "wait_for_backup_item_removal" { create_duration = "30s" depends_on = [ azurerm_backup_protected_file_share.shared_storage_backup, ] } resource "azurerm_backup_container_storage_account" "shared_storage_register" { # ... 原有配置 ... depends_on = [ time_sleep.wait_for_backup_item_removal, ] } resource "azurerm_recovery_services_vault" "backup_vault" { # ... 原有配置 ... depends_on = [ azurerm_backup_container_storage_account.shared_storage_register, ] }
验证结果
调整依赖并添加等待资源后,执行terraform destroy可自动完成所有资源的销毁操作,不再触发Location header缺失的错误。
内容的提问来源于stack exchange,提问作者phanxen
相关产品推荐
相关产品推荐

