通过即时快照恢复磁盘


如需访问即时快照中捕获的数据,您必须通过即时快照恢复或创建新磁盘。

本页面介绍了如何通过即时快照创建磁盘。创建磁盘后,您可以通过将其挂接到虚拟机 (VM) 来使用磁盘。

准备工作

  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以选择以下任一选项向 Compute Engine 进行身份验证:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

      如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

所需的角色和权限

如需获得通过即时快照创建磁盘所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:

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

这些预定义角色可提供通过即时快照创建磁盘所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

通过即时快照创建磁盘需要以下权限:

  • 创建磁盘:
    • 针对新磁盘的目标项目的 compute.disks.create 权限
    • 针对来源即时快照的 compute.instantSnapshots.useReadOnly 权限

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

限制

需要遵循以下限制:

  • 通过即时快照创建磁盘时,新磁盘始终与快照的来源磁盘具有相同的类型、存储位置和加密方式。

  • 您无法直接通过即时快照创建虚拟机。 您必须通过即时快照创建磁盘,然后使用新磁盘创建虚拟机。

  • 如果即时快照的来源磁盘使用客户管理的加密密钥或客户提供的加密密钥,则您必须在通过即时快照创建新磁盘时提供相同的加密密钥。

    请参考下面的示例。假设您有一个使用客户提供的加密密钥 (CSEK) KEY-1 加密的磁盘 DISK-1。您还有一个通过 DISK-1 创建的即时快照 IS-1。如需通过 IS-1 创建新磁盘,您必须在创建新磁盘时提供相同的密钥 KEY-1

    如果磁盘使用客户管理的加密密钥 (CMEK) 进行加密,则只有在使用 REST 或 gcloud CLI 创建磁盘时,您才需要提供密钥。如果您使用 Google Cloud 控制台,则无需指定加密密钥。

通过即时快照创建磁盘

即时快照采用与其来源磁盘相同的加密方式进行加密。通过即时快照创建磁盘的步骤取决于即时快照来源磁盘的加密方式。

每个来源磁盘都使用以下方法之一进行加密:

  • Google 拥有的密钥和 Google 管理的密钥。这是默认设置。
  • 客户管理的加密密钥 (CMEK)
  • 客户提供的加密密钥 (CSEK)。

如需了解特定磁盘的加密方式,请参阅查看有关磁盘加密的信息

通过使用默认加密方式加密的即时快照创建磁盘

您可以使用 gcloud CLI、Google Cloud 控制台或 REST 通过即时快照创建磁盘。

控制台

  1. 找到您要恢复的即时快照:

    1. 在 Google Cloud 控制台中,转到快照页面。

      转到“快照”

    2. 点击即时快照标签页。

    3. 名称列中,点击您要恢复的即时快照的名称。

  2. 点击创建磁盘

  3. 名称字段中,输入磁盘的新名称。

  4. 可选:在说明字段中,输入其他详细信息。

  5. 确认磁盘来源类型即时快照

  6. 来源即时快照列表中,选择相应的即时快照。

  7. 可选:为磁盘配置其他自定义设置。

    • 输入大小:在大小字段中,指定磁盘大小(以 GB 为单位)。该大小必须等于或大于快照的来源磁盘大小。
    • 安排备份:如果您希望 Compute Engine 按时间表创建新磁盘的标准快照,请选中启用快照时间表复选框,然后选择一个快照时间表。否则,请清除该复选框。
  8. 可选:如需整理项目,请添加一个或多个标签

  9. 如需创建磁盘,请点击创建

gcloud

使用 gcloud compute disks create 命令。 您指定的参数取决于您是要创建可用区级磁盘还是区域级磁盘。

创建可用区级磁盘

使用 --zone 标志指定可用区:

gcloud compute disks create DISK_NAME --zone=ZONE \
  --source-instant-snapshot=SOURCE_INSTANT_SNAPSHOT_NAME

替换以下内容:

  • DISK_NAME:新磁盘的名称。
  • ZONE:新磁盘所在的可用区,例如 europe-west1-a
  • SOURCE_INSTANT_SNAPSHOT_NAME:来源即时快照的名称。

创建区域级磁盘

使用 --region 指定区域,并使用 --replica-zones 指定新磁盘的目标复制可用区。

gcloud compute disks create DISK_NAME \
 --region=REGION \
 --source-instant-snapshot=SOURCE_INSTANT_SNAPSHOT_NAME \
 --replica-zones=ZONE1,ZONE2

