Laufwerk mit Klonen duplizieren

Mit dem Klonen von Laufwerken können Sie eine sofort verwendbare Kopie eines vorhandenen Laufwerks am selben Standort (Zone oder Region) wie das Quelllaufwerk erstellen. Erstellen Sie einen Laufwerkklon in Szenarien, in denen Sie eine Kopie eines vorhandenen Laufwerks erstellen möchten, die Sie schnell an eine Instanz anhängen können. Beispiele:

  • Staging-Umgebungen durch Duplizieren von Produktionsdaten erstellen, um Fehler zu beheben, ohne die Produktion zu beeinträchtigen
  • Malwarescans einer Festplatte ohne Beeinträchtigung der Leistung einer Produktionsarbeitslast durchführen
  • Kopien zur Überprüfung von Datenbanksicherungen erstellen
  • Daten von Laufwerken ohne Bootfunktion in ein neues Projekt verschieben
  • Laufwerke beim horizontalen Skalieren von VMs duplizieren

In diesem Dokument finden Sie Informationen zur Funktionsweise von Laufwerksklonen und zum Erstellen eines Laufwerksklons.

Wenn Sie die Notfallwiederherstellung für Ihre Daten aktivieren möchten, sichern Sie Ihr Laufwerk mit Standard-Snapshots, anstatt Laufwerkklone zu verwenden. Wenn Sie Laufwerksinhalte in regelmäßigen Abständen erfassen möchten, ohne neue Laufwerke zu erstellen, verwenden Sie Instant Snapshots, da sie speichereffizienter als Klone sind. Weitere Optionen zum Schutz von Laufwerken finden Sie unter Datenschutzoptionen.

Hinweise

Zusammenfassung der Anwendungsfälle

Sie können ein Laufwerk nicht nur für schnelle Tests und Fehlerbehebung duplizieren, sondern auch Hochverfügbarkeit für ein zonales Laufwerk aktivieren, indem Sie einen regionalen Klon des zonalen Laufwerks erstellen. Wenn Sie ein regionales Laufwerk aus einem zonalen Laufwerk erstellen, hat das regionale Laufwerk ein Replikat des Laufwerks in zwei Zonen innerhalb derselben Region. Nachdem Sie das regionale Laufwerk erstellt haben, verwenden Sie es anstelle des zonalen Laufwerks. Im seltenen Fall eines Ausfalls in einer Zone können Sie weiterhin auf die Daten des Replikats in der anderen Zone zugreifen.

In dieser Tabelle sind die verschiedenen Arten von Klonen zusammengefasst, die von Compute Engine unterstützt werden.

Klonierungstyp Geeignet für Unterstützte Laufwerkstypen
Zonaler Klon aus einem zonalen Laufwerk Erstellen Sie eine identische Kopie eines Laufwerks in derselben Zone für eine der folgenden Aufgaben:
  • Arbeitslasten durch Duplizieren vorhandener Laufwerke für neue VMs horizontal skalieren.
  • Staging-, Debugging- oder Testumgebungen mit Produktionsdaten.
  • Eine Festplatte, die in der Produktion verwendet wird, auf Malware prüfen.
  • Laufwerk in ein neues Projekt verschieben
  • Persistent Disk: Standard, abgestimmt und nichtflüchtiger SSD-Speicher
  • Google Cloud Hyperdisk: Alle Hyperdisk-Typen, außer Hyperdisk Balanced High Availability
Regionaler Klon eines zonalen Laufwerks
  • Eine zonale Arbeitslast hochverfügbar machen, indem ein Replikat der Daten in einer anderen Zone hinzugefügt wird.
  • Ein Laufwerk, das sich in der Produktion befindet, auf Malware scannen.
  • Regionales Bootlaufwerk aus einem zonalen Bootlaufwerk erstellen
  • Persistent Disk: Standard, abgestimmt und nichtflüchtiger SSD-Speicher
  • Hyperdisk: Hyperdisk Extreme und Hyperdisk Balanced
Regionaler Klon eines regionalen Laufwerks So erstellen Sie eine identische Kopie eines regionalen Laufwerks in derselben Region für:
  • Testen oder horizontales Skalieren regionaler, hochverfügbarer Arbeitslasten.
  • Wie Sie die Datenredundanz über zwei Zonen hinweg aufrechterhalten, während Sie administrative Aufgaben ausführen oder Tests durchführen.
  • Kopien von HA-Datenbankvolumes zur Überprüfung erstellen.
  • Persistent Disk: Regionaler abgestimmter, SSD- und nichtflüchtiger Standardspeicher
  • Hyperdisk: Hyperdisk Balanced High Availability

So funktioniert das Klonen von Festplatten

Wenn Sie ein Laufwerk klonen, erstellen Sie ein neues Laufwerk, das alle Daten vom Quelllaufwerk enthält. Sie können einen Laufwerkklon auch dann erstellen, wenn das vorhandene Laufwerk an eine VM-Instanz angehängt ist. Nachdem Sie ein Laufwerk geklont haben, können Sie das Quelllaufwerk löschen, ohne den Klon zu löschen.

Standardmäßig übernehmen die Klone eines Laufwerks dessen Größe, Leistungslimits, Typ und die genaue Zone oder Region. Einige dieser Eigenschaften können Sie so ändern:

  • Größe: Sie können einen Klon erstellen, der größer als das Quelllaufwerk ist, aber nicht kleiner.

  • Leistung: Für Hyperdisk-Volumes können Sie ein anderes Leistungslimit für den Klon angeben. Regionale Klone von zonalen Hyperdisk-Volumes sind Hyperdisk Balanced High Availability-Volumes und können andere Leistungslimits haben.

  • Standort: Standardmäßig wird der Klon eines Laufwerks bei zonalen Laufwerken in derselben Zone und bei regionalen Laufwerken in derselben Region erstellt. Wenn Sie jedoch einen regionalen Klon eines zonalen Laufwerks erstellen möchten, können Sie eine zweite Zone angeben, die sich in derselben Region wie das zonale Laufwerk befindet. Der neue Klon wird auch als regionaler Klon bezeichnet und hat jeweils ein Replikat in der Zone des Quelllaufwerks und in der zweiten Zone, die Sie angegeben haben.

  • Typ: Regionale Klone von zonalen Hyperdisk Balanced- oder Hyperdisk Extreme-Volumes sind Hyperdisk Balanced High Availability-Volumes.

Latenz beim Klonen von Datenlaufwerken

Compute Engine klont in der Regel Datenlaufwerke (nicht für den Startvorgang) mit einer Größe von bis zu 32 GiB in weniger als zehn Sekunden. Bei Datenlaufwerken im Unternehmensmaßstab, die bei 1 TiB gemessen werden, dauert das Klonen in der Regel weniger als eine Minute.

Für geklonte Laufwerke ist kein Pre-Warming erforderlich. Sie können an Instanzen angehängt werden und erreichen sofort nach der Erstellung die volle Leistung. Dadurch werden Initialisierungsverzögerungen vermieden und Workflows mit hohem Umfang wie Sicherheitsscans und die Einrichtung von Entwicklungs- und Testumgebungen werden erheblich beschleunigt.

Regionale Hyperdisk-Volumes, die aus zonalen Hyperdisk-Volumes geklont wurden

Ein regionaler Klon eines vorhandenen zonalen Hyperdisk-Volumes ist immer ein neues Hyperdisk Balanced High Availability-Volume. Das liegt daran, dass Hyperdisk Balanced High Availability die einzige unterstützte regionale Hyperdisk ist.

Wie Sie eine regionale Hyperdisk aus einer zonalen Hyperdisk erstellen, hängt vom Typ ab.

Leistung von Hyperdisk Balanced High Availability-Volumes, die aus zonalen Laufwerken geklont wurden

Wenn Sie ein neues Hyperdisk Balanced High Availability-Volume aus einem Hyperdisk Balanced- oder Hyperdisk Extreme-Volume erstellen, übernimmt das neue Laufwerk die Größe des Quelllaufwerks. Sie können jedoch eine andere Größe angeben.

Die maximal bereitgestellte Leistung des neuen Laufwerks ist möglicherweise geringer als die des Quelllaufwerks, da Hyperdisk Extreme und Hyperdisk Balanced höhere Leistungslimits als Hyperdisk Balanced High Availability haben, wie in der folgenden Tabelle aufgeführt.

