Laufwerk-Snapshots erstellen und verwalten

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Erstellen Sie Snapshots, um regelmäßig Daten aus Ihren zonalen oder regionalen nichtflüchtigen Speichern zu sichern.

Sie können auch Snapshots von Laufwerken erstellen, die ausgeführten Instanzen zugeordnet sind. Snapshots sind globale Ressourcen, sodass Sie sie zur Wiederherstellung von Daten auf einem neuen Laufwerk oder einer neuen Instanz innerhalb desselben Projekts verwenden können. Außerdem ist eine projektübergreifende Freigabe von Snapshots möglich.

Hinweis

Erstellen von Snapshots vorbereiten

So bereiten Sie das Erstellen von Snapshots nichtflüchtiger Speicher vor:

Snapshot eines nichtflüchtigen Speichers erstellen

Console

  1. Rufen Sie in der Google Cloud Console die Seite VM-Instanzen auf.

    Zu "VM-Instanzen"
    Die verbleibenden Schritte werden automatisch in der Google Cloud Console angezeigt.

  2. Wählen Sie das Projekt aus, das Ihre VM-Instanzen enthält.
  3. Klicken Sie in der Spalte Name auf den Namen der VM mit dem zu sichernden nichtflüchtigen Speicher.
  4. Unter Speicher:
    • Klicken Sie im Abschnitt Bootlaufwerk auf Name, um das Bootlaufwerk zu sichern.
    • Klicken Sie unter Zusätzliche Laufwerke auf Name für den angehängten nichtflüchtigen Speicher, um ihn zu sichern.
  5. Klicken Sie auf Snapshot erstellen.
  6. Geben Sie unter Name einen eindeutigen Namen ein, um den Zweck des Snapshots zu identifizieren. Beispiel:
    • boot-disk-snapshot
    • attached-persistent-disk-snapshot
  7. Unter Typ ist der Standardwert ein regulärer Snapshot, der für eine langfristige Sicherung und Notfallwiederherstellung am besten geeignet ist.

    Wählen Sie Archiv-Snapshot aus, um eine kostengünstigere Datenaufbewahrung zu ermöglichen.

  8. Unter Standort ist die Standardeinstellung Multiregional, was eine höhere Verfügbarkeit zu höheren Kosten bietet.

    Wählen Sie Regionale Snapshots aus, um den physischen Standort Ihrer Daten zu geringeren Kosten zu steuern.

  9. Klicken Sie auf Erstellen, um einen manuellen Snapshot zu erstellen.

gcloud

Erstellen Sie den Snapshot am Standardspeicherort oder an einem ausgewählten Speicherort. Sie müssen einen Snapshot-Namen angeben. Der Name muss zwischen 1 und 63 Zeichen lang sein und RFC 1035 entsprechen.

  • Verwenden Sie den Befehl gcloud compute snapshots create, um einen Snapshot eines nichtflüchtigen Speichers am Standardspeicherort zu erstellen:

    gcloud compute snapshots create SNAPSHOT_NAME \
        --source-disk SOURCE_DISK \
        --snapshot-type SNAPSHOT_TYPE \
        --source-disk-zone SOURCE_DISK_ZONE
    

    Dabei gilt:

    • SNAPSHOT_NAME: Ein Name für den Snapshot.
    • SOURCE_DISK: Der Name des nichtflüchtigen Speichers, von dem Sie einen Snapshot erstellen möchten.
    • SNAPSHOT_TYPE: Der Snapshot-Typ, entweder STANDARD oder ARCHIVE. Wenn kein Snapshot-Typ angegeben ist, wird ein Snapshot vom Typ STANDARD erstellt.
    • SOURCE_DISK_ZONE: Die Zone des nichtflüchtigen Speichers, von dem Sie einen Snapshot erstellen möchten.
  • Alternativ können Sie einen Snapshot an einem benutzerdefinierten Speicherort erstellen. Dabei legen Sie mit dem Flag --storage-location fest, wo der Snapshot gespeichert werden soll:

    gcloud compute snapshots create SNAPSHOT_NAME \
        --source-disk SOURCE_DISK \
        --source-disk-zone SOURCE_DISK_ZONE \
        --storage-location STORAGE_LOCATION \
        --snapshot-type SNAPSHOT_TYPE
    

    Dabei gilt:

    • SNAPSHOT_NAME: Ein Name für den Snapshot.
    • SOURCE_DISK: Der Name des nichtflüchtigen Speichers, von dem Sie einen Snapshot erstellen möchten.
    • SOURCE_DISK_ZONE: Die Zone des nichtflüchtigen Speichers, von dem Sie einen Snapshot erstellen möchten.
    • STORAGE_LOCATION: Der multiregionale Cloud Storage-Speicherort oder die Cloud Storage-Region, in der Sie den Snapshot speichern möchten. Sie können nur einen Speicherort angeben.
    • SNAPSHOT_TYPE: Der Snapshot-Typ, entweder STANDARD oder ARCHIVE. Wenn kein Snapshot-Typ angegeben ist, wird ein Snapshot vom Typ STANDARD erstellt.

Die gcloud CLI wartet bis der Vorgang den Status READY oder FAILED zurückgibt oder das Zeitlimit erreicht und die letzten bekannten Details des Snapshots zurückgibt.

Terraform

Verwenden Sie die Ressource google_compute_snapshot, um einen Snapshot des zonalen nichtflüchtigen Speichers zu erstellen.

resource "google_compute_snapshot" "snapdisk" {
  name        = "snapshot-name"
  source_disk = google_compute_disk.default.name
  zone        = "us-central1-a"
}

