從備份保存庫還原 Compute Engine 執行個體

本頁說明如何透過 Google Cloud 控制台,從備份保存庫還原 Compute Engine 執行個體,目標可以是新的 Compute Engine 執行個體或新的永久磁碟。如要將個別磁碟選擇性還原至新的永久磁碟,請參閱「從 Compute Engine 執行個體備份執行選擇性磁碟還原」。

必要的角色

如要取得從備份儲存空間還原 Compute Engine 執行個體所需的權限,請要求管理員在專案、目標專案、備份和災難復原服務代理,以及虛擬私有雲主專案中,授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

這些預先定義的角色具備從備份保存庫還原 Compute Engine 執行個體所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:

所需權限

如要從備份儲存庫還原 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
  • 使用 Google Cloud 控制台還原 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 控制台的「Vaulted backups」(已封存備份) 頁面。

    前往 vault 中的備份

    這裡會列出所有具有封存備份的 Compute Engine 執行個體。

  2. 按一下動作圖示,然後選取「還原」動作。「還原頁面」會顯示下列還原選項:

  3. 按一下 [繼續]

    系統會顯示「從備份檔建立新的 Compute Engine 執行個體」頁面,並根據來源 Compute Engine 執行個體屬性預先填入 Compute Engine 執行個體屬性。您可以修改屬性來建立新的 Compute Engine 執行個體,例如變更「區域」或「機型」的選取項目。

  4. 按一下「建立」,從所選備份建立新的 VM。

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 執行個體,並使用備份完整資源 URL:

      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 執行個體屬性,請參閱「備份和災難復原服務總覽 」一文中的 gcloud CLI 指令。

還原選擇性磁碟備份的限制

使用選擇性磁碟備份建立備份後,還原 Compute Engine 執行個體時,系統只會還原備份時受保護的磁碟,並將這些磁碟連結至新的虛擬機器 (VM) 執行個體。在 Google Cloud 控制台的摘要部分中,系統會醒目顯示備份中包含的受保護磁碟 (例如 Protected disks: 2 out of 3)。

如要避免還原 VM 時因排除磁碟而導致開機失敗,請設定來源 VM 的開機設定,忽略缺少的磁碟 (例如在 /etc/fstab 中新增 nofail 掛接選項)。如要進一步瞭解這項 Compute Engine 限制,請參閱「永久磁碟還原限制和注意事項」。

從已啟用 CMEK 的 backup vault 還原備份

從啟用 CMEK 的備份保存庫還原時,加密處理方式取決於您是還原整個 Compute Engine 執行個體,還是個別磁碟。

處理整個 Compute Engine 執行個體還原作業的 CMEK

從已啟用 CMEK 的 backup vault 還原整個 Compute Engine 執行個體時,備份本身會受到該 vault 的 CMEK 保護。根據預設,還原的 Compute Engine 執行個體中的磁碟會保留原始加密設定,也就是 Google 管理的加密金鑰或原始 CMEK。如要存取備份保存庫的 CMEK,必須將所需權限授予 Backup and DR 服務代理,詳情請參閱 CMEK 概念

個別磁碟還原作業的 CMEK 處理方式

選擇「個別磁碟」還原範圍,從 Compute Engine 執行個體備份還原單一磁碟時,會發生下列情況:

  • 預設行為:從備份建立的新磁碟會嘗試使用與原始 Compute Engine 執行個體來源磁碟相同的加密金鑰

    • 如果來源磁碟使用 Google 代管的加密功能,還原的磁碟也會使用 Google 代管的加密功能。

    • 如果來源磁碟使用特定 CMEK,還原的磁碟會嘗試使用相同的 CMEK。

  • 金鑰無法使用:如果目標專案或區域無法存取來源磁碟使用的原始 CMEK (例如金鑰已刪除、權限已變更或跨區域還原),還原作業就會失敗,除非您覆寫加密設定。

  • 覆寫加密設定:您可以在還原程序中變更還原磁碟的加密設定,方法如下:

    控制台

    • 在還原精靈的「目標磁碟屬性」部分,您可以使用下列任一選項修改「加密」設定:

      • 選取其他客戶自行管理的加密金鑰 (CMEK)。

      • 切換為 Google 代管的加密。

    gcloud

    • 使用 gcloud backup-dr backups restore disk 指令時,請加上 --source-instance-boot-disk--source-instance-disk-device-name 旗標:

      • 如要為還原的磁碟指定其他 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.iam.gserviceaccount.com

    • Compute Engine 必須具備這項權限,才能建立以所選金鑰加密的新磁碟。

如要進一步瞭解磁碟還原作業和旗標用法,請參閱從備份保存庫還原永久磁碟

從已啟用 CMEK 的 backup vault 還原備份

從已啟用 CMEK 的 backup vault 還原備份時,還原資源的加密方式取決於來源的加密方式:

  • 如果來源資源受 CMEK 保護:還原的資源預設會使用與來源相同的 CMEK 金鑰。例如:
    • 以金鑰 K1 加密的 Compute Engine 永久磁碟會還原為以 K1 加密的磁碟。
    • 如果 VM 有多個磁碟,還原的 VM 中的每個磁碟都會沿用對應來源磁碟的加密方式 (以 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),如果使用預設行為,還原作業就會失敗。還原的 VM 磁碟無法使用來源地區的 KMS 金鑰加密。

這是 Google Cloud 控制台目前的限制。如要跨區域還原受 CMEK 保護的 VM,您必須使用 gcloud CLI、API 或 Terraform 覆寫加密設定,並在目標區域中指定新的 KMS 金鑰。

如要還原至受新 CMEK 金鑰保護的資源,請按照下列步驟操作:

  1. 確認目標區域中有金鑰:確認您在還原 VM 的區域中 (目標專案或共用 KMS 專案),有 Cloud Key Management Service 金鑰,如果沒有,請建立一個。
  2. 授予 KMS 權限:將目標金鑰的「Cloud KMS CryptoKey Encrypter/Decrypter」 (roles/cloudkms.cryptoKeyEncrypterDecrypter) 角色,授予要還原 VM 的目標專案 Compute Engine 服務代理人。

  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. 還原具有單一磁碟的 VM:

      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:還原的 VM 名稱。
      • TARGET_ZONE:還原 VM 的可用區。
      • TARGET_PROJECT_ID:還原 VM 的專案。
      • 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. 還原有多個磁碟的 VM:為每個磁碟提供個別的 --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:還原的 VM 名稱。
      • TARGET_ZONE:還原 VM 的可用區。
      • TARGET_PROJECT_ID:還原 VM 的專案。
      • 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. 還原具有單一磁碟的 VM:

      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. 還原具有多個磁碟的 VM:

      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. 還原具有單一磁碟的 VM:

    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. 還原具有多個磁碟的 VM:

    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 金鑰版本已停用或刪除,您就無法從該備份還原資料。

備份和災難復原 Compute Engine 指南

後續步驟