从备份保险柜恢复 Compute Engine 实例

本页面可帮助您在 控制台 Google Cloud 中从 备份保险柜恢复 Compute Engine 实例,该实例 可以面向新的 Compute Engine 实例或新的 Persistent Disk。如需将单个磁盘选择性地恢复到新的 Persistent Disk,请参阅 从 Compute Engine 实例备份执行选择性磁盘恢复

所需角色

如需获得从备份保险柜恢复 Compute Engine 实例所需的权限,请让管理员向您授予对项目、目标项目、Backup and DR 服务代理和 VPC 宿主项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

这些预定义角色包含 从备份保险柜恢复 Compute Engine 实例所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需从备份保险柜恢复 Compute Engine 实例,您需要具备以下权限:

  • 恢复 Compute Engine 实例:
    • backupdr.bvbackups.restore
    • backupdr.compute.restoreFromBackupVault
    • backupdr.backupVaults.get
    • backupdr.backupVaults.list
    • backupdr.bvbackups.list
    • backupdr.bvdataSources.get
    • backupdr.bvdataSources.list
    • backupdr.bvbackups.get
  • 使用控制台恢复 Compute Engine 实例(其他权限): Google Cloud
    • compute.acceleratorTypes.list
    • compute.disks.list
    • compute.machineTypes.list
    • compute.projects.get
    • compute.regions.list
    • compute.zones.list

您也可以使用自定义角色或其他预定义角色来获取这些权限。

恢复 Compute Engine 实例

请按照以下说明恢复 Compute Engine 实例。

控制台

  1. 在 Google Cloud 控制台中,前往 受保管的备份 页面。

    前往“受保管的备份”页面

    此处列出了所有具有受保管备份的 Compute Engine 实例。

  2. 点击操作图标以选择恢复 操作。系统会显示恢复页面 ,您可以在其中选择以下恢复选项:

    • 选择资源名称
    • 选择备份创建时间
    • 选择恢复范围,可以是整个 Compute Engine 实例,也可以是单个磁盘。如需恢复单个磁盘,请参阅 从 Compute Engine 实例备份执行选择性磁盘恢复
    • 选择要将虚拟机恢复到的项目名称
  3. 点击继续

    系统会显示通过备份创建新的 Compute Engine 实例 页面,其中会根据来源 Compute Engine 实例的属性预先填充 Compute Engine 实例的属性。您可以修改这些属性以创建新的 Compute Engine 实例,例如更改区域机器类型 的选择。

  4. 点击创建 以通过所选备份创建新的虚拟机。