Informationen zum Anwenden oder Entfernen einer Terraform-Konfiguration finden Sie unter Mit einer Terraform-Konfiguration arbeiten.

API

Erstellen Sie den Snapshot am Standardspeicherort oder an einem ausgewählten Speicherort.

  • Zum Erstellen eines Snapshots am Standardspeicherort senden Sie eine POST-Anfrage an die Methode 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/SOURCE_DISK_NAME
      "snapshotType": SNAPSHOT_TYPE
    }
    

    Dabei gilt:

    • DESTINATION_PROJECT_ID: Die ID des Projekts, in dem Sie den Snapshot erstellen möchten.
    • SNAPSHOT_NAME: Ein Name für den Snapshot.
    • SOURCE_PROJECT_ID: Die ID des Projekts des Quelllaufwerks.
    • SOURCE_ZONE: Die Zone des Quelllaufwerks.
    • SOURCE_DISK_NAME: Der Name des nichtflüchtigen Speichers, von dem Sie einen Snapshot erstellen möchten.
    • SNAPSHOT_TYPE: Der Snapshot-Typ, entweder STANDARD oder ARCHIVE. Wenn kein Snapshot-Typ angegeben ist, wird ein Snapshot vom Typ STANDARD erstellt.
  • Wenn Sie alternativ einen Snapshot an einem benutzerdefinierten Speicherort erstellen möchten, senden Sie eine POST-Anfrage an die Methode snapshots.insert und geben Sie den Speicherort an:

    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
      "snapshotType": SNAPSHOT_TYPE
      "storageLocations": STORAGE_LOCATION
    }
    

    Dabei gilt:

    • DESTINATION_PROJECT_ID: Die ID des Projekts, in dem Sie den Snapshot erstellen möchten.
    • SNAPSHOT_NAME: Ein Name für den Snapshot.
    • SOURCE_PROJECT_ID: Die ID des Projekts des Quelllaufwerks.
    • SOURCE_ZONE: Die Zone des Quelllaufwerks.
    • SOURCE_DISK_NAME: Der Name des nichtflüchtigen Speichers, von dem Sie einen Snapshot erstellen möchten.
    • SNAPSHOT_TYPE: Der Snapshot-Typ, entweder STANDARD oder ARCHIVE. Wenn kein Snapshot-Typ angegeben ist, wird ein Snapshot vom Typ STANDARD erstellt.
    • STORAGE_LOCATION: Der multiregionale Cloud Storage-Speicherort oder die Cloud Storage-Region, in der Sie den Snapshot speichern möchten. Sie können nur einen Speicherort angeben.

Einfach loslegen (Go)

Go

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Go in der Compute Engine-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Compute Engine Go API.

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "google.golang.org/genproto/googleapis/cloud/compute/v1"
	"google.golang.org/protobuf/proto"
)

// createSnapshot creates a snapshot of a disk.
func createSnapshot(
	w io.Writer,
	projectID, diskName, snapshotName, zone, region, location, diskProjectID string,
) error {
	// projectID := "your_project_id"
	// diskName := "your_disk_name"
	// snapshotName := "your_snapshot_name"
	// zone := "europe-central2-b"
	// region := "eupore-central2"
	// location = "eupore-central2"
	// diskProjectID = "YOUR_DISK_PROJECT_ID"

	ctx := context.Background()

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

	if zone == "" && region == "" {
		return fmt.Errorf("you need to specify `zone` or `region` for this function to work")
	}

	if zone != "" && region != "" {
		return fmt.Errorf("you can't set both `zone` and `region` parameters")
	}

	if diskProjectID == "" {
		diskProjectID = projectID
	}

	disk := &computepb.Disk{}
	locations := []string{}
	if location != "" {
		locations = append(locations, location)
	}

	if zone != "" {
		disksClient, err := compute.NewDisksRESTClient(ctx)
		if err != nil {
			return fmt.Errorf("NewDisksRESTClient: %v", err)
		}
		defer disksClient.Close()

		getDiskReq := &computepb.GetDiskRequest{
			Project: projectID,
			Zone:    zone,
			Disk:    diskName,
		}

		disk, err = disksClient.Get(ctx, getDiskReq)
		if err != nil {
			return fmt.Errorf("unable to create disk: %v", err)
		}
	} else {
		regionDisksClient, err := compute.NewRegionDisksRESTClient(ctx)
		if err != nil {
			return fmt.Errorf("NewRegionDisksRESTClient: %v", err)
		}
		defer regionDisksClient.Close()

		getDiskReq := &computepb.GetRegionDiskRequest{
			Project: projectID,
			Region:  region,
			Disk:    diskName,
		}

		disk, err = regionDisksClient.Get(ctx, getDiskReq)
		if err != nil {
			return fmt.Errorf("unable to create disk: %v", err)
		}
	}

	req := &computepb.InsertSnapshotRequest{
		Project: projectID,
		SnapshotResource: &computepb.Snapshot{
			Name:             proto.String(snapshotName),
			SourceDisk:       proto.String(disk.GetSelfLink()),
			StorageLocations: locations,
		},
	}

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

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

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

	return nil
}

Java

Java

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Java in der Compute Engine-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Compute Engine Java API.


