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

本页将帮助您通过 Google Cloud 控制台中的备份保险柜恢复 Compute Engine 实例。

准备工作

  • 为执行恢复操作的目标项目中的保险库的备份保险柜服务代理授予 Backup and DR Compute Engine Operator (roles/backupdr.computeEngineOperator) IAM 角色。

  • 如果您使用的是共享 VPC,请为 VPC 宿主项目中的备份保险库服务代理 () 授予 Compute Network User (roles/compute.networkUser) IAM 角色。

  • 为在备份保险库项目中执行恢复操作的用户授予以下 IAM 角色。

    • 备份保险柜和目标项目的 Backup and DR Restore User (roles/backupdr.restoreUser)。
    • 仅针对目标资源的 Compute Viewer (roles/compute.viewer)。

    这些预定义角色包含访问 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

    如需使用 gcloud CLI CLI 或 API 恢复实例,用户必须拥有以下权限:

    • 针对备份资源的 backupdr.bvbackups.restore 权限。
    • 目标项目上的 backupdr.compute.restoreFromBackupVault 权限,实例将恢复到该项目中。

Google Cloud 控制台的其他权限

使用 Google Cloud 控制台恢复实例时,用户需要拥有 CLI 权限以及以下权限。控制台需要这些额外的权限才能在界面中列出并显示必要的 Compute Engine 资源以供选择:

  • 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. 点击操作图标,选择恢复操作。“恢复”页面会显示以下恢复选项,供您选择:

    • 选择资源名称
    • 选择备份创建时间
    • 选择要将虚拟机恢复到的项目名称
  3. 点击继续

    • 随即会显示下一个页面基于备份新建一个虚拟机实例,其中会根据源虚拟机的属性预先填充虚拟机属性。您可以修改属性以创建新的虚拟机,例如更改区域机器类型的选择。
  4. 点击创建以基于所选备份创建新的虚拟机。

gcloud

  1. 如果尚未授予,请向正在恢复虚拟机的恢复项目中的备份库服务代理授予 Backup and DR Compute Engine Operator (roles/backupdr.computeEngineOperator) IAM 角色。

  2. 如需获取备份保险柜服务账号,请使用以下命令。

      gcloud backup-dr backup-vaults describe BACKUPVAULT_NAME
      --location=REGION
    

    替换以下内容:

    • BACKUPVAULT_NAME:您要从中恢复数据的备份保险柜名称。
    • REGION:备份保险柜的区域。
  3. 在恢复 Compute Engine 实例之前,请使用以下命令获取数据源 ID 和所需备份的 ID。

    1. 查找数据源 ID

        gcloud backup-dr data-sources list \
        --project=PROJECT \
        --location=REGION \
        --backup-vault=BACKUPVAULT_NAME \
        "--filter=dataSourceGcpResource.computeInstanceDatasourceProperties.name:(DATA_SOURCE)" \
        "--format=get(name)")
      
    2. 列出数据源的现有备份,以找到正确的 BACKUP_ID。

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

    • 恢复与工作负载项目位于同一项目中的虚拟机,并提供备份 ID。

        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
      
    • 使用备份完整资源网址在与工作负载项目相同的项目中恢复虚拟机。

        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
      
    • 恢复具有自定义服务账号和网络配置的 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:恢复的虚拟机的名称。
      • TARGET_ZONE:虚拟机恢复到的区域。
      • TARGET_PROJECT:虚拟机恢复到的项目。
      • NETWORK:虚拟机的网络 URI。
      • SUBNET:虚拟机的子网 URI。
      • SERVICE_ACCOUNT:已恢复虚拟机的服务账号。
      • SCOPE:服务账号的授权范围。

如需替换其他虚拟机属性,请参阅 Backup and DR Service 概览 gcloud CLI 命令。

从启用了 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 指南