gcloud

  1. 使用 gcloud backup-dr backup-vaults describe 命令获取备份保险柜服务帐号:

    gcloud backup-dr backup-vaults describe BACKUP_VAULT_NAME /
    --location=REGION_NAME
    

    替换以下内容:

    • BACKUP_VAULT_NAME:您要从中 恢复数据的备份保险柜的名称。

    • REGION_NAME:备份保险柜的区域。

  2. 在恢复 Compute Engine 实例之前,请使用以下命令获取数据源 ID 和所需备份的 ID:

    1. 使用 gcloud backup-dr data-sources list 命令查找数据源 ID:

      gcloud backup-dr data-sources list \
      --project=PROJECT_NAME \
      --location=REGION_NAME \
      --backup-vault=BACKUP_VAULT_NAME \
      "--filter=dataSourceGcpResource.computeInstanceDatasourceProperties.name:(DATA_SOURCE)" \
      "--format=get(name)"
      
    2. 使用 gcloud backup-dr backups list 命令列出数据源的现有备份,以查找正确的 BACKUP_ID

      gcloud backup-dr backups list \
      --location=REGION_NAME \
      --backup-vault=BACKUP_VAULT_NAME \
      --data-source=DATA_SOURCE \
      "--format=yaml(backupType,computeInstanceBackupProperties.sourceInstance,consistencyTime,enforcedRetentionEndTime,expireTime,name)"
      
  3. 如需恢复 Compute Engine 实例,请使用以下命令:

    • 使用 gcloud backup-dr backups restore compute 命令,在与工作负载项目相同的项目中恢复具有备份 ID 的 Compute Engine 实例:

      gcloud backup-dr backups restore compute test-backup-id \
      --project=PROJECT_NAME --location=REGION_NAME \
      --backup-vault=BACKUP_VAULT_NAME --data-source=DATA_SOURCE\
      --name=NAME --target-zone=TARGET_ZONE \
      --target-project=TARGET_PROJECT
      
    • 使用 gcloud backup-dr backups restore compute projects 命令,在与工作负载项目相同的项目中恢复具有备份完整资源网址的 Compute Engine 实例:

      gcloud backup-dr backups restore compute projects/test-project-id/locations/us-central1/backupVaults/test-vault/dataSources/test-ds/backups/test-backup-id \
      --name=NAME --target-zone=TARGET_ZONE \
      --target-project=TARGET_PROJECT
      
    • 使用 gcloud backup-dr backups restore compute 命令,恢复具有自定义服务帐号和网络配置的 Compute Engine 实例:

      gcloud backup-dr backups restore compute test-backup-id \
      --project=PROJECT --location=REGION \
      --backup-vault=BACKUPVAULT_NAME --data-source=DATA_SOURCE\
      --name=NAME --target-zone=TARGET_ZONE \
      --target-project=TARGET_PROJECT \
      --network-interface=network=NETWORK,subnet=SUBNET \
      --service-account=SERVICE_ACCOUNT \
      --scopes=SCOPE
      

      替换以下内容:

      • PROJECT:备份保险柜 项目的名称。

      • REGION:备份保险柜的位置。

      • BACKUPVAULT_NAME:您要从中恢复数据的备份保险柜的名称 。

      • DATA_SOURCE:您要从中 恢复数据的数据源的名称。

      • NAME:已恢复的 Compute Engine 实例的名称。

      • TARGET_ZONE:Compute Engine 实例恢复到的区域。

      • TARGET_PROJECT:Compute Engine 实例恢复到的项目。

      • NETWORK:Compute Engine 实例的网络 URI。

      • SUBNET:Compute Engine 实例的子网 URI。

      • SERVICE_ACCOUNT:已恢复的 Compute Engine 实例的 服务帐号。

      • SCOPE:服务账号的授权范围 。

    • 使用 gcloud backup-dr backups restore disk 命令恢复 Compute Engine 磁盘。如需 详细了解如何从 Compute Engine 实例备份恢复单个磁盘,请参阅 从 Compute Engine 实例备份执行选择性磁盘恢复

      gcloud backup-dr backups restore disk BACKUP_NAME  \
      --name=DISK_NAME \
      --target-project=TARGET_PROJECT_NAME \
      [--source-instance-boot-disk | --source-instance-disk-device-name=DEVICE_NAME] \
      [--target-zone=TARGET_ZONE_NAME | --target-region=TARGET_REGION_NAME --replica-zones=ZONE_NAME] \
      [DISK_OVERRIDE_FLAGS...] \
      [--async]
      

如需替换其他 Compute Engine 实例属性,请参阅 Backup and DR Service gcloud CLI 命令概览。

选择性磁盘备份的恢复限制

当您从使用 选择性磁盘备份创建的备份恢复 Compute Engine 实例时,系统只会恢复在 备份时受到保护的磁盘,并将其挂接到新的虚拟机 (VM) 实例。 在 Google Cloud 控制台中,摘要部分会突出显示备份中包含的受保护 磁盘(例如Protected disks: 2 out of 3)。

为防止在恢复包含排除的磁盘的虚拟机时出现启动失败的情况,请将来源虚拟机的启动配置设置为忽略缺失的磁盘(例如,通过在 /etc/fstab 中添加 nofail 挂载选项)。如需详细了解此 Compute Engine 限制,请参阅永久性磁盘恢复限制和注意事项