import com.google.cloud.compute.v1.Disk;
import com.google.cloud.compute.v1.DisksClient;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.RegionDisksClient;
import com.google.cloud.compute.v1.Snapshot;
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 CreateSnapshot {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // You need to pass `zone` or `region` parameter relevant to the disk you want to
    // snapshot, but not both. Pass `zone` parameter for zonal disks and `region` for
    // regional disks.

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

    // Name of the disk you want to create.
    String diskName = "YOUR_DISK_NAME";

    // Name of the snapshot that you want to create.
    String snapshotName = "YOUR_SNAPSHOT_NAME";

    // The zone of the source disk from which you create the snapshot (for zonal disks).
    String zone = "europe-central2-b";

    // The region of the source disk from which you create the snapshot (for regional disks).
    String region = "your-disk-region";

    // The Cloud Storage multi-region or the Cloud Storage region where you
    // want to store your snapshot.
    // You can specify only one storage location. Available locations:
    // https://cloud.google.com/storage/docs/locations#available-locations
    String location = "europe-central2";

    // Project ID or project number of the Cloud project that
    // hosts the disk you want to snapshot. If not provided, the value will be defaulted
    // to 'projectId' value.
    String diskProjectId = "YOUR_DISK_PROJECT_ID";

    createSnapshot(projectId, diskName, snapshotName, zone, region, location, diskProjectId);
  }

  // Creates a snapshot of a disk.
  public static void createSnapshot(String projectId, String diskName, String snapshotName,
      String zone, String region, String location, String diskProjectId)
      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()) {

      if (zone.isEmpty() && region.isEmpty()) {
        throw new Error("You need to specify 'zone' or 'region' for this function to work");
      }

      if (!zone.isEmpty() && !region.isEmpty()) {
        throw new Error("You can't set both 'zone' and 'region' parameters");
      }

      // If Disk's project id is not specified, then the projectId parameter will be used.
      if (diskProjectId.isEmpty()) {
        diskProjectId = projectId;
      }

      // If zone is not empty, use the DisksClient to create a disk.
      // Else, use the RegionDisksClient.
      Disk disk;
      if (!zone.isEmpty()) {
        DisksClient disksClient = DisksClient.create();
        disk = disksClient.get(projectId, zone, diskName);
      } else {
        RegionDisksClient regionDisksClient = RegionDisksClient.create();
        disk = regionDisksClient.get(diskProjectId, region, diskName);
      }

      // Set the snapshot properties.
      Snapshot snapshotResource;
      if (!location.isEmpty()) {
        snapshotResource = Snapshot.newBuilder()
            .setName(snapshotName)
            .setSourceDisk(disk.getSelfLink())
            .addStorageLocations(location)
            .build();
      } else {
        snapshotResource = Snapshot.newBuilder()
            .setName(snapshotName)
            .setSourceDisk(disk.getSelfLink())
            .build();
      }

      // Wait for the operation to complete.
      Operation operation = snapshotsClient.insertAsync(projectId, snapshotResource)
          .get(3, TimeUnit.MINUTES);

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

      // Retrieve the created snapshot.
      Snapshot snapshot = snapshotsClient.get(projectId, snapshotName);
      System.out.printf("Snapshot created: %s", snapshot.getName());

    }
  }
}

Node.js

Node.js

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Node.js in der Compute Engine-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Compute Engine Node.js API.

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const diskName = 'YOUR_DISK_NAME';
// const snapshotName = 'YOUR_SNAPSHOT_NAME';
// const zone = 'europe-central2-b';
// const region = '';
// const location = 'europe-central2';
// let diskProjectId = 'YOUR_DISK_PROJECT_ID';

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

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

  let disk;

  if (!zone && !region) {
    throw new Error(
      'You need to specify `zone` or `region` for this function to work.'
    );
  }

  if (zone && region) {
    throw new Error("You can't set both `zone` and `region` parameters");
  }

  if (!diskProjectId) {
    diskProjectId = projectId;
  }

  if (zone) {
    const disksClient = new compute.DisksClient();
    [disk] = await disksClient.get({
      project: diskProjectId,
      zone,
      disk: diskName,
    });
  } else {
    const regionDisksClient = new compute.RegionDisksClient();
    [disk] = await regionDisksClient.get({
      project: diskProjectId,
      region,
      disk: diskName,
    });
  }

  const snapshotResource = {
    name: snapshotName,
    sourceDisk: disk.selfLink,
  };

  if (location) {
    snapshotResource.storageLocations = [location];
  }

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

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

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

createSnapshot();

Python

Python

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Python in der Compute Engine-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Compute Engine Python API.

