Terraform导入Azure VM备份异常求助:单台VM资源ID读取失败
Terraform导入Azure VM备份资源失败
尝试为多台Azure VM通过Terraform导入备份配置,其中一台VM的资源ID始终无法被正确识别。该VM是Terraform已管理的现有资源,且相同代码在其他VM的备份导入中可正常运行。已尝试在Azure门户删除该备份后让Terraform重新创建,但terraform plan仍抛出相同错误。
已尝试的导入命令
第一种:
terraform import module.backup_protected_vm.azurerm_backup_protected_vm.backup_protected_vm[\"arv-sandbox-canadacentral-vmtestifrsweb01\"] "/subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/rg-sandbox-abkup/providers/Microsoft.RecoveryServices/vaults/arv-sandbox-canadacentral/backupFabrics/Azure/protectionContainers/iaasvmcontainer;iaasvmcontainerv2;rg-sandbox-web;vmtestifrsweb01/protectedItems/VM;iaasvmcontainerv2;rg-sandbox-web;vmtestifrsweb01"
第二种(修改资源组大小写):
terraform import module.backup_protected_vm.azurerm_backup_protected_vm.backup_protected_vm[\"arv-sandbox-canadacentral-vmtestifrsweb01\"] "/subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/rg-sandbox-abkup/providers/Microsoft.RecoveryServices/vaults/arv-sandbox-canadacentral/backupFabrics/Azure/protectionContainers/iaasvmcontainer;iaasvmcontainerv2;RG-SANDBOX-WEB;vmtestifrsweb01/protectedItems/VM;iaasvmcontainerv2;RG-SANDBOX-WEB;vmtestifrsweb01"
模块定义
resource "azurerm_backup_protected_vm" "backup_protected_vm" { for_each = var.backup_protected_vms resource_group_name = each.value["resource_group_name"] recovery_vault_name = each.value["recovery_vault_name"] source_vm_id = lookup(var.virtual_machine_ids, each.value["virtual_machine_variable_name"], null) backup_policy_id = lookup(var.backup_policy_vm_ids, each.value["backup_policy_vm_variable_name"], null) protection_state = each.value["protection_state"] }
变量定义
variable "backup_protected_vms" { type = map(object({ resource_group_name = string recovery_vault_name = string virtual_machine_variable_name = string backup_policy_vm_variable_name = string protection_state = string })) }
tfvars配置
backup_protected_vms = { arv-sandbox-canadacentral-vmtestifrsweb01 = { resource_group_name = "rg-sandbox-abkup" recovery_vault_name = "arv-sandbox-canadacentral" virtual_machine_variable_name = "vmtestifrsweb01" backup_policy_vm_variable_name = "arv-sandbox-canadacentral-SixtyDayBackupPolicy" protection_state = "Protected" } }
排查建议
- 核对资源ID大小写:Azure资源组名称在备份资源ID路径中区分大小写,用
az group show -n rg-sandbox-web确认实际资源组名称的大小写,确保与导入ID中的完全一致。 - 验证导入实例键匹配:导入命令中的实例键
arv-sandbox-canadacentral-vmtestifrsweb01必须与backup_protected_vms映射中的键完全一致,检查是否有拼写、空格或大小写差异。 - 确认备份资源彻底清理:删除Azure门户中的备份后,检查Recovery Services Vault的"备份项"页面,确保该VM的备份记录已完全移除,避免残留资源干扰导入。
- 生成精准的备份资源ID:按照模板
/subscriptions/{subId}/resourceGroups/{rgName}/providers/Microsoft.RecoveryServices/vaults/{vaultName}/backupFabrics/Azure/protectionContainers/iaasvmcontainer;iaasvmcontainerv2;{vmRgName};{vmName}/protectedItems/VM;iaasvmcontainerv2;{vmRgName};{vmName},从VM的资源ID中提取准确的资源组和VM名称,替换后生成导入ID。 - 检查Terraform状态残留:执行
terraform state list | grep arv-sandbox-canadacentral-vmtestifrsweb01,若存在残留记录,用terraform state rm <资源路径>删除后再重新导入。 - 验证变量引用正确性:确认
var.virtual_machine_ids中存在vmtestifrsweb01对应的正确VM ID,与Azure门户中VM的资源ID对比一致。
内容的提问来源于stack exchange,提问作者lviswa
相关产品推荐
相关产品推荐