从启用了 CMEK 的备份保险柜恢复备份

从启用了 CMEK 的备份保险柜恢复的加密处理取决于您是恢复整个 Compute Engine 实例还是单个磁盘。

整个 Compute Engine 实例恢复的 CMEK 处理

当您从存储在启用了 CMEK 的备份保险柜中的备份恢复整个 Compute Engine 实例时,备份本身会受到保险柜的 CMEK 保护。默认情况下,恢复的 Compute Engine 实例中的磁盘会保留其原始加密设置,即 Google 管理的加密或其原始 CMEK。访问保险柜的 CMEK 所需的权限会 授予 Backup and DR 服务代理,如 CMEK 概念中所述。

单个磁盘恢复的 CMEK 处理

当您选择单个磁盘 恢复范围以从 Compute Engine 实例备份恢复单个磁盘时,会发生以下行为:

  • 默认行为:通过备份创建的新磁盘会尝试 使用原始 Compute Engine 实例中的与来源磁盘相同的加密密钥

    • 如果来源磁盘使用 Google 管理的加密,则恢复的磁盘也会使用 Google 管理的加密。

    • 如果来源磁盘使用特定的 CMEK,则恢复的磁盘会尝试使用该相同的 CMEK。

  • 密钥不可用:如果目标项目或区域中无法访问来源磁盘使用的原始 CMEK(例如,由于密钥删除、权限更改或跨区域恢复),则恢复操作会失败,除非您替换加密设置。

  • 替换加密设置 :您可以在恢复过程中更改恢复的磁盘的加密设置,具体方法如下:

    控制台

    • 在恢复向导的目标磁盘属性 部分中,您可以使用以下选项之一修改加密 设置:

      • 选择其他客户管理的加密密钥 (CMEK)。

      • 切换到 Google 管理的加密。

    gcloud

    • 当使用带有 --source-instance-boot-disk--source-instance-disk-device-name 标志的 gcloud backup-dr backups restore disk 命令时:

      • 如需为恢复的磁盘指定其他 CMEK,请使用 --kms-key 标志:
      --kms-key=projects/MY-KEY-PROJECT/locations/us-central1/keyRings/MY-RING/cryptoKeys/MY-NEW-KEY
      
      • 如需强制恢复的磁盘使用 Google 管理的加密,请使用 --clear-encryption-key 标志。
  • CMEK 替换的权限

    • 如果您替换加密以使用新的不同的 CMEK, 则必须确保 目标项目 的 Compute Engine 服务代理对指定的 KMS 密钥具有 Cloud KMS CryptoKey Encrypter/Decrypter 角色 (roles/cloudkms.cryptoKeyEncrypterDecrypter)。服务代理账号格式为: service-TARGET_PROJECT_NUMBER@compute-system.

    • Compute Engine 需要此权限才能创建使用所选密钥加密的新磁盘。

如需详细了解磁盘恢复操作和标志用法,请参阅从备份保险柜恢复 Persistent Disk

从启用了 CMEK 的备份保险柜恢复备份

当您从启用了 CMEK 的备份保险柜恢复备份时,恢复的资源的加密取决于来源的加密:

  • 如果来源资源受到 CMEK 保护 :恢复的资源默认使用与来源相同的 CMEK 密钥。例如:
    • 使用密钥 K1 加密的 Compute Engine 永久性磁盘会恢复为使用 K1 加密的磁盘。
    • 如果虚拟机有多个磁盘,则恢复的虚拟机中的每个磁盘都会继承其相应来源磁盘的加密(使用 CMEK 加密的磁盘仍使用其原始密钥加密,而使用 Google 管理的加密的磁盘仍使用 Google 管理的加密)。
  • 如果来源资源使用 Google 管理的加密 :恢复的资源默认使用 Google 管理的加密。