import sys
from typing import Any, Optional

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:
    """
    This method will wait 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 create_snapshot(
    project_id: str,
    disk_name: str,
    snapshot_name: str,
    *,
    zone: Optional[str] = None,
    region: Optional[str] = None,
    location: Optional[str] = None,
    disk_project_id: Optional[str] = None,
) -> compute_v1.Snapshot:
    """
    Create a snapshot of a disk.

    You need to pass `zone` or `region` parameter relevant to the disk you want to
    snapshot, but not both. Pass `zone` parameter for zonal disks and `region` for
    regional disks.

    Args:
        project_id: project ID or project number of the Cloud project you want
            to use to store the snapshot.
        disk_name: name of the disk you want to snapshot.
        snapshot_name: name of the snapshot to be created.
        zone: name of the zone in which is the disk you want to snapshot (for zonal disks).
        region: name of the region in which is the disk you want to snapshot (for regional disks).
        location: The Cloud Storage multi-region or the Cloud Storage region where you
            want to store your snapshot.
            You can specify only one storage location. Available locations:
            https://cloud.google.com/storage/docs/locations#available-locations
        disk_project_id: project ID or project number of the Cloud project that
            hosts the disk you want to snapshot. If not provided, will look for
            the disk in the `project_id` project.

    Returns:
        The new snapshot instance.
    """
    if zone is None and region is None:
        raise RuntimeError(
            "You need to specify `zone` or `region` for this function to work."
        )
    if zone is not None and region is not None:
        raise RuntimeError("You can't set both `zone` and `region` parameters.")

    if disk_project_id is None:
        disk_project_id = project_id

    if zone is not None:
        disk_client = compute_v1.DisksClient()
        disk = disk_client.get(project=disk_project_id, zone=zone, disk=disk_name)
    else:
        regio_disk_client = compute_v1.RegionDisksClient()
        disk = regio_disk_client.get(
            project=disk_project_id, region=region, disk=disk_name
        )

    snapshot = compute_v1.Snapshot()
    snapshot.source_disk = disk.self_link
    snapshot.name = snapshot_name
    if location:
        snapshot.storage_locations = [location]

    snapshot_client = compute_v1.SnapshotsClient()
    operation = snapshot_client.insert(project=project_id, snapshot_resource=snapshot)

    wait_for_extended_operation(operation, "snapshot creation")

    return snapshot_client.get(project=project_id, snapshot=snapshot_name)

Snapshot eines regionalen nichtflüchtigen Speichers erstellen

Nachdem Sie das Laufwerk vorbereitet haben, können Sie einen Snapshot erstellen. Beim Erstellen eines Snapshots eines regionalen nichtflüchtigen Speichers müssen Sie die Region angeben, in der sich das Laufwerk befindet.

Console

  1. Öffnen Sie in der Google Cloud Console die Seite Snapshot erstellen.
    Zur Seite "Snapshot erstellen"
  2. Geben Sie einen Namen für den Snapshot ein.
  3. Wählen Sie einen Snapshot-Typ aus. Der Standard ist ein regulärer Snapshot, der sich am besten für die langfristige Sicherung und die Notfallwiederherstellung eignet.

    Wählen Sie Archiv-Snapshot aus, um eine kostengünstigere Datenaufbewahrung zu ermöglichen.

  4. Optional können Sie eine Beschreibung des Snapshots eingeben.

  5. Wählen Sie unter Quelllaufwerk ein vorhandenes Laufwerk aus, von dem Sie einen Snapshot erstellen möchten.

  6. Optional können Sie einen benutzerdefinierten Speicherort angeben:

    1. Wählen Sie unter Speicherort aus, ob Sie Ihren Snapshot an einem multiregionalen oder einem regionalen Speicherort speichern möchten.
    2. Wählen Sie die gewünschte Region bzw. den gewünschten multiregionalen Speicherort aus. Wählen Sie Basierend auf dem Standort des Quelllaufwerks aus, um die Region bzw. den multiregionalen Speicherort mit der geringsten Entfernung zum Quelllaufwerk zu verwenden.
  7. Klicken Sie auf Erstellen, um den Snapshot zu erstellen.

gcloud

Erstellen Sie den Snapshot am Standardspeicherort oder an einem ausgewählten Speicherort.

  • Verwenden Sie den Befehl gcloud compute snapshots create, um einen Snapshot eines regionalen nichtflüchtigen Speichers am Standardspeicherort zu erstellen:

    gcloud compute snapshots create SNAPSHOT_NAME \
        --source-disk SOURCE_DISK \
        --source-disk-region=SOURCE_DISK_REGION
    

    Dabei gilt:

    • SNAPSHOT_NAME: Ein Name für den Snapshot.
    • SOURCE_DISK: Der Name des nichtflüchtigen Speichers, von dem Sie einen Snapshot erstellen möchten.
    • SOURCE_DISK_REGION: Der Name des regionalen nichtflüchtigen Speichers, von dem Sie einen Snapshot erstellen möchten.
  • Optional können Sie einen benutzerdefinierten Speicherort angeben:

    gcloud compute snapshots create SNAPSHOT_NAME \
        --source-disk SOURCE_DISK \
        --source-disk-region=SOURCE_DISK_REGION
        --storage-location STORAGE_LOCATION \
        --snapshot-type SNAPSHOT_TYPE
    

    Dabei gilt:

    • SNAPSHOT_NAME: Ein Name für den Snapshot.
    • SOURCE_DISK: Der Name des nichtflüchtigen Speichers, von dem Sie einen Snapshot erstellen möchten.
    • SOURCE_DISK_REGION: Der Name des regionalen nichtflüchtigen Speichers, von dem Sie einen Snapshot erstellen möchten
    • STORAGE_LOCATION: Der multiregionale Cloud Storage-Speicherort oder die Cloud Storage-Region, in der Sie den Snapshot speichern möchten. Sie können nur einen Speicherort angeben.
    • SNAPSHOT_TYPE: Der Snapshot-Typ, entweder STANDARD oder ARCHIVE. Wenn kein Snapshot-Typ angegeben ist, wird ein Snapshot vom Typ STANDARD erstellt.

    Die Google Cloud CLI wartet, bis der Vorgang den Status READY oder FAILED zurückgibt oder die maximale Zeitüberschreitung erreicht und gibt die letzten bekannten Details des Snapshots zurück.

Terraform

Der Terraform-Provider für Google Cloud unterstützt nicht das Erstellen eines Snapshots eines regionalen nichtflüchtigen Speichers. Informationen zu dieser Einschränkung finden Sie unter dem Problem auf GitHub.

API

  • Zum Erstellen eines Snapshots am Standardspeicherort senden Sie eine POST-Anfrage an die Methode snapshots.insert:

    POST https://compute.googleapis.com/compute/v1/projects/DESTINATION_PROJECT_ID/global/snapshots
    {
      "name": SNAPSHOT_NAME
      "sourceDisk": "projects/SOURCE_PROJECT_ID/regions/SOURCE_REGION/disks/SOURCE_DISK_NAME
      "snapshotType": SNAPSHOT_TYPE
    }
    

    Dabei gilt:

    • DESTINATION_PROJECT_ID: Die ID des Projekts, in dem Sie den Snapshot erstellen möchten.
    • SNAPSHOT_NAME: Ein Name für den Snapshot.
    • SOURCE_PROJECT_ID: Die ID des Projekts des Quelllaufwerks.
    • SOURCE_REGION: Die Region des Quelllaufwerks.
    • SOURCE_DISK_NAME: Der Name des nichtflüchtigen Speichers, von dem Sie einen Snapshot erstellen möchten.
    • SNAPSHOT_TYPE: Der Snapshot-Typ, entweder STANDARD oder ARCHIVE. Wenn kein Snapshot-Typ angegeben ist, wird ein Snapshot vom Typ STANDARD erstellt.
  • Wenn Sie alternativ einen Snapshot an einem benutzerdefinierten Speicherort erstellen möchten, senden Sie eine POST-Anfrage an die Methode snapshots.insert und geben Sie den Speicherort an:

    POST https://compute.googleapis.com/compute/v1/projects/DESTINATION_PROJECT_ID/global/snapshots
    {
      "name": SNAPSHOT_NAME
      "sourceDisk": "projects/SOURCE_PROJECT_ID/regions/SOURCE_REGION/disks/SOURCE_DISK_NAME
      "snapshotType": SNAPSHOT_TYPE
      "storageLocations": STORAGE_LOCATION
    }
    

    Dabei gilt:

    • DESTINATION_PROJECT_ID: Die ID des Projekts, in dem Sie den Snapshot erstellen möchten.
    • SNAPSHOT_NAME: Ein Name für den Snapshot.
    • SOURCE_PROJECT_ID: Die ID des Projekts des Quelllaufwerks.
    • SOURCE_REGION: Die Region des Quelllaufwerks.
    • SOURCE_DISK_NAME: Der Name des nichtflüchtigen Speichers, von dem Sie einen Snapshot erstellen möchten.
    • STORAGE_LOCATION: Der multiregionale Cloud Storage-Speicherort oder die Cloud Storage-Region, in der Sie den Snapshot speichern möchten. Sie können nur einen Speicherort angeben.
    • SNAPSHOT_TYPE: Der Snapshot-Typ, entweder STANDARD oder ARCHIVE. Wenn kein Snapshot-Typ angegeben ist, wird ein Snapshot vom Typ STANDARD erstellt.

Einfach loslegen (Go)

Go

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Go in der Compute Engine-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Compute Engine Go API.

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "google.golang.org/genproto/googleapis/cloud/compute/v1"
	"google.golang.org/protobuf/proto"
)

// createSnapshot creates a snapshot of a disk.
func createSnapshot(
	w io.Writer,
	projectID, diskName, snapshotName, zone, region, location, diskProjectID string,
) error {
	// projectID := "your_project_id"
	// diskName := "your_disk_name"
	// snapshotName := "your_snapshot_name"
	// zone := "europe-central2-b"
	// region := "eupore-central2"
	// location = "eupore-central2"
	// diskProjectID = "YOUR_DISK_PROJECT_ID"

	ctx := context.Background()

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

	if zone == "" && region == "" {
		return fmt.Errorf("you need to specify `zone` or `region` for this function to work")
	}

	if zone != "" && region != "" {
		return fmt.Errorf("you can't set both `zone` and `region` parameters")
	}

	if diskProjectID == "" {
		diskProjectID = projectID
	}

	disk := &computepb.Disk{}
	locations := []string{}
	if location != "" {
		locations = append(locations, location)
	}

	if zone != "" {
		disksClient, err := compute.NewDisksRESTClient(ctx)
		if err != nil {
			return fmt.Errorf("NewDisksRESTClient: %v", err)
		}
		defer disksClient.Close()

		getDiskReq := &computepb.GetDiskRequest{
			Project: projectID,
			Zone:    zone,
			Disk:    diskName,
		}

		disk, err = disksClient.Get(ctx, getDiskReq)
		if err != nil {
			return fmt.Errorf("unable to create disk: %v", err)
		}
	} else {
		regionDisksClient, err := compute.NewRegionDisksRESTClient(ctx)
		if err != nil {
			return fmt.Errorf("NewRegionDisksRESTClient: %v", err)
		}
		defer regionDisksClient.Close()

		getDiskReq := &computepb.GetRegionDiskRequest{
			Project: projectID,
			Region:  region,
			Disk:    diskName,
		}

		disk, err = regionDisksClient.Get(ctx, getDiskReq)
		if err != nil {
			return fmt.Errorf("unable to create disk: %v", err)
		}
	}

	req := &computepb.InsertSnapshotRequest{
		Project: projectID,
		SnapshotResource: &computepb.Snapshot{
			Name:             proto.String(snapshotName),
			SourceDisk:       proto.String(disk.GetSelfLink()),
			StorageLocations: locations,
		},
	}

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

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

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

	return nil
}

Java

Java

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Java in der Compute Engine-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Compute Engine Java API.


import com.google.cloud.compute.v1.Disk;
import com.google.cloud.compute.v1.DisksClient;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.RegionDisksClient;
import com.google.cloud.compute.v1.Snapshot;
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 CreateSnapshot {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // You need to pass `zone` or `region` parameter relevant to the disk you want to
    // snapshot, but not both. Pass `zone` parameter for zonal disks and `region` for
    // regional disks.

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

    // Name of the disk you want to create.
    String diskName = "YOUR_DISK_NAME";

    // Name of the snapshot that you want to create.
    String snapshotName = "YOUR_SNAPSHOT_NAME";

    // The zone of the source disk from which you create the snapshot (for zonal disks).
    String zone = "europe-central2-b";

    // The region of the source disk from which you create the snapshot (for regional disks).
    String region = "your-disk-region";

    // The Cloud Storage multi-region or the Cloud Storage region where you
    // want to store your snapshot.
    // You can specify only one storage location. Available locations:
    // https://cloud.google.com/storage/docs/locations#available-locations
    String location = "europe-central2";

    // Project ID or project number of the Cloud project that
    // hosts the disk you want to snapshot. If not provided, the value will be defaulted
    // to 'projectId' value.
    String diskProjectId = "YOUR_DISK_PROJECT_ID";

    createSnapshot(projectId, diskName, snapshotName, zone, region, location, diskProjectId);
  }

  // Creates a snapshot of a disk.
  public static void createSnapshot(String projectId, String diskName, String snapshotName,
      String zone, String region, String location, String diskProjectId)
      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()) {

      if (zone.isEmpty() && region.isEmpty()) {
        throw new Error("You need to specify 'zone' or 'region' for this function to work");
      }

      if (!zone.isEmpty() && !region.isEmpty()) {
        throw new Error("You can't set both 'zone' and 'region' parameters");
      }

      // If Disk's project id is not specified, then the projectId parameter will be used.
      if (diskProjectId.isEmpty()) {
        diskProjectId = projectId;
      }

      // If zone is not empty, use the DisksClient to create a disk.
      // Else, use the RegionDisksClient.
      Disk disk;
      if (!zone.isEmpty()) {
        DisksClient disksClient = DisksClient.create();
        disk = disksClient.get(projectId, zone, diskName);
      } else {
        RegionDisksClient regionDisksClient = RegionDisksClient.create();
        disk = regionDisksClient.get(diskProjectId, region, diskName);
      }

      // Set the snapshot properties.
      Snapshot snapshotResource;
      if (!location.isEmpty()) {
        snapshotResource = Snapshot.newBuilder()
            .setName(snapshotName)
            .setSourceDisk(disk.getSelfLink())
            .addStorageLocations(location)
            .build();
      } else {
        snapshotResource = Snapshot.newBuilder()
            .setName(snapshotName)
            .setSourceDisk(disk.getSelfLink())
            .build();
      }

      // Wait for the operation to complete.
      Operation operation = snapshotsClient.insertAsync(projectId, snapshotResource)
          .get(3, TimeUnit.MINUTES);

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

      // Retrieve the created snapshot.
      Snapshot snapshot = snapshotsClient.get(projectId, snapshotName);
      System.out.printf("Snapshot created: %s", snapshot.getName());

    }
  }
}

Node.js

Node.js

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Node.js in der Compute Engine-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Compute Engine Node.js API.

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const diskName = 'YOUR_DISK_NAME';
// const snapshotName = 'YOUR_SNAPSHOT_NAME';
// const zone = 'europe-central2-b';
// const region = '';
// const location = 'europe-central2';
// let diskProjectId = 'YOUR_DISK_PROJECT_ID';

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

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

  let disk;

  if (!zone && !region) {
    throw new Error(
      'You need to specify `zone` or `region` for this function to work.'
    );
  }

  if (zone && region) {
    throw new Error("You can't set both `zone` and `region` parameters");
  }

  if (!diskProjectId) {
    diskProjectId = projectId;
  }

  if (zone) {
    const disksClient = new compute.DisksClient();
    [disk] = await disksClient.get({
      project: diskProjectId,
      zone,
      disk: diskName,
    });
  } else {
    const regionDisksClient = new compute.RegionDisksClient();
    [disk] = await regionDisksClient.get({
      project: diskProjectId,
      region,
      disk: diskName,
    });
  }

  const snapshotResource = {
    name: snapshotName,
    sourceDisk: disk.selfLink,
  };

  if (location) {
    snapshotResource.storageLocations = [location];
  }

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

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

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

createSnapshot();

Python

Python

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Python in der Compute Engine-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Compute Engine Python API.

import sys
from typing import Any, Optional

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:
    """
    This method will wait 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 create_snapshot(
    project_id: str,
    disk_name: str,
    snapshot_name: str,
    *,
    zone: Optional[str] = None,
    region: Optional[str] = None,
    location: Optional[str] = None,
    disk_project_id: Optional[str] = None,
) -> compute_v1.Snapshot:
    """
    Create a snapshot of a disk.

    You need to pass `zone` or `region` parameter relevant to the disk you want to
    snapshot, but not both. Pass `zone` parameter for zonal disks and `region` for
    regional disks.

    Args:
        project_id: project ID or project number of the Cloud project you want
            to use to store the snapshot.
        disk_name: name of the disk you want to snapshot.
        snapshot_name: name of the snapshot to be created.
        zone: name of the zone in which is the disk you want to snapshot (for zonal disks).
        region: name of the region in which is the disk you want to snapshot (for regional disks).
        location: The Cloud Storage multi-region or the Cloud Storage region where you
            want to store your snapshot.
            You can specify only one storage location. Available locations:
            https://cloud.google.com/storage/docs/locations#available-locations
        disk_project_id: project ID or project number of the Cloud project that
            hosts the disk you want to snapshot. If not provided, will look for
            the disk in the `project_id` project.

    Returns:
        The new snapshot instance.
    """
    if zone is None and region is None:
        raise RuntimeError(
            "You need to specify `zone` or `region` for this function to work."
        )
    if zone is not None and region is not None:
        raise RuntimeError("You can't set both `zone` and `region` parameters.")

    if disk_project_id is None:
        disk_project_id = project_id

    if zone is not None:
        disk_client = compute_v1.DisksClient()
        disk = disk_client.get(project=disk_project_id, zone=zone, disk=disk_name)
    else:
        regio_disk_client = compute_v1.RegionDisksClient()
        disk = regio_disk_client.get(
            project=disk_project_id, region=region, disk=disk_name
        )

    snapshot = compute_v1.Snapshot()
    snapshot.source_disk = disk.self_link
    snapshot.name = snapshot_name
    if location:
        snapshot.storage_locations = [location]

    snapshot_client = compute_v1.SnapshotsClient()
    operation = snapshot_client.insert(project=project_id, snapshot_resource=snapshot)

    wait_for_extended_operation(operation, "snapshot creation")

    return snapshot_client.get(project=project_id, snapshot=snapshot_name)