Hyperdisk-Typ Maximale E/A-Vorgänge pro Sekunde (IOPS) Maximaler Durchsatz ( MiB/s)
Hyperdisk Balanced High Availability 100.000 2.400
Hyperdisk abgestimmt 160.000 2.400
Hyperdisk Extrem 350.000 5.000

Sie können Limits für das neue regionale Laufwerk angeben, die jedoch die maximalen Leistungslimits von Hyperdisk Balanced High Availability nicht überschreiten dürfen – 100.000 IOPS und 2.400 MiB/s.

Wenn Sie kein Leistungslimit für das neue Laufwerk angeben, stellt Compute Engine das Laufwerk mit den Standard-IOPS und dem Standarddurchsatz bereit, die von der Größe des Hyperdisk Balanced High Availability-Volumes abhängen. Informationen zu den Standardlimits finden Sie unter Standardgrößen- und Leistungslimits für Hyperdisk Balanced High Availability.

Um 100.000 IOPS zu erreichen, muss die Größe eines Hyperdisk Balanced High Availability-Volumes mindestens 200 GiB betragen. Daher müssen Sie möglicherweise auch die bereitgestellte Größe des regionalen Klons erhöhen.

Beispiel

Angenommen, Sie haben ein Hyperdisk Extreme-Volume mit 150 GiB, hdx-1,das mit 180.000 IOPS bereitgestellt wurde.

Wenn Sie einen regionalen Klon von hdx-1 erstellen und keine neue Größe oder kein neues Leistungslimit angeben, ist das neue regionale Laufwerk ein 150-GiB-Hyperdisk Balanced High Availability-Volume mit dem Standard-IOPS-Limit für diese Größe: 3.900 IOPS.

Die maximalen IOPS, die Sie für ein 150 GiB großes Hyperdisk Balanced High Availability-Volume angeben können, betragen 75.000 IOPS. Dies basiert auf den Formeln, die unter Limits for configurable IOPS for Hyperdisk Balanced High Availability volumes beschrieben sind.

Wenn Sie die Größe des neuen regionalen Laufwerks nicht erhöhen, können Sie für das neue regionale Laufwerk bis zu 75.000 IOPS angeben.

Regionale Persistent Disk-Volumes, die von zonalen Persistent Disk-Volumes geklont wurden

Ein regionales Persistent Disk-Volume, das aus einem zonalen Persistent Disk-Volume geklont wurde, hat denselben Typ wie der Klon. Wenn Sie beispielsweise einen zonalen nichtflüchtigen Standardspeicher klonen, erstellen Sie ein regionales nichtflüchtiges Standardspeicher-Volume.

Regionale Klone von Persistent Disk-Volumes können jedoch andere Größen- und Leistungslimits als das zonale Quelllaufwerk haben, wie im Folgenden beschrieben.

  • Niedrigere Leistungslimits: Regionale Klone von Persistent Disk haben möglicherweise niedrigere IOPS- und Durchsatzleistungslimits als der Quelldatenträger. Das liegt daran, dass zonale Persistent Disks höhere maximale Instanzleistungslimits bieten. Ein zonales Balanced Persistent Disk hat beispielsweise ein maximales Instanzlimit von 80.000 Schreib-IOPS, ein regionales Balanced Persistent Disk jedoch ein Limit von 60.000 Schreib-IOPS.

    Detaillierte Leistungslimits finden Sie unter Leistungslimits für zonale Persistent Disks und Leistungslimits für regionale Persistent Disks.

  • Für regionale nichtflüchtige Standardspeicher gilt eine Mindestgröße von 200 GiB: Regionale nichtflüchtige Standardspeicher haben eine Mindestgröße von 200 GiB. Wenn Sie also einen regionalen Klon eines zonalen nichtflüchtigen Standardspeichers mit einer Größe von 10 bis 199 GiB erstellen möchten, müssen Sie für das regionale Laufwerk eine Größe von mindestens 200 GiB angeben.

Unterstützte Laufwerkstypen

Sie können alle Persistent Disk- und Hyperdisk-Typen klonen, wenn sich der Klon am selben Standort (Zone oder Region) wie das Quelllaufwerk befindet.

Das Klonen eines zonalen Laufwerks auf ein regionales Laufwerk wird nur für die folgenden Laufwerkstypen unterstützt:

  • Hyperdisk:

  • Persistent Disk:

    • Abgestimmter nichtflüchtiger Speicher
    • Nichtflüchtiger SSD-Speicher
    • Nichtflüchtiger Standardspeicher

    Volumes vom Typ „Extrem nichtflüchtiger Speicher“ sind nur zonal und unterstützen keine regionalen Laufwerke.

Beschränkungen

Für Festplattenklone gelten die folgenden Einschränkungen:

Allgemeine Beschränkungen

Die folgenden Einschränkungen gelten für alle Vorgänge zum Klonen von Laufwerken.

  • Sie können kein Laufwerk klonen, das sich in einem Hyperdisk-Pool befindet.
  • Die Größe des Klons muss mindestens die Größe des Quelllaufwerks haben. Wenn Sie einen Klon mit der Cloud de Confiance Console erstellen, können Sie keine Laufwerksgröße angeben. Der Klon hat dann dieselbe Größe wie das Quelllaufwerk.
  • Sie können keinen zonalen Laufwerksklon eines vorhandenen zonalen Laufwerks in einer anderen Zone erstellen.
  • Sie können das Quelllaufwerk nicht löschen, während der Klon erstellt wird.
  • Die Compute-Instanz, an die das Quelllaufwerk angehängt ist, kann während der Erstellung des Klons nicht eingeschaltet werden.
  • Wenn das Quelllaufwerk so markiert wurde, dass es zusammen mit der Instanz gelöscht wird, an die es angehängt ist, können Sie die Instanz nicht löschen, während der Klon erstellt wird.
  • Wenn Sie ein Hyperdisk- oder Persistent Disk-Volume über die Cloud de Confiance Console klonen, können Sie die bereitgestellte Leistung für das geklonte Laufwerk nicht angeben.
  • Wenn Sie das Quelllaufwerk mit einem vom Kunden bereitgestellten Verschlüsselungsschlüssel (CSEK) (eingestellt) oder einem kundenverwalteten Verschlüsselungsschlüssel (CMEK) verschlüsseln, müssen Sie denselben Schlüssel auch zum Verschlüsseln des Klons verwenden.

    Weitere Informationen finden Sie unter Klon eines verschlüsselten Quelllaufwerks erstellen.

  • Sie können kein zonales Laufwerk erstellen, indem Sie ein regionales Laufwerk klonen.

  • Zum Erstellen eines regionalen Laufwerkklons aus einem zonalen Quelllaufwerk muss eine der Replikatzonen des regionalen Laufwerkklons der Zone des Quelllaufwerks entsprechen.

  • Nach der Erstellung kann ein regionaler Laufwerkklon innerhalb von durchschnittlich drei Minuten verwendet werden. Es kann jedoch einige Minuten dauern, bis das Laufwerk vollständig repliziert wurde und einen Status erreicht, in dem das Recovery Point Objective (RPO) fast null erreicht.

  • Das Erstellen eines regionalen Laufwerks aus einem zonalen Bootlaufwerk, das aus einem Image erstellt wurde, ist langsamer als das Klonen zonaler Datenlaufwerke oder zonaler Bootlaufwerke, die aus Snapshots erstellt wurden. Die Dauer des Vorgangs ist vergleichbar mit der Erstellung eines Snapshots des Quelllaufwerks und der anschließenden Erstellung eines regionalen Laufwerks aus diesem Snapshot.

  • Bei zonalen Laufwerken, die entweder aus einem Image oder durch Klonen eines aus einem Image erstellten Laufwerks erstellt wurden, kann das Erstellen eines regionalen Klons eines solchen Laufwerks länger dauern, wenn Sie gleichzeitig Standard-Snapshots anderer Laufwerke erstellen.

  • Sie können kein regionales Laufwerk durch Klonen des Quelllaufwerks erstellen, wenn das Quelllaufwerk ein Hyperdisk ML- oder Hyperdisk Throughput-Volume ist. Sie müssen ein neues Hyperdisk Balanced High Availability-Volume aus einem Snapshot des zonalen Laufwerks erstellen.