您可以使用 API 或 gcloud CLI 在恢复 Compute Engine 永久性 磁盘或 Compute Engine 实例时替换此默认行为。例如,您可以将受 CMEK 保护的资源的备份恢复到使用 Google 管理的加密的新资源,或恢复到受其他 CMEK 密钥保护的新资源。如需恢复到受新 CMEK 密钥保护的资源,请确保目标项目的相关服务代理(例如 Compute Engine 服务代理)对新的目标密钥具有 roles/cloudkms.cryptoKeyEncrypterDecrypter 权限。

使用 CMEK 执行跨区域恢复

由于 Cloud Key Management Service 密钥是区域性的,因此当您执行跨区域恢复(例如,将实例从 asia-south1 恢复到 asia-south2)时,如果您使用默认行为,恢复操作会失败。恢复的虚拟机的磁盘无法使用来源区域的 KMS 密钥进行加密。

这是 Google Cloud 控制台中的一项当前限制。如需对受 CMEK 保护的虚拟机执行跨区域恢复,您必须使用 gcloud CLI、API 或 Terraform 替换加密设置,并在目标区域中指定新的 KMS 密钥。

如需恢复到受新 CMEK 密钥保护的资源,请执行以下步骤:

  1. 确保您在目标区域中拥有密钥 :确保您在要恢复虚拟机的区域(在目标项目或共享 KMS 项目中)拥有 Cloud Key Management Service 密钥,如果没有,请创建一个。
  2. 授予 KMS 权限 :向要恢复虚拟机的目标项目的 Compute Engine 服务代理授予此目标密钥的 Cloud KMS CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter) 角色。

  3. 执行恢复 :使用以下方法之一执行恢复,并替换每个磁盘的 KMS 密钥:

