ディスク スナップショットを管理する


標準ディスク スナップショットを使用すると、Persistent Disk と Google Cloud Hyperdisk からデータを定期的にバックアップできます。

ディスクのスナップショットの表示、一覧取得、削除を行うことができます。また、プロジェクト間でスナップショットを共有することもできます。

始める前に

  • まだ設定していない場合は、認証を設定します。認証とは、Google Cloud サービスと API にアクセスするために ID を確認するプロセスです。ローカル開発環境からコードまたはサンプルを実行するには、次のように 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.snapshots.list
  • スナップショットに関する情報を表示する: スナップショットに対する compute.snapshots.get
  • スナップショットを削除する: スナップショットに対する compute.snapshots.delete
  • フィルタに基づいてスナップショットを削除するには:
    • スナップショットに対する compute.snapshots.delete
    • プロジェクトに対する compute.snapshots.list
  • プロジェクト間でスナップショット データを共有する:
    • プロジェクトに対する compute.storageAdmin(すべての標準スナップショットにアクセス)
    • 共有するプロジェクトに対する compute.disks.create
    • 移動元プロジェクトに対する compute.snapshots.create
    • ソースディスクに対する compute.disks.createSnapshot

これらの権限は、カスタムロールや他の事前定義ロールを使用して取得することもできます。

特定のプロジェクトまたはロケーション内の標準スナップショットを一覧表示する

特定のプロジェクトまたはロケーションにある標準スナップショットを見る、または一覧表示するには、gcloud CLI、Google Cloud コンソール、または REST を使用します。

コンソール

  1. Google Cloud コンソールで、[スナップショット] ページに移動します。

    [スナップショット] ページに移動

  2. [スナップショット] タブに、現在のプロジェクトの標準スナップショットが表示されます。

  3. 省略可。filter_list の [フィルタ] フィールドを使用して、結果を絞り込みます。[フィルタ] フィールドにプロパティ名または値を入力するか、使用可能なプロパティから選択します。

gcloud

特定のプロジェクトで使用可能なスナップショットの一覧を表示するには、gcloud compute snapshots list コマンドを使用します。

gcloud compute snapshots list --project=PROJECT_ID

省略可。PROJECT_ID をプロジェクト ID で置き換えます。 このフラグを省略すると、現在のプロジェクトが使用されます。セッションのデフォルト プロジェクトを設定するには、gcloud CLI コマンド gcloud config set project PROJECT_ID を使用します。

REST

特定のプロジェクトで使用可能なスナップショットの一覧を表示するには、snapshots.list メソッドに対して GET リクエストを作成します。

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/snapshots

PROJECT_ID をプロジェクト ID で置き換えます。

ディスクの標準スナップショットを表示する

ディスクの標準スナップショットのリストを表示するには、Google Cloud コンソール、gcloud CLI、または REST を使用します。

コンソール

  1. Google Cloud コンソールで、[スナップショット] ページに移動します。

    [スナップショット] ページに移動

  2. [スナップショット] タブに、プロジェクト内のすべての標準スナップショットが一覧表示されます。

  3. ソースディスクで結果を絞り込みます。

    1. filter_list の [フィルタ] フィールドに「Source disk:」と入力するか、[フィルタ] フィールドをクリックし、その後、値 Source disk を [プロパティ] リストから選択します。

    2. [フィルタ] フィールドの Source disk: の横に表示される [] リストからディスクの名前を選択します。

      これで、コンソールに表示されるスナップショットに、指定したディスクのすべての標準スナップショットが表示されるようになります。

      [] リストにディスクの名前が表示されない場合は、Source disk: の横にある [フィルタ] フィールドにソースディスクの名前の最初の数文字を入力して、表示される値のリストを変更します

gcloud

特定のディスクに対する標準スナップショットの一覧を取得するには、gcloud compute snapshots list コマンド--filter 引数を使用します。

  • ゾーンディスクの標準スナップショットの一覧を取得するには:

    gcloud compute snapshots list --filter="sourceDisk:projects/PROJECT_ID/zones/SOURCE_ZONE/disks/DISK_NAME
    
  • リージョン ディスクの標準スナップショットの一覧を取得するには:

    gcloud compute snapshots list --filter=sourceDisk:projects/PROJECT_ID/regions/SOURCE_REGION/disks/DISK_NAME
    