Ratenbegrenzungen für das Klonen von Laufwerken

Für das Klonen von Laufwerken gelten die folgenden Beschränkungen.

  • Für regionale Klone eines zonalen Bootlaufwerks gelten die folgenden Einschränkungen, wenn das zonale Laufwerk aus einem Image oder durch Klonen eines aus einem Image erstellten Laufwerks erstellt wurde:

    • Sie können innerhalb von 60 Minuten maximal sechs regionale Klone des Quelllaufwerks erstellen. Danach sind Vorgänge auf einen regionalen Klon des Quelllaufwerks alle zehn Minuten beschränkt.
    • Das Limit von sechs regionalen Klonen in 60 Minuten wird mit Snapshots des Quelllaufwerks geteilt. Das bedeutet, dass Sie innerhalb von 60 Minuten maximal sechs regionale Klone und Snapshots desselben zonalen Laufwerks erstellen können. Wenn Sie innerhalb von 60 Minuten fünf Standard-Snapshots des Quelllaufwerks erstellen, können Sie innerhalb desselben 60-Minuten-Zeitraums einen regionalen Klon oder einen weiteren Snapshot desselben Laufwerks erstellen.
  • Für Klone anderer regionaler oder zonaler Laufwerke gelten die folgenden Einschränkungen:

    • Sie können alle 30 Sekunden einen Klon eines bestimmten Quelllaufwerks oder seiner Klone erstellen.
    • Es kann maximal 1.000 gleichzeitige Laufwerkklone eines bestimmten Quelllaufwerks (oder von dessen Klonen) geben. Bei Überschreiten dieses Limits wird ein internalError zurückgegeben. Wenn Sie jedoch einen Laufwerkklon erstellen und später löschen, wird der gelöschte Laufwerkklon nicht für dieses Limit berücksichtigt.
    • Nachdem ein Laufwerk geklont wurde, werden alle nachfolgenden Klone dieses Laufwerks oder seiner Klone auf das Limit von 1.000 gleichzeitigen Laufwerkklonen für das ursprüngliche Quelllaufwerk und auf das Limit für die Erstellung von höchstens einem Klon alle 30 Sekunden angerechnet.
  • Wenn Sie ein regionales Laufwerk durch Klonen eines zonalen Laufwerks erstellen, können Sie alle 15 Minuten höchstens 1 TiB Kapazität klonen, mit einem Burst-Anfragelimit von 257 TiB.

Fehlermeldungen

Wenn Sie das Limit für das Klonen überschreiten, schlägt die Anfrage mit folgendem Fehler fehl:

RATE LIMIT: ERROR: (gcloud.compute.disks.create) Could not fetch resource:
 - Operation rate exceeded for resource RESOURCE. Too frequent operations from the source resource.

Laufwerkklone erstellen

In diesem Abschnitt wird erläutert, wie Sie ein vorhandenes Laufwerk duplizieren und einen Laufwerksklon erstellen können.

Eine detaillierte Anleitung finden Sie je nach Art der Erstellung des Laufwerksklons in einem der folgenden Abschnitte in diesem Dokument:

Laufwerkklon am selben Standort wie die Quelle erstellen

In diesem Abschnitt wird beschrieben, wie Sie einen Klon eines vorhandenen Laufwerks erstellen, der sich bei zonalen Laufwerken in derselben Zone bzw. bei regionalen Laufwerken in derselben Region wie das Quelllaufwerk befindet. Sie können die Cloud de Confiance Console, die Google Cloud CLI, REST oder Cloud-Clientbibliotheken verwenden.

Informationen zum Erstellen eines regionalen Laufwerks durch Klonen eines zonalen Laufwerks finden Sie unter Regionalen Laufwerksklon aus einem zonalen Laufwerk erstellen.

Cloud de Confiance Console

  1. Rufen Sie in der Cloud de Confiance Console die Seite Laufwerke auf.

    Zur Seite „Laufwerke“

  2. Suchen Sie in der Liste der Laufwerke nach dem Laufwerk, das Sie klonen möchten.

  3. Klicken Sie in der Spalte Aktionen auf die Menüschaltfläche  und wählen Sie Laufwerk klonen aus.

    Klon erstellen

    Führen Sie im angezeigten Bereich Festplatte klonen die folgenden Schritte aus:

    1. Geben Sie im Feld Name einen Namen für das geklonte Laufwerk an.
    2. Optional: Prüfen Sie für zonale Laufwerke unter Standort, ob Einzelne Zone ausgewählt ist.
    3. Prüfen Sie unter Attribute die anderen Details für das geklonte Laufwerk.
    4. Klicken Sie auf Erstellen, um das Erstellen des geklonten Laufwerks abzuschließen.

Google Cloud CLI

Führen Sie den Befehl disks create aus und geben Sie das Flag --source-disk an, um ein zonales Quelllaufwerk zu klonen und ein neues zonales Laufwerk zu erstellen:

gcloud compute disks create TARGET_DISK_NAME \
    --description="cloned disk" \
    --source-disk=projects/PROJECT_ID/zones/ZONE/disks/SOURCE_DISK_NAME

Ersetzen Sie Folgendes:

  • TARGET_DISK_NAME: Name des neuen Laufwerks.
  • PROJECT_ID: die ID des Projekts, in dem Sie das Laufwerk klonen möchten.
  • ZONE: Zone des Quelllaufwerks und des neuen Laufwerks.
  • SOURCE_DISK_NAME: der Name des Quelllaufwerks.

Terraform

Verwenden Sie zum Erstellen eines Laufwerkklons die Ressource google_compute_disk.

resource "google_compute_disk" "default" {
  name  = "disk-name1"
  type  = "pd-ssd"
  zone  = "us-central1-a"
  image = "debian-13-trixie-v20260908"
  labels = {
    environment = "dev"
  }
  physical_block_size_bytes = 4096
}

Informationen zum Anwenden oder Entfernen einer Terraform-Konfiguration finden Sie unter Grundlegende Terraform-Befehle.

Go

Go

Bevor Sie dieses Beispiel verwenden, 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.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei der Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Legen Sie vor dem Ausführen von Codebeispielen die Umgebungsvariable GOOGLE_CLOUD_UNIVERSE_DOMAIN auf s3nsapis.fr fest.