gcloud

  1. 获取备份详细信息 :使用 gcloud backup-dr backups list 命令从备份中检索备份名称和磁盘的设备名称:

    gcloud backup-dr backups list \
      --project=PROJECT_ID \
      --location=SOURCE_REGION \
      --backup-vault=BACKUP_VAULT_NAME \
      --filter="computeInstanceBackupProperties.sourceInstance~SOURCE_INSTANCE_NAME"
    

    替换以下内容:

    • PROJECT_ID:备份保险柜所在项目的名称。
    • SOURCE_REGION:备份保险柜的位置。
    • BACKUP_VAULT_NAME:您要从中恢复数据的备份保险柜的名称。
    • SOURCE_INSTANCE_NAME:来源 Compute Engine 实例的名称。
  2. 运行恢复命令 :执行恢复命令,并使用 --create-disk 参数替换每个磁盘的 KMS 密钥。

    1. 恢复具有单个磁盘的虚拟机

      gcloud backup-dr backups restore compute BACKUP_ID \
        --project=PROJECT_ID \
        --location=SOURCE_REGION \
        --backup-vault=BACKUP_VAULT_NAME \
        --data-source=DATA_SOURCE \
        --name=RESTORED_VM_NAME \
        --target-zone=TARGET_ZONE \
        --target-project=TARGET_PROJECT_ID \
        --create-disk=device-name=DEVICE_NAME,kms-key=projects/KMS_PROJECT_ID/locations/TARGET_REGION/keyRings/KEYRING/cryptoKeys/KEY_NAME
      

      替换以下内容:

      • BACKUP_ID:您要恢复的备份的 ID。
      • PROJECT_ID:备份保险柜所在项目的名称。
      • SOURCE_REGION:备份保险柜的位置。
      • BACKUP_VAULT_NAME:您要从中恢复数据的备份保险柜的名称。
      • DATA_SOURCE:您要从中恢复数据的数据源的 ID。
      • RESTORED_VM_NAME:已恢复的虚拟机的名称。
      • TARGET_ZONE:虚拟机恢复到的可用区。
      • TARGET_PROJECT_ID:虚拟机恢复到的项目。
      • DEVICE_NAME:磁盘的设备名称。
      • KMS_PROJECT_ID:Cloud Key Management Service 密钥所在项目的 ID。
      • TARGET_REGION:Cloud Key Management Service 密钥所在的区域。
      • KEYRING:Cloud Key Management Service 密钥环的名称。
      • KEY_NAME:磁盘 1 的 Cloud Key Management Service 密钥的名称。
    2. 恢复具有多个磁盘的虚拟机 :为每个磁盘提供单独的 --create-disk 标志:

      gcloud backup-dr backups restore compute BACKUP_ID \
        --project=PROJECT_ID \
        --location=SOURCE_REGION \
        --backup-vault=BACKUP_VAULT_NAME \
        --data-source=DATA_SOURCE \
        --name=RESTORED_VM_NAME \
        --target-zone=TARGET_ZONE \
        --target-project=TARGET_PROJECT_ID \
        --create-disk=device-name=DEVICE_NAME_1,kms-key=projects/KMS_PROJECT_ID/locations/TARGET_REGION/keyRings/KEYRING/cryptoKeys/KEY_NAME_1 \
        --create-disk=device-name=DEVICE_NAME_2,kms-key=projects/KMS_PROJECT_ID/locations/TARGET_REGION/keyRings/KEYRING/cryptoKeys/KEY_NAME_2
      

      替换以下内容:

      • BACKUP_ID:您要恢复的备份的 ID。
      • PROJECT_ID:备份保险柜所在项目的名称。
      • SOURCE_REGION:备份保险柜的位置。
      • BACKUP_VAULT_NAME:您要从中恢复数据的备份保险柜的名称。
      • DATA_SOURCE:您要从中恢复数据的数据源的 ID。
      • RESTORED_VM_NAME:已恢复的虚拟机的名称。
      • TARGET_ZONE:虚拟机恢复到的可用区。
      • TARGET_PROJECT_ID:虚拟机恢复到的项目。
      • DEVICE_NAME_1:磁盘 1 的设备名称。
      • KMS_PROJECT_ID:Cloud Key Management Service 密钥所在项目的 ID。
      • TARGET_REGION:Cloud Key Management Service 密钥所在的区域。
      • KEYRING:Cloud Key Management Service 密钥环的名称。
      • KEY_NAME_1:磁盘 1 的 Cloud Key Management Service 密钥的名称。
      • DEVICE_NAME_2:磁盘 2 的设备名称。
      • KEY_NAME_2:磁盘 2 的 Cloud Key Management Service 密钥的名称。

API

  1. 获取备份详细信息 :通过发送 GET 请求来列出备份,从而检索备份名称和磁盘的设备名称:

    GET https://backupdr.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_REGION/backupVaults/BACKUP_VAULT_NAME/dataSources/DATA_SOURCE/backups
    
  2. 运行恢复 API :向备份的 restore URI 发送 POST 请求。

    1. 恢复具有单个磁盘的虚拟机

      POST https://backupdr.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_REGION/backupVaults/BACKUP_VAULT_NAME/dataSources/DATA_SOURCE/backups/BACKUP_ID:restore
      

      载荷:

      {
        "computeInstanceTargetEnvironment": {
          "project": "TARGET_PROJECT_ID",
          "zone": "TARGET_ZONE"
        },
        "computeInstanceRestoreProperties": {
          "name": "RESTORED_VM_NAME",
          "machineType": "projects/TARGET_PROJECT_ID/zones/TARGET_ZONE/machineTypes/e2-medium",
          "disks": [
            {
              "deviceName": "DEVICE_NAME",
              "diskEncryptionKey": {
              "kmsKeyName": "projects/KMS_PROJECT_ID/locations/TARGET_REGION/keyRings/KEYRING/cryptoKeys/KEY_NAME"
              }
            }
          ]
        }
      }
      
    2. 恢复具有多个磁盘的虚拟机

      POST https://backupdr.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_REGION/backupVaults/BACKUP_VAULT_NAME/dataSources/DATA_SOURCE/backups/BACKUP_ID:restore
      

      载荷:

      {
        "computeInstanceTargetEnvironment": {
          "project": "TARGET_PROJECT_ID",
          "zone": "TARGET_ZONE"
        },
        "computeInstanceRestoreProperties": {
          "name": "RESTORED_VM_NAME",
          "machineType": "projects/TARGET_PROJECT_ID/zones/TARGET_ZONE/machineTypes/e2-medium",
          "disks": [
            {
              "deviceName": "DEVICE_NAME_1",
              "diskEncryptionKey": {
                "kmsKeyName": "projects/KMS_PROJECT_ID/locations/TARGET_REGION/keyRings/KEYRING/cryptoKeys/KEY_NAME_1"
              }
            },
            {
              "deviceName": "DEVICE_NAME_2",
              "diskEncryptionKey": {
                "kmsKeyName": "projects/KMS_PROJECT_ID/locations/TARGET_REGION/keyRings/KEYRING/cryptoKeys/KEY_NAME_2"
              }
            }
          ]
        }
      }
      