次のように置き換えます。

  • PROJECT_ID: プロジェクトの ID。
  • SOURCE_ZONE: (ゾーンディスクのみ)ディスクのゾーン名(例: us-west1-a)。
  • SOURCE_REGION: (リージョン ディスクのみ)ディスクのリージョン名(例: us-west1)。
  • DISK_NAME: ディスクの名前(例: disk-1)。

REST

ゾーンまたはリージョン ディスクに対する標準スナップショットの一覧を取得するには、snapshots.list メソッドへの GET リクエストを行います。

filter=sourceDisk クエリ パラメータを使用して、ディスクの名前を指定します。

  • ゾーンディスクの標準スナップショットの一覧を取得するには:

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/snapshots?filter=sourceDisk:'https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/SOURCE_ZONE/disks/DISK_NAME'
    
  • リージョン ディスクの標準スナップショットの一覧を取得するには:

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/snapshots?filter=sourceDisk:'https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/SOURCE_REGION/disks/DISK_NAME'
    

次のように置き換えます。

  • PROJECT_ID: プロジェクトの ID。
  • SOURCE_ZONE: (ゾーンディスクのみ)ディスクのゾーン名(例: us-west1-a)。
  • SOURCE_REGION: (リージョン ディスクのみ)ディスクのリージョン名(例: us-west1)。
  • DISK_NAME: ソースディスクの名前(例: disk-1)。

標準スナップショットに関する情報を表示する

Google Cloud コンソール、Google Cloud CLI、または REST を使用して、標準スナップショットに関する詳細情報(作成日時、ソースディスク、サイズなど)を取得します。

コンソール

  1. Google Cloud コンソールで、[スナップショット] ページに移動します。

    [スナップショット] ページに移動

  2. [スナップショット] タブに、プロジェクト内のスナップショットの一覧が表示されます。

  3. [名前] 列で、標準スナップショットの名前をクリックします。選択したスナップショットの [スナップショットの詳細] ページが開き、そのプロパティが表示されます。

gcloud

標準スナップショットに関する情報を表示するには、gcloud compute snapshots describe コマンドを使用します。

gcloud compute snapshots describe SNAPSHOT_NAME

SNAPSHOT_NAME は、標準スナップショットの名前に置き換えます。

REST

snapshots.get メソッドGET リクエストを送信します。

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/snapshots/SNAPSHOT_NAME

次のように置き換えます。

  • PROJECT_ID: 標準スナップショットを含むプロジェクトの名前。
  • SNAPSHOT_NAME: 標準スナップショットの名前。

スナップショットを削除する

Compute Engine では差分スナップショットが使用されているため、各スナップショットに含まれているのは、前回のスナップショット以降に変更されたデータのみです。後のスナップショットで前のスナップショットに保存されていた情報が必要になることがあるため、スナップショットを削除しても、そのスナップショット上のすべてのデータが削除されるとは限りません。

スナップショットの削除の詳細については、スナップショットの削除をご覧ください。

コンソール

  1. Google Cloud コンソールで [スナップショット] ページに移動します。

    [スナップショット] ページに移動

  2. 削除するスナップショットを 1 つ以上選択します。

  3. [スナップショット] ページの上部の [削除] をクリックします。

gcloud

スナップショットを削除するには、gcloud compute snapshots delete コマンドを使用します。

gcloud compute snapshots delete SNAPSHOT_NAME

SNAPSHOT_NAME は、削除するスナップショットの名前に置き換えます。

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
)

// deleteSnapshot deletes a snapshot of a disk.
func deleteSnapshot(w io.Writer, projectID, snapshotName string) error {
	// projectID := "your_project_id"
	// snapshotName := "your_snapshot_name"

	ctx := context.Background()
	snapshotsClient, err := compute.NewSnapshotsRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewSnapshotsRESTClient: %w", err)
	}
	defer snapshotsClient.Close()

	req := &computepb.DeleteSnapshotRequest{
		Project:  projectID,
		Snapshot: snapshotName,
	}

	op, err := snapshotsClient.Delete(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to delete snapshot: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Snapshot deleted\n")

	return nil
}