import (
	"context"
	"fmt"
	"io"

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

// createDiskFromDisk creates a new disk with the contents of
// an already existitng disk. Type, and size and zone may differ.
func createDiskFromDisk(
	w io.Writer,
	projectID, zone, diskName, diskType, sourceDiskLink string,
	diskSizeGb int64,
) error {
	// projectID := "your_project_id"
	// zone := "us-west3-b" // should match diskType below
	// diskName := "your_disk_name"
	// diskType := "zones/us-west3-b/diskTypes/pd-ssd"
	// sourceDiskLink := "projects/your_project_id/global/disks/disk_name"
	// diskSizeGb := 120

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

	req := &computepb.InsertDiskRequest{
		Project: projectID,
		Zone:    zone,
		DiskResource: &computepb.Disk{
			Name:       proto.String(diskName),
			Zone:       proto.String(zone),
			Type:       proto.String(diskType),
			SourceDisk: proto.String(sourceDiskLink),
			SizeGb:     proto.Int64(diskSizeGb),
		},
	}

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

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

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

	return nil
}

Java

Java

Bevor Sie dieses Beispiel verwenden, 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.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei der Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Legen Sie vor dem Ausführen von Codebeispielen die Umgebungsvariable GOOGLE_CLOUD_UNIVERSE_DOMAIN auf s3nsapis.fr fest.


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

public class CreateFromSource {

  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 project = "YOUR_PROJECT_ID";

    // Name of the zone in which you want to create the disk.
    String zone = "europe-central2-b";

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

    // The type of disk you want to create. This value uses the following format:
    // "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)".
    // For example: "zones/us-west3-b/diskTypes/pd-ssd"
    String diskType = String.format("zones/%s/diskTypes/pd-ssd", zone);

    // Size of the new disk in gigabytes.
    int diskSizeGb = 10;

    // A link to the disk you want to use as a source for the new disk.
    // This value uses the following format:
    // "projects/{project_name}/zones/{zone}/disks/{disk_name}"
    String diskLink = String.format("projects/%s/zones/%s/disks/%s", "PROJECT_NAME", "ZONE",
        "DISK_NAME");

    createDiskFromDisk(project, zone, diskName, diskType, diskSizeGb, diskLink);
  }

  // Creates a disk in a project in a given zone.
  public static void createDiskFromDisk(String project, String zone, String diskName,
      String diskType, int diskSizeGb, String diskLink)
      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 `disksClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (DisksClient disksClient = DisksClient.create()) {

      // Create the disk.
      Disk disk = Disk.newBuilder()
          .setZone(zone)
          .setSizeGb(diskSizeGb)
          .setSourceDisk(diskLink)
          .setType(diskType)
          .setName(diskName)
          .build();

      // Wait for the insert instance operation to complete.
      Operation operation = disksClient.insertAsync(project, zone, disk)
          .get(3, TimeUnit.MINUTES);

      if (operation.hasError()) {
        System.out.println("Disk creation failed!");
        throw new Error(operation.getError().toString());
      }
      System.out.println(
          "Disk created from source. Operation Status: " + operation.getStatus());
    }
  }
}

Python

Python

Bevor Sie dieses Beispiel verwenden, 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.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei der Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Legen Sie vor dem Ausführen von Codebeispielen die Umgebungsvariable GOOGLE_CLOUD_UNIVERSE_DOMAIN auf s3nsapis.fr fest.

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 create_disk_from_disk(
    project_id: str,
    zone: str,
    disk_name: str,
    disk_type: str,
    disk_size_gb: int,
    disk_link: str,
) -> compute_v1.Disk:
    """
    Creates a disk in a project in a given zone.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone in which you want to create the disk.
        disk_name: name of the disk you want to create.
        disk_type: the type of disk you want to create. This value uses the following format:
            "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)".
            For example: "zones/us-west3-b/diskTypes/pd-ssd"
        disk_size_gb: size of the new disk in gigabytes
        disk_link: a link to the disk you want to use as a source for the new disk.
            This value uses the following format: "projects/{project_name}/zones/{zone}/disks/{disk_name}"

    Returns:
        An attachable disk.
    """
    disk_client = compute_v1.DisksClient()
    disk = compute_v1.Disk()
    disk.zone = zone
    disk.size_gb = disk_size_gb
    disk.source_disk = disk_link
    disk.type_ = disk_type
    disk.name = disk_name
    operation = disk_client.insert(project=project_id, zone=zone, disk_resource=disk)

    wait_for_extended_operation(operation, "disk creation")

    return disk_client.get(project=project_id, zone=zone, disk=disk_name)

REST

Wenn Sie ein zonales Quelllaufwerk klonen und ein neues zonales Laufwerk erstellen möchten, senden Sie eine POST-Anfrage an die Methode compute.disks.insert. Geben Sie im Anfragetext die Parameter name und sourceDisk an. Alle nicht angegebenen Attribute werden im Klon vom Quelllaufwerk übernommen.

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

{
  "name": "TARGET_DISK_NAME"
  "sourceDisk": "projects/PROJECT_ID/zones/ZONE/disks/SOURCE_DISK_NAME"
}

Ersetzen Sie Folgendes:

  • PROJECT_ID: die ID des Projekts, in dem Sie das Laufwerk klonen möchten.
  • ZONE: Zone des Quelllaufwerks und des neuen Laufwerks.
  • TARGET_DISK_NAME: Name des neuen Laufwerks.
  • SOURCE_DISK_NAME: Name des Quelllaufwerks.

Regionalen Laufwerkklon aus einem zonalen Laufwerk erstellen

Sie können ein neues regionales Laufwerk erstellen, indem Sie ein vorhandenes zonales Boot- oder Datenlaufwerk eines der folgenden Typen klonen:

  • Hyperdisk abgestimmt
  • Hyperdisk Extrem
  • Nichtflüchtiger Standardspeicher, abgestimmter nichtflüchtiger Speicher und nichtflüchtiger SSD-Speicher

Sie können kein regionales Laufwerk erstellen, indem Sie das Quelllaufwerk klonen, wenn das Quelllaufwerk ein Hyperdisk ML- oder Hyperdisk Throughput-Volume ist. Sie müssen ein neues Hyperdisk Balanced High Availability-Volume aus einem Snapshot des zonalen Laufwerks erstellen.

Wenn das Quelllaufwerk ein Hyperdisk Balanced- oder Hyperdisk Extreme-Volume ist, ist das regionale Laufwerk immer ein Hyperdisk Balanced High Availability-Volume und übernimmt nicht die bereitgestellte Leistung des zonalen Laufwerks. Wenn Sie keine Größe angeben oder das Laufwerk mit der Cloud de Confiance Konsole klonen, erstellt Compute Engine das neue Laufwerk mit den Standardleistungsbeschränkungen für seine Größe.

Wenn Sie die Größe und bei Hyperdisk Balanced High Availability-Laufwerken die bereitgestellte Leistung des regionalen Laufwerks festlegen möchten, müssen Sie das Laufwerk mit der Google Cloud CLI oder REST klonen. Die Cloud de Confiance Console kann dafür nicht verwendet werden.

Console

  1. Rufen Sie in der Cloud de Confiance Console die Seite Laufwerke auf.

    Zur Seite „Laufwerke“

  2. Suchen Sie in der Liste der Laufwerke nach dem zonalen Persistent Disk-Volume, das Sie klonen möchten.

  3. Klicken Sie in der Spalte Aktionen auf die Menüschaltfläche  und wählen Sie Laufwerk klonen aus.

    Klon erstellen

    Führen Sie im angezeigten Bereich Festplatte klonen die folgenden Schritte aus:

    1. Geben Sie im Feld Name einen Namen für das geklonte Laufwerk an.
    2. Wählen Sie als Standort die Option Regional und dann die Zone des sekundären Replikats für das neue regionale geklonte Laufwerk aus.
    3. Prüfen Sie unter Attribute die anderen Details für das geklonte Laufwerk.
    4. Klicken Sie auf Erstellen, um das Erstellen des geklonten Laufwerks abzuschließen.

gcloud

Führen Sie zum Erstellen eines regionalen Laufwerksklons aus einem zonalen Laufwerk den Befehl gcloud compute disks create aus und geben Sie die Parameter --region und --replica-zones an.

Wenn das zonale Laufwerk ein Hyperdisk Balanced- oder Hyperdisk Extreme-Volume ist, geben Sie das Flag --type=hyperdisk-balanced-high-availability an, da das regionale Laufwerk ein Hyperdisk Balanced High Availability-Volume sein muss. Wenn Sie die bereitgestellte Leistung angeben, müssen Sie auch die Laufwerksgröße angeben, auch wenn sie dieselbe Größe wie das Quelllaufwerk hat.

Wenn Sie ein Persistent Disk-Volume klonen möchten, lassen Sie das Flag --type weg.

gcloud compute disks create TARGET_DISK_NAME \
  --description="zonal to regional cloned disk" \
  --region=CLONED_REGION \
  --source-disk=SOURCE_DISK_NAME \
  --source-disk-zone=SOURCE_DISK_ZONE \
  --replica-zones=SOURCE_DISK_ZONE,REPLICA_ZONE_2 \
  --project=PROJECT_ID \
  --type=hyperdisk-balanced-high-availability  \
  --size=DISK_SIZE \
  --provisioned-iops=IOPS_LIMIT  \
  --provisioned-throughput=THROUGHPUT_LIMIT

Ersetzen Sie Folgendes:

  • TARGET_DISK_NAME: Name des neuen regionalen Laufwerks.
  • CLONED_REGION: die Region des Quelllaufwerks und des geklonten Laufwerks.
  • SOURCE_DISK_NAME: Name des zonalen Laufwerks, das geklont werden soll.
  • SOURCE_DISK_ZONE: die Zone für das Quelllaufwerk. Dies ist auch die erste Replikatzone für den regionalen Laufwerksklon.
  • REPLICA_ZONE_2: die zweite Replikatzone für den neuen regionalen Laufwerksklon.
  • PROJECT_ID: die ID des Projekts, in dem Sie das Laufwerk klonen möchten.
  • DISK_SIZE (optional): Die Größe des neuen regionalen Laufwerks in GB. Die Größe muss mindestens der Größe des Quelllaufwerks entsprechen. Wenn Sie ein IOPS- oder Durchsatzlimit angeben, müssen Sie mit diesem Flag die Laufwerkgröße angeben, auch wenn sie mit der des Quelllaufwerks übereinstimmt.
  • IOPS_LIMIT: Optional: Wenn Sie ein regionales Hyperdisk Balanced High Availability-Laufwerk erstellen möchten, können Sie eine Anzahl von IOPS angeben, die das Laufwerk erreichen kann,bis zu 100.000 IOPS. Wenn Sie dieses Flag angeben, müssen Sie auch die Laufwerksgröße mit dem Flag --size angeben.
  • THROUGHPUT_LIMIT: Optional: Wenn Sie ein regionales Hyperdisk Balanced High Availability-Laufwerk erstellen möchten, können Sie den maximalen Durchsatz in MiB/s angeben, den das Laufwerk erreichen kann, bis zu 2.400 MiB/s. Wenn Sie dieses Flag angeben, müssen Sie auch die Laufwerksgröße mit dem Flag --size angeben.

Terraform

Verwenden Sie die folgende Ressource, um einen regionalen Laufwerksklon aus einem zonalen Laufwerk zu erstellen. Wenn das Quelllaufwerk ein Hyperdisk Balanced- oder Hyperdisk Extreme-Volume ist, setzen Sie das type-Argument auf hyperdisk-balanced-high-availability.

resource "google_compute_region_disk" "regiondisk" {
  name                      = "region-disk-name"
  snapshot                  = google_compute_snapshot.snapdisk.id
  type                      = "pd-ssd"
  region                    = "us-central1"
  physical_block_size_bytes = 4096
  size                      = 11

  replica_zones = ["us-central1-a", "us-central1-f"]
}

Informationen zum Anwenden oder Entfernen einer Terraform-Konfiguration finden Sie unter Grundlegende Terraform-Befehle.

Go

Go

Bevor Sie dieses Beispiel verwenden, 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.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei der Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Legen Sie vor dem Ausführen von Codebeispielen die Umgebungsvariable GOOGLE_CLOUD_UNIVERSE_DOMAIN auf s3nsapis.fr fest.

import (
	"context"
	"fmt"
	"io"

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

// createRegionalDiskFromDisk creates a new regional disk with the contents of
// an already existitng zonal disk. Disk type and size may differ.
func createRegionalDiskFromDisk(
	w io.Writer,
	projectID, region string, replicaZones []string,
	diskName, diskType, sourceDiskLink string,
	diskSizeGb int64,
) error {
	// projectID := "your_project_id"
	// region := "us-west3" // should match diskType below
	// diskName := "your_disk_name"
	// diskType := "regions/us-west3/diskTypes/pd-ssd"
	// sourceDiskLink := "projects/your_project_id/global/disks/disk_name"
	// diskSizeGb := 120

	// Exactly two replica zones must be specified
	replicaZoneURLs := []string{
		fmt.Sprintf("projects/%s/zones/%s", projectID, replicaZones[0]),
		fmt.Sprintf("projects/%s/zones/%s", projectID, replicaZones[1]),
	}

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

	req := &computepb.InsertRegionDiskRequest{
		Project: projectID,
		Region:  region,
		DiskResource: &computepb.Disk{
			Name:         proto.String(diskName),
			Region:       proto.String(region),
			Type:         proto.String(diskType),
			SourceDisk:   proto.String(sourceDiskLink),
			SizeGb:       proto.Int64(diskSizeGb),
			ReplicaZones: replicaZoneURLs,
		},
	}

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

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

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

	return nil
}

Java

Java

Bevor Sie dieses Beispiel verwenden, 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.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei der Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Legen Sie vor dem Ausführen von Codebeispielen die Umgebungsvariable GOOGLE_CLOUD_UNIVERSE_DOMAIN auf s3nsapis.fr fest.


import com.google.cloud.compute.v1.Disk;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.RegionDisksClient;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class RegionalCreateFromSource {

  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 project = "YOUR_PROJECT_ID";

    // Name of the zone in which you want to create the disk.
    String region = "europe-central2";

    // An iterable collection of zone names in which you want to keep
    // the new disks' replicas. One of the replica zones of the clone must match
    // the zone of the source disk.
    List<String> replicaZones = new ArrayList<>();

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

    // The type of disk you want to create. This value uses the following format:
    // "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)".
    // For example: "zones/us-west3-b/diskTypes/pd-ssd"
    String diskType = String.format("zones/%s/diskTypes/pd-ssd", "ZONE_NAME");

    // Size of the new disk in gigabytes.
    int diskSizeGb = 10;

    // A link to the disk you want to use as a source for the new disk.
    // This value uses the following format:
    // "projects/{project_name}/zones/{zone}/disks/{disk_name}"
    String diskLink = String.format("projects/%s/zones/%s/disks/%s", "PROJECT_NAME", "ZONE",
        "DISK_NAME");

    // A link to the snapshot you want to use as a source for the new disk.
    // This value uses the following format:
    // "projects/{project_name}/global/snapshots/{snapshot_name}"
    String snapshotLink = String.format("projects/%s/global/snapshots/%s", "PROJECT_NAME",
        "SNAPSHOT_NAME");

    createRegionalDisk(project, region, replicaZones, diskName, diskType, diskSizeGb,
        Optional.ofNullable(diskLink), Optional.ofNullable(snapshotLink));
  }

  // Creates a regional disk from an existing zonal disk in a given project.
  public static void createRegionalDisk(
      String project, String region, List<String> replicaZones, String diskName, String diskType,
      int diskSizeGb, Optional<String> diskLink, Optional<String> snapshotLink)
      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 `regionDisksClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (RegionDisksClient regionDisksClient = RegionDisksClient.create()) {

      Disk.Builder diskBuilder = Disk.newBuilder()
          .addAllReplicaZones(replicaZones)
          .setName(diskName)
          .setType(diskType)
          .setSizeGb(diskSizeGb)
          .setRegion(region);

      // Set source disk if diskLink is not empty.
      diskLink.ifPresent(diskBuilder::setSourceDisk);

      // Set source snapshot if the snapshot link is not empty.
      snapshotLink.ifPresent(diskBuilder::setSourceSnapshot);

      // Wait for the operation to complete.
      Operation operation = regionDisksClient.insertAsync(project, region, diskBuilder.build())
          .get(3, TimeUnit.MINUTES);

      if (operation.hasError()) {
        System.out.println("Disk creation failed!");
        throw new Error(operation.getError().toString());
      }
      System.out.println(
          "Regional disk created. Operation Status: " + operation.getStatus());
    }
  }
}