Terraform

使用 google_backup_dr_restore_workload 资源

  1. 恢复具有单个磁盘的虚拟机

    resource "google_backup_dr_restore_workload" "restore_single" {
      location         = "SOURCE_REGION"
      backup_vault_id  = "BACKUP_VAULT_NAME"
      data_source_id   = "DATA_SOURCE"
      backup_id        = "BACKUP_ID"
    
      compute_instance_target_environment {
        project = "TARGET_PROJECT_ID"
        zone = "TARGET_ZONE"
      }
    
      compute_instance_restore_properties {
        name = "RESTORED_VM_NAME"
        machine_type = "zones/TARGET_ZONE/machineTypes/e2-medium"
        disks {
          device_name = "DEVICE_NAME"
          disk_encryption_key {
            kms_key_name = "projects/KMS_PROJECT_ID/locations/TARGET_REGION/keyRings/KEYRING/cryptoKeys/KEY_NAME"
          }
        }
      }
    }
    
  2. 恢复具有多个磁盘的虚拟机

    resource "google_backup_dr_restore_workload" "restore_multi" {
      location         = "SOURCE_REGION"
      backup_vault_id  = "BACKUP_VAULT_NAME"
      data_source_id   = "DATA_SOURCE"
      backup_id        = "BACKUP_ID"
    
      compute_instance_target_environment {
        project = "TARGET_PROJECT_ID"
        zone = "TARGET_ZONE"
      }
    
      compute_instance_restore_properties {
        name = "RESTORED_VM_NAME"
        machine_type = "zones/TARGET_ZONE/machineTypes/TARGET_MACHINETYPE"
        disks {
          device_name = "DEVICE_NAME_1"
          disk_encryption_key {
            kms_key_name = "projects/KMS_PROJECT_ID/locations/TARGET_REGION/keyRings/KEYRING/cryptoKeys/KEY_NAME_1"
          }
        }
    
        disks {
          device_name = "DEVICE_NAME_2"
          disk_encryption_key {
            kms_key_name = "projects/KMS_PROJECT_ID/locations/TARGET_REGION/keyRings/KEYRING/cryptoKeys/KEY_NAME_2"
          }
        }
      }
    }
    

如果在恢复操作期间保护来源工作负载的 Cloud Key Management Service 密钥不可用,则恢复默认会失败。在这种情况下,您必须 使用 API 或 gcloud CLI 通过 指定新的 CMEK 密钥或将恢复的资源的加密类型更改为 Google 管理的加密来替换加密设置。

如果用于加密备份保险柜中的数据的 Cloud Key Management Service 密钥版本已停用或销毁,您将无法通过该备份进行恢复。

Backup and DR Compute Engine 指南

后续步骤