Snapshot löschen

Compute Engine verwendet differenzielle Snapshots, sodass jeder Snapshot nur jene Daten enthält, die sich seit dem letzten Snapshot geändert haben. Da nachfolgende Snapshots Informationen benötigen könnten, die in einem vorherigen Snapshot gespeichert sind, werden beim Löschen eines Snapshots also nicht unbedingt alle Daten im Snapshot gelöscht. Weitere Informationen zum Löschen von Snapshots finden Sie unter Snapshot löschen.

So löschen Sie einen Snapshot:

Console

  1. Rufen Sie in der Google Cloud Console die Seite Snapshots auf.

    Zur Seite "Snapshots"

  2. Wählen Sie einen oder mehrere Snapshots aus, den oder die Sie löschen möchten.
  3. Klicken Sie oben auf der Seite Snapshots auf Löschen.

gcloud

Verwenden Sie zum Löschen eines Snapshots den Befehl gcloud compute snapshots delete:

gcloud compute snapshots delete SNAPSHOT_NAME

Dabei steht SNAPSHOT_NAME für den Namen des zu löschenden Snapshots.

API

Senden Sie zum Löschen von Snapshots eine DELETE-Anfrage an die compute.snapshots.delete-Methode.

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

wobei

  • PROJECT_ID ist der Name Ihres Projekts.
  • SNAPSHOT_NAME ist der Name des zu löschenden Snapshots.