Python

Python

Bevor Sie dieses Beispiel verwenden, 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.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei der Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Legen Sie vor dem Ausführen von Codebeispielen die Umgebungsvariable GOOGLE_CLOUD_UNIVERSE_DOMAIN auf s3nsapis.fr fest.

from __future__ import annotations

from collections.abc import Iterable
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 create_regional_disk(
    project_id: str,
    region: str,
    replica_zones: Iterable[str],
    disk_name: str,
    disk_type: str,
    disk_size_gb: int,
    disk_link: str | None = None,
    snapshot_link: str | None = None,
) -> compute_v1.Disk:
    """
    Creates a regional disk from an existing zonal disk in a given project.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        region: name of the region in which you want to create the disk.
        replica_zones: an iterable collection of zone names in which you want to keep
            the new disks' replicas. One of the replica zones of the clone must match
            the zone of the source disk.
        disk_name: name of the disk you want to create.
        disk_type: the type of disk you want to create. This value uses the following format:
            "regions/{region}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)".
            For example: "regions/us-west3/diskTypes/pd-ssd"
        disk_size_gb: size of the new disk in gigabytes
        disk_link: a link to the disk you want to use as a source for the new disk.
            This value uses the following format: "projects/{project_name}/zones/{zone}/disks/{disk_name}"
        snapshot_link: a link to the snapshot you want to use as a source for the new disk.
            This value uses the following format: "projects/{project_name}/global/snapshots/{snapshot_name}"

    Returns:
        An attachable regional disk.
    """
    disk_client = compute_v1.RegionDisksClient()
    disk = compute_v1.Disk()
    disk.replica_zones = replica_zones
    disk.size_gb = disk_size_gb
    if disk_link:
        disk.source_disk = disk_link
    if snapshot_link:
        disk.source_snapshot = snapshot_link
    disk.type_ = disk_type
    disk.region = region
    disk.name = disk_name
    operation = disk_client.insert(
        project=project_id, region=region, disk_resource=disk
    )

    wait_for_extended_operation(operation, "disk creation")

    return disk_client.get(project=project_id, region=region, disk=disk_name)