替换以下内容:

  • DISK_NAME:新磁盘的名称。
  • REGION:区域级磁盘所在的区域,例如 europe-west1
  • SOURCE_INSTANT_SNAPSHOT_NAME:来源即时快照的名称。
  • ZONE1,ZONE2:两个磁盘副本所在区域内的可用区,例如 europe-west1-b,europe-west1-c

REST

如需通过即时快照创建可用区级或区域级磁盘,请使用 disks.insert 方法。新磁盘的类型必须与即时快照的来源磁盘的类型相同。例如,您无法通过可用区级磁盘的快照创建区域级磁盘。

创建可用区级磁盘

发出 POST 请求,并指定来源即时快照。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT/zones/SOURCE_ZONE/disks/insert
{
"name": "NEW_DISK_NAME",
"sourceInstantSnapshot": "projects/PROJECT/zones/SOURCE_ZONE/instantSnapshots/SOURCE_INSTANT_SNAPSHOT_NAME"
}

替换以下内容:

  • PROJECT:要在其中创建新磁盘的项目。
  • SOURCE_ZONE:即时快照所在的可用区,例如 us-central1-a。系统会在此可用区中创建磁盘。
  • NEW_DISK_NAME:新磁盘的唯一名称。
  • SOURCE_INSTANT_SNAPSHOT_NAME:来源即时快照的名称。

创建区域级磁盘

发出 POST 请求,并指定来源即时快照以及磁盘应复制到的可用区。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT/region/SOURCE_REGION/disks/insert

{
"name": "NEW_DISK_NAME",
"sourceInstantSnapshot": "projects/PROJECT/regions/SOURCE_REGION/instantSnapshots/SOURCE_INSTANT_SNAPSHOT_NAME",
"replicaZones": [
  "projects/PROJECT/zones/ZONE1",
  "projects/PROJECT/zones/ZONE2"
]
}

替换以下内容:

  • PROJECT:要在其中创建新磁盘的项目。
  • SOURCE_REGION:即时快照所在的区域。 系统会在此区域中创建磁盘。
  • NEW_DISK_NAME:新磁盘的唯一名称。
  • SOURCE_INSTANT_SNAPSHOT_NAME:来源即时快照的名称。
  • ZONE1,ZONE2:两个磁盘副本所在区域内的可用区,例如 europe-west1-beurope-west1-c

API 请求响应

如果 POST 请求成功,则响应正文将是一个对象,您可以轮询该对象以获取磁盘的创建状态。如需了解详情,请参阅处理 API 响应

通过 CMEK 或 CSEK 加密的即时快照创建磁盘

控制台

如果即时快照使用 Google 默认加密或 CMEK 加密,则 Google Cloud 控制台会在您通过即时快照创建磁盘时自动提供加密密钥。否则,如果即时快照使用 CSEK 加密,您必须提供加密密钥才能创建磁盘。

按照由 Google 管理的加密部分中的步骤操作,并按照以下说明指定加密密钥:

  1. 解密部分的加密密钥字段中输入加密密钥。
  2. 如果密钥使用 RSA 公钥封装,请选择已封装的密钥

gcloud

使用 gcloud compute disks create 命令

如果来源磁盘使用 CMEK 加密,请使用 --kms-key 参数提供密钥的名称。

如果来源磁盘使用 CSEK 加密,请使用 --csek-key-file 参数指定来源磁盘的加密密钥。

CMEK

如需通过 CMEK 加密的即时快照创建可用区级磁盘,请使用以下命令:

     gcloud compute disks create NEW_DISK_NAME \
       --zone=SOURCE_ZONE \
       --source-instant-snapshot=SOURCE_INSTANT_SNAPSHOT_NAME \
       --kms-key=projects/KMS_PROJECT_NAME/locations/KEYRING_LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME

替换以下内容:

  • NEW_DISK_NAME:新磁盘的名称。
  • SOURCE_ZONE:存储即时快照的可用区,例如 europe-west1-a
  • SOURCE_INSTANT_SNAPSHOT_NAME:来源即时快照的名称。
  • KMS_PROJECT_NAME:包含密钥的项目。
  • KEYRING_LOCATION:密钥所属的密钥环的位置。如果密钥环是全球密钥,请指定 global。否则,请指定密钥环所在区域的名称,例如 us-west1
  • KEY_RING_NAME:包含密钥的密钥环的名称,例如 key-ring-1
  • KEY_NAME:用于加密磁盘的密钥的名称。

CSEK