Einfach loslegen (Go)

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "google.golang.org/genproto/googleapis/cloud/compute/v1"
)

// 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: %v", 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: %v", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %v", 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

import sys
from typing import Any, NoReturn

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:
    """
    This method will wait 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) -> NoReturn:
    """
    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")

    return

Mehrere Snapshots basierend auf einem Filter löschen

Compute Engine verwendet differenzielle Snapshots, sodass jeder Snapshot nur jene Daten enthält, die sich seit dem letzten Snapshot geändert haben. Da nachfolgende Snapshots Informationen benötigen könnten, die in einem vorherigen Snapshot gespeichert sind, werden beim Löschen eines Snapshots also nicht unbedingt alle Daten im Snapshot gelöscht. Weitere Informationen zum Löschen von Snapshots finden Sie unter Snapshot löschen.

In den folgenden Abschnitten wird beschrieben, wie Sie Snapshots anhand eines bestimmten Filters löschen. Weitere Informationen zu Filtern der gcloud CLI finden Sie unter Themenfilter der gcloud CLI.

Verwenden Sie zum Löschen der Snapshots eine Kombination aus dem Befehl gcloud compute snapshots list und einem bestimmten Filter sowie den Befehl gcloud compute snapshots delete mit xargs:

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

Ersetzen Sie EXPRESSION durch einen Themenfilter vom Typ gcloud.