REST

Senden Sie zum Erstellen eines regionalen Laufwerksklons aus einem zonalen Laufwerk eine POST-Anfrage an die Methode compute.disks.insert und geben Sie die Parameter sourceDisk und replicaZone an.

Wenn es sich bei dem zonalen Laufwerk um ein Hyperdisk Balanced- oder Hyperdisk Extreme-Volume handelt, fügen Sie das Feld type ein, um ein Hyperdisk Balanced High Availability-Volume zu erstellen. Wenn Sie die bereitgestellte Leistung angeben, müssen Sie auch die Laufwerksgröße angeben, auch wenn sie mit der Größe des Quelllaufwerks übereinstimmt.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/CLONED_REGION/disks

{
  "name": "TARGET_DISK_NAME",
  "sourceDisk": "projects/PROJECT_ID/zones/SOURCE_DISK_ZONE/disks/SOURCE_DISK_NAME",
  "replicaZone": "SOURCE_DISK_ZONE,REPLICA_ZONE_2",
  "type": "projects/PROJECT_ID/regions/CLONED_REGION/diskTypes/hyperdisk-balanced-high-availability",
  "sizeGb": "DISK_SIZE",
  "provisionedIops": "IOPS_LIMIT",
  "provisionedThroughput": "THROUGHPUT_LIMIT"
}

Ersetzen Sie Folgendes:

  • PROJECT_ID: die Projekt-ID, in der Sie das Laufwerk klonen möchten.
  • TARGET_DISK_NAME: Name des neuen regionalen Laufwerks.
  • CLONED_REGION: die Region des Quelllaufwerks und des geklonten Laufwerks.
  • SOURCE_DISK_NAME: Name des zonalen Laufwerks, das geklont werden soll.
  • SOURCE_DISK_ZONE: die Zone für das Quelllaufwerk. Dies ist auch die erste Replikatzone für den regionalen Laufwerksklon.
  • REPLICA_ZONE_2: die zweite Replikatzone für den neuen regionalen Laufwerksklon.
  • DISK_SIZE (optional): Die Größe des neuen regionalen Laufwerks in GB. Die Größe muss mindestens der Größe des Quelllaufwerks entsprechen. Wenn Sie ein IOPS- oder Durchsatzlimit angeben, müssen Sie dieses Feld einfügen, um die Laufwerkgröße anzugeben, auch wenn sie mit der des Quelllaufwerks übereinstimmt.
  • IOPS_LIMIT: Optional: Wenn Sie ein regionales Hyperdisk Balanced High Availability-Laufwerk erstellen möchten, können Sie eine Anzahl von IOPS angeben, die das Laufwerk verarbeiten kann,bis zu 100.000 IOPS. Wenn Sie dieses Feld angeben, müssen Sie auch die Festplattengröße mit dem Feld size angeben.
  • THROUGHPUT_LIMIT: Optional: Wenn Sie ein regionales Hyperdisk Balanced High Availability-Laufwerk erstellen möchten, können Sie den maximalen Durchsatz in MiB/s angeben, den das Laufwerk bereitstellen kann, bis zu 2.400 MiB/s. Wenn Sie dieses Feld angeben, müssen Sie auch die Festplattengröße mit dem Feld size angeben.

Laufwerkklon eines CMEK- oder CSEK-verschlüsselten Quelllaufwerks erstellen

Wenn Sie einen zonalen oder regionalen Klon eines Laufwerks erstellen möchten, das mit CSEK oder CMEK verschlüsselt ist, folgen Sie der Anleitung in den vorherigen Abschnitten. Sie müssen jedoch auch den Schlüssel angeben, der zum Verschlüsseln des Quelllaufwerks verwendet wurde.

Laufwerkklone für CSEK-verschlüsselte Laufwerke erstellen

Wenn Sie das Quelllaufwerk mit einem CSEK verschlüsseln, müssen Sie denselben Schlüssel auch zum Verschlüsseln des Klons verwenden.

Console

  1. Rufen Sie in der Cloud de Confiance Console die Seite Laufwerke auf.

    Zur Seite „Laufwerke“

  2. Suchen Sie in der Liste der zonalen nichtflüchtigen Speicher nach dem Speicher, den Sie klonen möchten.

  3. Klicken Sie in der Spalte Aktionen auf die Menüschaltfläche  und wählen Sie Laufwerk klonen aus.

    Klon erstellen

    Führen Sie im angezeigten Bereich Festplatte klonen die folgenden Schritte aus:

    1. Geben Sie im Feld Name einen Namen für das geklonte Laufwerk an.
    2. Geben Sie im Feld Entschlüsselung und Verschlüsselung den Verschlüsselungsschlüssel des Quelllaufwerks an.
    3. Prüfen Sie unter Attribute die anderen Details für das geklonte Laufwerk.
    4. Klicken Sie auf Erstellen, um das Erstellen des geklonten Laufwerks abzuschließen.

gcloud

Führen Sie den Befehl gcloud compute disks create aus und geben Sie den Verschlüsselungsschlüssel des Quelllaufwerks mit dem Flag --csek-key-file an, um einen Laufwerkklon für ein CSEK-verschlüsseltes Quelllaufwerk zu erstellen. Wenn Sie einen mit RSA verpackten Schlüssel verwenden, nutzen Sie den Befehl gcloud beta compute disks create.

gcloud compute disks create TARGET_DISK_NAME \
  --description="cloned disk" \
  --source-disk=projects/PROJECT_ID/zones/ZONE/disks/SOURCE_DISK_NAME \
  --csek-key-file example-key-file.json

Ersetzen Sie Folgendes:

  • TARGET_DISK_NAME: Name des neuen Laufwerks.
  • PROJECT_ID: die ID des Projekts, in dem Sie das Laufwerk klonen möchten.
  • ZONE: Zone des Quelllaufwerks und des neuen Laufwerks.
  • SOURCE_DISK_NAME: Name des Quelllaufwerks.

Go

Go

Bevor Sie dieses Beispiel verwenden, 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.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei der Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Legen Sie vor dem Ausführen von Codebeispielen die Umgebungsvariable GOOGLE_CLOUD_UNIVERSE_DOMAIN auf s3nsapis.fr fest.