如需通过 CSEK 加密的即时快照创建可用区级磁盘,请使用以下命令:

     gcloud compute disks create NEW_DISK_NAME \
       --zone=SOURCE_ZONE \
       --source-instant-snapshot=SOURCE_INSTANT_SNAPSHOT_NAME \
       --csek-key-file=PATH_TO_CSEK_JSON_FILE
 

替换以下内容:

  • NEW_DISK_NAME:新磁盘的名称。
  • SOURCE_ZONE:存储即时快照的可用区,例如 europe-west1-a
  • SOURCE_INSTANT_SNAPSHOT_NAME:来源即时快照的名称。
  • CSEK_JSON_FILE:包含密钥的 JSON 文件的路径。请参阅 CSEK 文件格式示例

如需创建区域级磁盘,请将上述示例中的 --zone 标志替换为以下标志:

  • --region:新磁盘所在的区域
  • --replica-zones:两个磁盘副本所在区域内的可用区。

REST

如需通过 CMEK 或 CSEK 加密的即时快照创建可用区级或区域级磁盘,请使用 Google 管理的加密部分中列出的属性向 disks.insert 方法发出 POST 请求。

此外,请在 diskEncryptionKey 字段中提供来源磁盘的加密密钥。diskEncryptionKey 字段的属性取决于磁盘是使用 CMEK 加密还是 CSEK 加密。

以下示例展示了如何为每种加密类型创建新的可用区级磁盘。

CMEK

在请求正文中,使用 diskEncryptionKey.kmsKeyName 属性指定密钥的名称:

{
"name": "NEW_DISK_NAME",
"sourceInstantSnapshot": "projects/PROJECT/zones/SOURCE_ZONE/instantSnapshots/SOURCE_INSTANT_SNAPSHOT_NAME",
"diskEncryptionKey": {
      "kmsKeyName": "projects/KMS_PROJECT/locations/LOCATION/keyRings/KEYRING_LOCATION/cryptoKeys/KEY_NAME"
  }
}

替换以下内容:

  • NEW_DISK_NAME:新磁盘的唯一名称。
  • PROJECT:要在其中创建新磁盘的项目。
  • SOURCE_ZONE:即时快照所在的可用区,例如 us-central1-a。系统会在此可用区中创建磁盘。
  • SOURCE_INSTANT_SNAPSHOT_NAME:来源即时快照的名称。
  • KMS_PROJECT:包含密钥的项目。
  • LOCATION:密钥所属的密钥环的位置。如果密钥环是全球密钥,请指定 global。否则,请指定密钥环所在区域的名称,例如 us-west1
  • KEY_RING:包含密钥的密钥环的名称,例如 key-ring-1
  • KEY:用于加密磁盘的密钥的名称。

CSEK

请求正文取决于用于加密即时快照的 CSEK 是否使用 RSA 加密。

如需使用原始(非 RSA 加密)密钥,请在请求正文的 diskEncryptionKey.rawKey 属性中指定密钥:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT/zones/SOURCE_ZONE/disks/insert
{
  "name": "NEW_DISK_NAME",
  "sourceInstantSnapshot": "projects/PROJECT/zones/SOURCE_ZONE/instantSnapshots/INSTANT_SNAPSHOT_NAME,
  "diskEncryptionKey": {
      "rawKey": "RAW_ENCRYPTION_KEY"
  }
}

将以下变量替换为相应值:

  • PROJECT:要在其中创建新磁盘的项目。
  • SOURCE_ZONE:即时快照所在的可用区,例如 us-central1-a。系统会在此可用区中创建磁盘。
  • NEW_DISK_NAME:新磁盘的唯一名称。
  • SOURCE_INSTANT_SNAPSHOT_NAME:来源即时快照的名称。
  • RAW_ENCRYPTION_KEY:用于加密即时快照及其来源磁盘的密钥,例如 SGVsbG8gZnJvbSBHb29nbGUgQ2xvdWQgUGxhdGZvcm0=

如需使用 RSA 加密密钥,请按如下所示修改上述示例:

  • disks.insert 方法发出 POST 请求:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/disks/insert
    

  • 在请求正文的 diskEncryptionKey.rsaEncryptedKey 属性中指定密钥:

    "diskEncryptionKey": {
     "rsaEncryptedKey": "RSA_ENCRYPTED_KEY"
    }
    

RSA_ENCRYPTED_KEY 替换为您的加密密钥。

API 请求响应

如果 POST 请求成功,则响应正文将是一个对象,您可以轮询该对象以获取磁盘的创建状态。如需了解详情,请参阅处理 API 响应