Zum Beispiel löscht --filter="creationTimestamp>'2021-01-01'" alle Snapshots, die nach dem 01.01.2021 erstellt wurden.

Snapshots auflisten

gcloud

Mit dem Befehl gcloud compute snapshots list können Sie eine Liste der Snapshots abrufen, die Ihnen in einem bestimmten Projekt zur Verfügung stehen.

gcloud compute snapshots list --project PROJECT_ID

Dabei ist PROJECT_ID die ID des Projekts.

API

Wenn Sie eine Liste des Snapshots abrufen möchten, der Ihnen in einem bestimmten Projekt zur Verfügung steht, senden Sie eine GET-Anfrage an die Methode snapshots.list:

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

Dabei ist PROJECT_ID die ID des Projekts.

Informationen zu einem Snapshot ansehen

Mit dem Befehl gcloud compute snapshots describe rufen Sie Informationen zu einem bestimmten Snapshot ab, etwa den Erstellungszeitpunkt, die Größe und das Quelllaufwerk:

gcloud compute snapshots describe SNAPSHOT_NAME

Dabei ist SNAPSHOT_NAME der Name des Snapshots.

Snapshot-Daten projektübergreifend in derselben Organisation freigeben

Verwenden Sie folgenden Prozess, um Daten von einem Laufwerk in einem Projekt auf ein Laufwerk in einem anderen Projekt innerhalb derselben Organisation zu verschieben:

gcloud

  1. Erstellen Sie mit dem Befehl gcloud compute snapshots create einen Laufwerk-Snapshot im Zielprojekt. Verwenden Sie beispielsweise den folgenden Befehl, um einen Snapshot eines zonalen nichtflüchtigen Speichers zu erstellen:

    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
    

    Dabei gilt:

    • SNAPSHOT_NAME: Ein Name für den Snapshot.
    • SOURCE_PROJECT_ID: Die ID des Projekts des Quelllaufwerks.
    • ZONE: Die Zone des Quelllaufwerks.
    • SOURCE_DISK_NAME: Der Name des Quelllaufwerks.
    • DESTINATION_PROJECT_ID: Die ID des Zielprojekts für den neuen Snapshot.
  2. Erstellen Sie im Zielprojekt mit dem Befehl gcloud compute disks create ein zonales oder regionales Laufwerk, das auf dem Snapshot basiert:

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

    Dabei gilt:

    • DISK_NAME: Ein Name für das neue Laufwerk.
    • SNAPSHOT_NAME: Der Name des Snapshots.
    • DESTINATION_PROJECT_ID: Die ID des Zielprojekts für das neue Laufwerk.