import (
	"context"
	"fmt"
	"io"

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

// Creates a zonal non-boot persistent disk in a project with the copy of data from an existing disk.
// The encryption key must be the same for the source disk and the new disk.
// The disk type and size may differ.
func createDiskFromCustomerEncryptedDisk(
	w io.Writer,
	projectID, zone, diskName, diskType string,
	diskSizeGb int64,
	diskLink, encryptionKey string,
) error {
	// projectID := "your_project_id"
	// zone := "us-west3-b" // should match diskType below
	// diskName := "your_disk_name"
	// diskType := "zones/us-west3/diskTypes/pd-ssd"
	// diskSizeGb := 120
	// diskLink := "projects/your_project_id/global/disks/disk_name"
	// encryptionKey := "SGVsbG8gZnJvbSBHb29nbGUgQ2xvdWQgUGxhdGZvcm0=" // in base64

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

	req := &computepb.InsertDiskRequest{
		Project: projectID,
		Zone:    zone,
		DiskResource: &computepb.Disk{
			Name:       proto.String(diskName),
			Zone:       proto.String(zone),
			Type:       proto.String(diskType),
			SizeGb:     proto.Int64(diskSizeGb),
			SourceDisk: proto.String(diskLink),
			DiskEncryptionKey: &computepb.CustomerEncryptionKey{
				RawKey: &encryptionKey,
			},
		},
	}

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

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

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

	return nil
}

Java

Java

Bevor Sie dieses Beispiel verwenden, 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.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei der Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Legen Sie vor dem Ausführen von Codebeispielen die Umgebungsvariable GOOGLE_CLOUD_UNIVERSE_DOMAIN auf s3nsapis.fr fest.


import com.google.cloud.compute.v1.CustomerEncryptionKey;
import com.google.cloud.compute.v1.Disk;
import com.google.cloud.compute.v1.DisksClient;
import com.google.cloud.compute.v1.InsertDiskRequest;
import com.google.cloud.compute.v1.Operation;
import com.google.protobuf.ByteString;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CloneEncryptedDisk {

  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 project = "YOUR_PROJECT_ID";

    // Name of the zone in which you want to create the disk.
    String zone = "europe-central2-b";

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

    // The type of disk you want to create. This value uses the following format:
    // "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)".
    // For example: "zones/us-west3-b/diskTypes/pd-ssd"
    String diskType = String.format("zones/%s/diskTypes/pd-ssd", zone);

    // Size of the new disk in gigabytes.
    int diskSizeGb = 10;

    // A link to the disk you want to use as a source for the new disk.
    // This value uses the following format:
    // "projects/{project_name}/zones/{zone}/disks/{disk_name}"
    String diskLink = String.format("projects/%s/zones/%s/disks/%s", "PROJECT_NAME", "ZONE",
        "DISK_NAME");

    // Customer-supplied encryption key used for encrypting data in the source disk.
    // The data will be encrypted with the same key in the new disk.
    byte[] encryptionKey = null;

    createDiskFromCustomerEncryptedKey(project, zone, diskName, diskType, diskSizeGb, diskLink,
        encryptionKey);
  }

  // Creates a zonal non-boot persistent disk in a project with the copy of data
  // from an existing disk.
  // The encryption key must be the same for the source disk and the new disk.
  public static void createDiskFromCustomerEncryptedKey(String project, String zone,
      String diskName, String diskType, int diskSizeGb, String diskLink, byte[] encryptionKey)
      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 `disksClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (DisksClient disksClient = DisksClient.create()) {

      // Create a disk and set the encryption key.
      Disk disk = Disk.newBuilder()
          .setZone(zone)
          .setName(diskName)
          .setType(diskType)
          .setSizeGb(diskSizeGb)
          .setSourceDisk(diskLink)
          .setDiskEncryptionKey(CustomerEncryptionKey
              .newBuilder()
              .setRawKeyBytes(ByteString.copyFrom(encryptionKey))
              .build())
          .build();

      // Wait for the insert disk operation to complete.
      Operation operation = disksClient.insertAsync(
          InsertDiskRequest.newBuilder()
              .setProject(project)
              .setZone(zone)
              .setDiskResource(disk)
              .build()).get(3, TimeUnit.MINUTES);

      if (operation.hasError()) {
        System.out.println("Disk creation failed!");
        throw new Error(operation.getError().toString());
      }
      System.out.println(
          "Disk cloned with customer encryption key. Operation Status: " + operation.getStatus());
    }
  }
}

Python

Python

Bevor Sie dieses Beispiel verwenden, 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.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei der Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Legen Sie vor dem Ausführen von Codebeispielen die Umgebungsvariable GOOGLE_CLOUD_UNIVERSE_DOMAIN auf s3nsapis.fr fest.

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 create_disk_from_customer_encrypted_disk(
    project_id: str,
    zone: str,
    disk_name: str,
    disk_type: str,
    disk_size_gb: int,
    disk_link: str,
    encryption_key: bytes,
) -> compute_v1.Disk:
    """
    Creates a zonal non-boot persistent disk in a project with the copy of data from an existing disk.

    The encryption key must be the same for the source disk and the new disk.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone in which you want to create the disk.
        disk_name: name of the disk you want to create.
        disk_type: the type of disk you want to create. This value uses the following format:
            "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)".
            For example: "zones/us-west3-b/diskTypes/pd-ssd"
        disk_size_gb: size of the new disk in gigabytes
        disk_link: a link to the disk you want to use as a source for the new disk.
            This value uses the following format: "projects/{project_name}/zones/{zone}/disks/{disk_name}"
        encryption_key: customer-supplied encryption key used for encrypting
            data in the source disk. The data will be encrypted with the same key
            in the new disk.

    Returns:
        An attachable copy of an existing disk.
    """
    disk_client = compute_v1.DisksClient()
    disk = compute_v1.Disk()
    disk.zone = zone
    disk.size_gb = disk_size_gb
    disk.source_disk = disk_link
    disk.type_ = disk_type
    disk.name = disk_name
    disk.disk_encryption_key = compute_v1.CustomerEncryptionKey()
    disk.disk_encryption_key.raw_key = encryption_key
    operation = disk_client.insert(project=project_id, zone=zone, disk_resource=disk)

    wait_for_extended_operation(operation, "disk creation")

    return disk_client.get(project=project_id, zone=zone, disk=disk_name)

REST

Um einen Laufwerkklon für ein CSEK-verschlüsseltes Quelllaufwerk zu erstellen, senden Sie eine POST-Anfrage an die Methode compute.disks.insert und geben Sie den Verschlüsselungsschlüssel des Quelllaufwerks mit dem Attribut diskEncryptionKey an. Wenn Sie einen mit RSA verpackten Schlüssel verwenden, nutzen Sie die beta-Version der Methode.

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

{
  "name": "TARGET_DISK_NAME"
  "sourceDisk": "projects/PROJECT_ID/zones/ZONE/disks/SOURCE_DISK_NAME"
  "diskEncryptionKey": {
    "rsaEncryptedKey": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
  },
}

Ersetzen Sie Folgendes:

  • PROJECT_ID: die ID des Projekts, in dem Sie das Laufwerk klonen möchten.
  • ZONE: Zone des Quelllaufwerks und des neuen Laufwerks.
  • TARGET_DISK_NAME: Name des neuen Laufwerks.
  • SOURCE_DISK_NAME: Name des Quelllaufwerks.

Laufwerksklone für CMEK-verschlüsselte Laufwerke erstellen

Wenn Sie das Quelllaufwerk mit einem CMEK verschlüsseln, müssen Sie denselben Schlüssel auch zum Verschlüsseln des Klons verwenden.

Console

Compute Engine verschlüsselt den Klon automatisch mit dem Verschlüsselungsschlüssel des Quelllaufwerks.

gcloud

Führen Sie den Befehl gcloud compute disks create aus und geben Sie den Verschlüsselungsschlüssel des Quelllaufwerks mit dem Flag --kms-key an, um einen Laufwerksklon für ein CMEK-verschlüsseltes Quelllaufwerk zu erstellen. Wenn Sie einen mit RSA verpackten Schlüssel verwenden, nutzen Sie den Befehl gcloud beta compute disks create.

gcloud compute disks create TARGET_DISK_NAME \
  --description="cloned disk" \
  --source-disk=projects/PROJECT_ID/zones/ZONE/disks/SOURCE_DISK_NAME \
  --kms-key projects/KMS_PROJECT_ID/locations/REGION/keyRings/KEY_RING/cryptoKeys/KEY

Ersetzen Sie Folgendes:

  • TARGET_DISK_NAME: Name des neuen Laufwerks.
  • PROJECT_ID: die ID des Projekts, in dem Sie das Laufwerk klonen möchten.
  • ZONE: Zone des Quelllaufwerks und des neuen Laufwerks.
  • SOURCE_DISK_NAME: der Name des Quelllaufwerks.
  • KMS_PROJECT_ID: Projekt-ID für den Verschlüsselungsschlüssel.
  • REGION: Region des Verschlüsselungsschlüssels.
  • KEY_RING: Schlüsselbund des Verschlüsselungsschlüssels.
  • KEY: Name des Verschlüsselungsschlüssels.

Go

Go

Bevor Sie dieses Beispiel verwenden, 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.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei der Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Legen Sie vor dem Ausführen von Codebeispielen die Umgebungsvariable GOOGLE_CLOUD_UNIVERSE_DOMAIN auf s3nsapis.fr fest.

import (
	"context"
	"fmt"
	"io"

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

// Creates a zonal non-boot persistent disk in a project with the copy of data from an existing disk.
// The encryption key must be the same for the source disk and the new disk.
// The disk type and size may differ.
func createDiskFromKmsEncryptedDisk(
	w io.Writer,
	projectID, zone, diskName, diskType string,
	diskSizeGb int64,
	diskLink, kmsKeyLink string,
) error {
	// projectID := "your_project_id"
	// zone := "us-west3-b" // should match diskType below
	// diskName := "your_disk_name"
	// diskType := "zones/us-west3/diskTypes/pd-ssd"
	// diskSizeGb := 120
	// diskLink := "projects/your_project_id/global/disks/disk_name"
	// kmsKeyLink := "projects/your_kms_project_id/locations/us-central1/keyRings/your_key_ring/cryptoKeys/your_key"

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

	req := &computepb.InsertDiskRequest{
		Project: projectID,
		Zone:    zone,
		DiskResource: &computepb.Disk{
			Name:       proto.String(diskName),
			Zone:       proto.String(zone),
			Type:       proto.String(diskType),
			SizeGb:     proto.Int64(diskSizeGb),
			SourceDisk: proto.String(diskLink),
			DiskEncryptionKey: &computepb.CustomerEncryptionKey{
				KmsKeyName: &kmsKeyLink,
			},
		},
	}

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

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

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

	return nil
}

Java

Java

Bevor Sie dieses Beispiel verwenden, 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.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei der Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Legen Sie vor dem Ausführen von Codebeispielen die Umgebungsvariable GOOGLE_CLOUD_UNIVERSE_DOMAIN auf s3nsapis.fr fest.


import com.google.cloud.compute.v1.CustomerEncryptionKey;
import com.google.cloud.compute.v1.Disk;
import com.google.cloud.compute.v1.DisksClient;
import com.google.cloud.compute.v1.InsertDiskRequest;
import com.google.cloud.compute.v1.Operation;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CloneEncryptedDiskManagedKey {

  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 project = "YOUR_PROJECT_ID";

    // Name of the zone in which you want to create the disk.
    String zone = "europe-central2-b";

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

    // The type of disk you want to create. This value uses the following format:
    // "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)".
    // For example: "zones/us-west3-b/diskTypes/pd-ssd"
    String diskType = String.format("zones/%s/diskTypes/pd-ssd", zone);

    // Size of the new disk in gigabytes.
    int diskSizeGb = 10;

    // A link to the disk you want to use as a source for the new disk.
    // This value uses the following format:
    // "projects/{project_name}/zones/{zone}/disks/{disk_name}"
    String diskLink = String.format("projects/%s/zones/%s/disks/%s", "PROJECT_NAME", "ZONE",
        "DISK_NAME");

    // URL of the key from KMS. The key might be from another project, as
    // long as you have access to it. The data will be encrypted with the same key
    // in the new disk. This value uses following format:
    // "projects/{kms_project_id}/locations/{region}/keyRings/{key_ring}/cryptoKeys/{key}"
    String kmsKeyName = "kms-key-name";

    createDiskFromKmsEncryptedDisk(project, zone, diskName, diskType, diskSizeGb, diskLink,
        kmsKeyName);
  }

  // Creates a zonal non-boot disk in a project with the copy of data from an existing disk.
  // The encryption key must be the same for the source disk and the new disk.
  public static void createDiskFromKmsEncryptedDisk(String project, String zone, String diskName,
      String diskType, int diskSizeGb, String diskLink, String kmsKeyName)
      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 `disksClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (DisksClient disksClient = DisksClient.create()) {

      // Create a disk and set the KMS encryption key name.
      Disk disk = Disk.newBuilder()
          .setZone(zone)
          .setName(diskName)
          .setType(diskType)
          .setSizeGb(diskSizeGb)
          .setSourceDisk(diskLink)
          .setDiskEncryptionKey(CustomerEncryptionKey.newBuilder()
              .setKmsKeyName(kmsKeyName)
              .build())
          .build();

      // Wait for the insert disk operation to complete.
      Operation operation = disksClient.insertAsync(
          InsertDiskRequest.newBuilder()
              .setProject(project)
              .setZone(zone)
              .setDiskResource(disk)
              .build()).get(3, TimeUnit.MINUTES);

      if (operation.hasError()) {
        System.out.println("Disk creation failed!");
        throw new Error(operation.getError().toString());
      }
      System.out.println(
          "Disk cloned with KMS encryption key. Operation Status: " + operation.getStatus());
    }
  }
}