Java


import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.SnapshotsClient;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class DeleteSnapshot {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.

    // Project ID or project number of the Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";

    // Name of the snapshot to be deleted.
    String snapshotName = "YOUR_SNAPSHOT_NAME";

    deleteSnapshot(projectId, snapshotName);
  }

  // Delete a snapshot of a disk.
  public static void deleteSnapshot(String projectId, String snapshotName)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `snapshotsClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (SnapshotsClient snapshotsClient = SnapshotsClient.create()) {

      Operation operation = snapshotsClient.deleteAsync(projectId, snapshotName)
          .get(3, TimeUnit.MINUTES);

      if (operation.hasError()) {
        System.out.println("Snapshot deletion failed!" + operation);
        return;
      }

      System.out.println("Snapshot deleted!");
    }
  }
}

Node.js

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const snapshotName = 'YOUR_SNAPSHOT_NAME';

const compute = require('@google-cloud/compute');

async function deleteSnapshot() {
  const snapshotsClient = new compute.SnapshotsClient();

  const [response] = await snapshotsClient.delete({
    project: projectId,
    snapshot: snapshotName,
  });
  let operation = response.latestResponse;
  const operationsClient = new compute.GlobalOperationsClient();

  // Wait for the create disk operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await operationsClient.wait({
      operation: operation.name,
      project: projectId,
    });
  }

  console.log('Snapshot deleted.');
}

deleteSnapshot();

Python

from __future__ import annotations

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1


def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result


def delete_snapshot(project_id: str, snapshot_name: str) -> None:
    """
    Delete a snapshot of a disk.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        snapshot_name: name of the snapshot to delete.
    """

    snapshot_client = compute_v1.SnapshotsClient()
    operation = snapshot_client.delete(project=project_id, snapshot=snapshot_name)

    wait_for_extended_operation(operation, "snapshot deletion")

REST

snapshots.delete メソッドDELETE リクエストを発行して、スナップショットを削除します。

DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/snapshots/SNAPSHOT_NAME

次のように置き換えます。

  • PROJECT_ID: プロジェクトの名前
  • SNAPSHOT_NAME: 削除するスナップショットの名前。

フィルタに基づいて複数のスナップショットを削除する

Compute Engine では差分スナップショットが使用されているため、各スナップショットに含まれているのは、前回のスナップショット以降に変更されたデータのみです。後のスナップショットで前のスナップショットに保存されていた情報が必要になることがあるため、スナップショットを削除しても、そのスナップショット上のすべてのデータが削除されるとは限りません。

スナップショットの削除の詳細については、スナップショットの削除をご覧ください。

特定のフィルタに基づいて複数のスナップショットを削除できます。gcloud CLI でフィルタを使用する方法の詳細については、gcloud CLI トピック フィルタをご覧ください。

スナップショットを削除するには、特定のフィルタを指定した gcloud compute snapshots list コマンドと、xargs を指定した gcloud compute snapshots delete コマンドを組み合わせて使用します。

  gcloud compute snapshots list --filter="EXPRESSION" --uri |
  xargs gcloud compute snapshots delete
  

EXPRESSION は、gcloud CLI トピック フィルタに置き換えます。

たとえば、--filter="creationTimestamp<'2023-12-31'" は、2023 年 12 月 31 日より前に作成されたすべてのスナップショットを削除します。

同じ組織内のプロジェクト間でスナップショット データを共有する

この手順を使用すると、あるプロジェクトのディスクから同じ組織内の別のプロジェクトのディスクにデータを移動できます。

gcloud

  1. gcloud compute snapshots create コマンドを使用して、宛先プロジェクトに標準スナップショットを作成します。たとえば、ゾーン Persistent Disk または Hyperdisk のスナップショットを作成するには、次のコマンドを使用します。

    gcloud compute snapshots create SNAPSHOT_NAME \
     --source-disk https://www.googleapis.com/compute/v1/projects/SOURCE_PROJECT_ID/zones/ZONE/disks/SOURCE_DISK_NAME \
     --project DESTINATION_PROJECT_ID
    

    次のように置き換えます。

    • SNAPSHOT_NAME: 新しいスナップショットの名前。
    • SOURCE_PROJECT_ID: ソースディスクのプロジェクトの ID。
    • ZONE: ソースディスクのゾーン。
    • SOURCE_DISK_NAME: ソースディスクの名前。
    • DESTINATION_PROJECT_ID: 新しいスナップショットの宛先プロジェクトの ID。
  2. 宛先プロジェクトで、gcloud compute disks create コマンドを使用して、スナップショットに基づいてゾーンディスクまたはリージョン ディスクを作成します。

    gcloud compute disks create DISK_NAME \
     --source-snapshot SNAPSHOT_NAME \
     --project DESTINATION_PROJECT_ID
    

    次のように置き換えます。

    • DISK_NAME: 新しいディスクの名前。
    • SNAPSHOT_NAME: スナップショットの名前。
    • DESTINATION_PROJECT_ID: 新しいディスクの宛先プロジェクトの ID。

REST

  1. snapshots.insert メソッドを呼び出して、宛先プロジェクトに標準スナップショットを作成します。たとえば、ゾーン Persistent Disk または Hyperdisk のスナップショットを作成するには、次のリクエストを行います。

    POST https://compute.googleapis.com/compute/v1/projects/DESTINATION_PROJECT_ID/global/snapshots
    {
     "name": SNAPSHOT_NAME
     "sourceDisk": "projects/SOURCE_PROJECT_ID/zones/SOURCE_ZONE/disks/SOURCE_DISK_NAME
    }
    

    次のように置き換えます。

    • DESTINATION_PROJECT_ID: 新しいスナップショットの宛先プロジェクトの ID。
    • SNAPSHOT_NAME: スナップショットの名前。
    • SOURCE_PROJECT_ID: ソースディスク プロジェクトの ID。
    • SOURCE_ZONE: ソースディスクのゾーン。
    • SOURCE_DISK_NAME: ソースディスクの名前。
  2. 宛先プロジェクトで、ゾーン disks.insert メソッドまたはリージョン regionDisks.insert メソッドを使用して、スナップショットに基づいてゾーン ディスクまたはリージョン ディスクを作成します。

    たとえば、ゾーンディスクを作成するには、次のリクエストを送信します。

    POST https://compute.googleapis.com/compute/v1/projects/DESTINATION_PROJECT_ID/zones/DESTINATION_ZONE/disks
    {
     "name": DISK_NAME
     "sourceSnapshot": SNAPSHOT_NAME
    }
    

    次のように置き換えます。

    • DESTINATION_PROJECT_ID: 新しいディスクの宛先プロジェクトの ID。
    • DESTINATION_ZONE: 新しいディスクの宛先プロジェクトのゾーン。
    • DISK_NAME: 新しいディスクの名前。
    • SNAPSHOT_NAME: スナップショットの名前。

使用可能なスナップショットの一覧を取得するには、プロジェクトまたはロケーションの標準スナップショットを表示するをご覧ください。

異なる組織のプロジェクト間でスナップショットを共有する

この手順を使用すると、ある組織のプロジェクトの標準スナップショットを別の組織の別のプロジェクトと共有できます。

gcloud

  1. ソース プロジェクトで、gcloud compute disks create コマンドを使用して、スナップショットに基づくディスクを作成します。

    gcloud compute disks create DISK_NAME \
     --source-snapshot SNAPSHOT_NAME \
     --project SOURCE_PROJECT_ID \
     --zone ZONE
    

    次のように置き換えます。

    • DISK_NAME: 新しいディスクの名前。
    • SNAPSHOT_NAME: スナップショットの名前。
    • SOURCE_PROJECT_ID: ソース プロジェクトの ID。
    • ZONE: 新しいディスクを作成するゾーン。

    このディスクは、組織間でスナップショットをコピーするためだけに作成される一時ディスクです。

  2. 宛先プロジェクトで、gcloud compute snapshots create コマンドを使用してスナップショットを作成します。

    たとえば、最初の手順で作成したゾーンディスクを使用してスナップショットを作成するには、次のコマンドを使用します。

    gcloud compute snapshots create SNAPSHOT_NAME \
     --source-disk https://www.googleapis.com/compute/v1/projects/SOURCE_PROJECT_ID/zones/ZONE/disks/DISK_NAME \
     --project DESTINATION_PROJECT_ID
    

    次のように置き換えます。

    • SNAPSHOT_NAME: スナップショットの名前。
    • SOURCE_PROJECT_ID: ソースディスクを含むプロジェクトの ID。
    • ZONE: ソースディスクのゾーン。
    • DISK_NAME: 手順 1 で作成したディスクの名前。
    • DESTINATION_PROJECT_ID: 新しいスナップショットの宛先プロジェクトの ID。

    使用可能なスナップショットの一覧を取得するには、プロジェクトまたはロケーションの標準スナップショットを表示するをご覧ください。

  3. gcloud compute disks delete コマンドを使用して、最初の手順で作成した一時ディスクを削除します。

    gcloud compute disks delete DISK_NAME \
     --project SOURCE_PROJECT_ID --zone ZONE
    

    次のように置き換えます。

    • DISK_NAME: 手順 1 で作成したディスクの名前。
    • SOURCE_PROJECT_ID: ソースディスクを含むプロジェクトの ID。
    • ZONE: ディスクのゾーン

REST

  1. ソース プロジェクトで、ゾーンの disks.insert メソッドを使用して、スナップショットに基づくゾーンディスクまたはリージョン ディスクを作成します。

    たとえば、ゾーンディスクを作成するには、次のリクエストを送信します。

    POST https://compute.googleapis.com/compute/v1/projects/SOURCE_PROJECT_ID/zones/SOURCE_ZONE/disks
    {
     "name": DISK_NAME
     "sourceSnapshot": SNAPSHOT_NAME
    }
    

    次のように置き換えます。

    • SOURCE_PROJECT_ID: 新しいディスクのソース プロジェクトの ID。
    • SOURCE_ZONE: 新しいディスクのゾーン。
    • DISK_NAME: 新しいディスクの名前。
    • SNAPSHOT_NAME: スナップショットの名前。

    このディスクは、組織間でスナップショットをコピーするためだけに作成される一時ディスクです。

  2. snapshots.insert メソッドを呼び出して、宛先プロジェクトにスナップショットを作成します。

    たとえば、最初の手順で作成したゾーンディスクを使用してスナップショットを作成するには、次のコマンドを使用します。

    POST https://compute.googleapis.com/compute/v1/projects/DESTINATION_PROJECT_ID/global/snapshots
    {
       "name": SNAPSHOT_NAME
       "sourceDisk": "projects/SOURCE_PROJECT_ID/zones/SOURCE_ZONE/disks/DISK_NAME
    }
    

    次のように置き換えます。

    • DESTINATION_PROJECT_ID: 新しいスナップショットの宛先プロジェクトの ID。
    • SNAPSHOT_NAME: スナップショットの名前。
    • SOURCE_PROJECT_ID: ソースディスクを含むプロジェクトの ID。
    • SOURCE_ZONE: ソースディスクのゾーン。
    • DISK_NAME: ソースディスクの名前。
  3. disks.delete メソッドを使用して、最初の手順で作成した一時ディスクを削除します。

    DELETE https://compute.googleapis.com/compute/v1/projects/SOURCE_PROJECT_ID/zones/SOURCE_ZONE/disks/DISK_NAME
    

    次のように置き換えます。

    • SOURCE_PROJECT_ID: 一時ディスクを含むプロジェクトの ID。
    • SOURCE_ZONE: ディスクのゾーン
    • DISK_NAME: 手順 1 で作成した一時ディスクの名前。

次のステップ