API

  1. Erstellen Sie einen Laufwerk-Snapshot im Zielprojekt, indem Sie die Methode snapshots.insert aufrufen. Wenn Sie beispielsweise einen Snapshot eines zonalen nichtflüchtigen Speichers erstellen möchten, stellen Sie folgende Anfrage:

    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
    }
    

    Dabei gilt:

    • DESTINATION_PROJECT_ID: Die ID des Zielprojekts für den neuen Snapshot.
    • SNAPSHOT_NAME: Ein Name für den Snapshot.
    • SOURCE_PROJECT_ID: Die ID des Projekts des Quelllaufwerks.
    • SOURCE_ZONE: Die Zone des Quelllaufwerks.
    • SOURCE_DISK_NAME: Der Name des Quelllaufwerks.
  2. Erstellen Sie im Zielprojekt ein zonales oder regionales Laufwerk, das auf dem Snapshot basiert. Verwenden Sie dazu die zonale Methode disks.insert oder die regionale Methode regionDisks.insert. Stellen Sie zum Beispiel die folgende Anfrage zum Erstellen eines zonalen Laufwerks:

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

    Dabei gilt:

    • DESTINATION_PROJECT_ID: Die ID des Zielprojekts für das neue Laufwerk.
    • DISK_NAME: Ein Name für das neue Laufwerk.
    • SNAPSHOT_NAME: Der Name des Snapshots.

Eine Liste der verfügbaren Snapshots finden Sie unter Snapshots auflisten.

Snapshot projektübergreifend in verschiedenen Organisationen freigeben

So teilen Sie einen Snapshot von einem Projekt in einer Organisation für ein anderes Projekt in einer anderen Organisation:

gcloud

  1. Erstellen Sie im Quellprojekt mit dem Befehl gcloud compute disks create ein Laufwerk, das auf dem Snapshot basiert:

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

    Dabei gilt:

    • DISK_NAME: Ein Name für das neue Laufwerk.
    • SNAPSHOT_NAME: Der Name des Snapshots.
    • SOURCE_PROJECT_ID: Die ID des Quellprojekts.
    • ZONE: Zone, in der das neue Laufwerk erstellt wird.

    Dieses Laufwerk ist ein temporäres Laufwerk, das nur erstellt wird, um den Snapshot organisationsübergreifend zu kopieren. Sie können dieses Laufwerk löschen, nachdem die Snapshot-Kopie abgeschlossen wurde.

  2. Erstellen Sie im Zielprojekt mit dem Befehl gcloud compute snapshots create einen Snapshot. Wenn Sie beispielsweise einen Snapshot mit dem in Schritt 1 erstellten zonalen Laufwerk erstellen, verwenden Sie den folgenden Befehl:

    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
    

    Dabei gilt:

    • SNAPSHOT_NAME: Ein Name für den Snapshot.
    • SOURCE_PROJECT_ID: die ID des Projekts, das das Quelllaufwerk enthält.
    • ZONE: Die Zone des Quelllaufwerks.
    • SOURCE_DISK_NAME: Name des in Schritt 1 erstellten Laufwerks.
    • DESTINATION_PROJECT_ID: Die ID des Zielprojekts für den neuen Snapshot.

    Eine Liste der verfügbaren Snapshots finden Sie unter Snapshots auflisten.

  3. Löschen Sie das in Schritt 1 erstellte temporäre Laufwerk mit dem Befehl gcloud compute disks delete.

API

  1. Erstellen Sie im Quellprojekt mit der zonalen Methode disks.insert ein zonales oder regionales Laufwerk, das auf dem Snapshot basiert. Stellen Sie zum Beispiel die folgende Anfrage zum Erstellen eines zonalen Laufwerks:

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

    Dabei gilt:

    • SOURCE_PROJECT_ID: Die ID des Quellprojekts für das neue Laufwerk.
    • ZONE: Zone für ein neues Laufwerk
    • DISK_NAME: Ein Name für das neue Laufwerk.
    • SNAPSHOT_NAME: Der Name des Snapshots.

    Dieses Laufwerk ist ein temporäres Laufwerk, das nur erstellt wird, um den Snapshot organisationsübergreifend zu kopieren.

  2. Erstellen Sie einen Snapshot im Zielprojekt, indem Sie die Methode snapshots.insert aufrufen. Wenn Sie beispielsweise einen Snapshot eines zonalen nichtflüchtigen Speichers erstellen möchten, stellen Sie folgende Anfrage:

    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
    }
    

    Dabei gilt:

    • DESTINATION_PROJECT_ID: Die ID des Zielprojekts für den neuen Snapshot.
    • SNAPSHOT_NAME: Ein Name für den Snapshot.
    • SOURCE_PROJECT_ID: die ID des Projekts, das das Quelllaufwerk enthält.
    • SOURCE_ZONE: Die Zone des Quelllaufwerks.
    • SOURCE_DISK_NAME: Der Name des Quelllaufwerks.
  3. Löschen Sie das in Schritt 1 erstellte temporäre Laufwerk mit der Methode disks.delete.

Nächste Schritte