Python

Python

Bevor Sie dieses Beispiel verwenden, 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.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei der Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Legen Sie vor dem Ausführen von Codebeispielen die Umgebungsvariable GOOGLE_CLOUD_UNIVERSE_DOMAIN auf s3nsapis.fr fest.

from __future__ import annotations

import sys
from typing import Any

from google.api_core.exceptions import BadRequest
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 create_disk_from_kms_encrypted_disk(
    project_id: str,
    zone: str,
    disk_name: str,
    disk_type: str,
    disk_size_gb: int,
    disk_link: str,
    kms_key_name: str,
) -> compute_v1.Disk:
    """
    Creates a zonal non-boot disk in a project with the copy of data from an existing disk.

    The encryption key must be the same for the source disk and the new disk.

    To run this method, the service-<project_id>@compute-system.iam.gserviceaccount.com
    service account needs to have the cloudkms.cryptoKeyEncrypterDecrypter role,
    as described in documentation:
    https://cloud.google.com/compute/docs/disks/customer-managed-encryption#before_you_begin

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone in which you want to create the disk.
        disk_name: name of the disk you want to create.
        disk_type: the type of disk you want to create. This value uses the following format:
            "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)".
            For example: "zones/us-west3-b/diskTypes/pd-ssd"
        disk_size_gb: size of the new disk in gigabytes
        disk_link: a link to the disk you want to use as a source for the new disk.
            This value uses the following format: "projects/{project_name}/zones/{zone}/disks/{disk_name}"
        kms_key_name: URL of the key from KMS. The key might be from another project, as
            long as you have access to it. The data will be encrypted with the same key
            in the new disk. This value uses following format:
            "projects/{kms_project_id}/locations/{region}/keyRings/{key_ring}/cryptoKeys/{key}"

    Returns:
        An attachable copy of an existing disk.
    """
    disk_client = compute_v1.DisksClient()
    disk = compute_v1.Disk()
    disk.zone = zone
    disk.size_gb = disk_size_gb
    disk.source_disk = disk_link
    disk.type_ = disk_type
    disk.name = disk_name
    disk.disk_encryption_key = compute_v1.CustomerEncryptionKey()
    disk.disk_encryption_key.kms_key_name = kms_key_name
    try:
        operation = disk_client.insert(
            project=project_id, zone=zone, disk_resource=disk
        )
    except BadRequest as err:
        if "Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied" in err.message:
            print(
                f"Please provide the cloudkms.cryptoKeyEncrypterDecrypter role to"
                f"service-{project_id}@compute-system.iam.gserviceaccount.com"
            )
        raise err

    wait_for_extended_operation(operation, "disk creation")

    return disk_client.get(project=project_id, zone=zone, disk=disk_name)

REST

Um einen Laufwerksklon für ein CMEK-verschlüsseltes Quelllaufwerk zu erstellen, senden Sie eine POST-Anfrage an die Methode compute.disks.insert und geben Sie den Verschlüsselungsschlüssel des Quelllaufwerks mit dem Attribut kmsKeyName an. Wenn Sie einen mit RSA verpackten Schlüssel verwenden, nutzen Sie die beta-Version der Methode.

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

{
  "name": "TARGET_DISK_NAME"
  "sourceDisk": "projects/PROJECT_ID/zones/ZONE/disks/SOURCE_DISK_NAME"
  "diskEncryptionKey": {
    "kmsKeyName": "projects/KMS_PROJECT_ID/locations/REGION/keyRings/KEY_RING/cryptoKeys/KEY"
  },
}

Ersetzen Sie Folgendes:

  • PROJECT_ID: die ID des Projekts, in dem Sie das Laufwerk klonen möchten.
  • ZONE: Zone des Quelllaufwerks und des neuen Laufwerks.
  • TARGET_DISK_NAME: Name des neuen Laufwerks.
  • SOURCE_DISK_NAME: der Name des Quelllaufwerks.
  • KMS_PROJECT_ID: Projekt-ID für den Verschlüsselungsschlüssel.
  • REGION: Region des Verschlüsselungsschlüssels.
  • KEY_RING: Schlüsselbund des Verschlüsselungsschlüssels.
  • KEY: Name des Verschlüsselungsschlüssels.

Nächste Schritte