Snapshot-Zeitpläne für Laufwerke verwalten


In diesem Dokument wird beschrieben, wie Sie Snapshot-Zeitpläne für zonale und regionale Persistent Disk und Google Cloud Hyperdisk verwalten.

So verwalten Sie Snapshot-Zeitpläne:

  • Snapshot-Zeitpläne aufrufen
  • Snapshot-Zeitpläne ändern
  • Snapshot-Zeitpläne löschen

Sie können auch Benachrichtigungen für geplante Snapshots konfigurieren.

Hinweise

Erforderliche Rollen und Berechtigungen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für das Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Erstellen eines Snapshot-Zeitplans benötigen:

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Diese vordefinierten Rollen enthalten die Berechtigungen, die zum Erstellen eines Snapshot-Zeitplans erforderlich sind. Erweitern Sie den Abschnitt Erforderliche Berechtigungen, um die erforderlichen Berechtigungen anzuzeigen:

Erforderliche Berechtigungen

Die folgenden Berechtigungen sind erforderlich, um einen Snapshot-Zeitplan zu erstellen:

  • So rufen Sie Snapshot-Zeitpläne auf: compute.resourcePolicies.list für das Projekt oder die Organisation
  • So aktualisieren Sie einen Snapshot-Zeitplan:
    • compute.resourcePolicies.update für die Ressourcenrichtlinie
    • compute.resourcePolicies.get für die Ressourcenrichtlinie
  • So ersetzen Sie einen Snapshot-Zeitplan:
    • compute.resourcePolicies.use für die Ressourcenrichtlinie
    • compute.disks.addResourcePolicies für das Laufwerk
    • compute.disks.removeResourcePolicies für das Laufwerk
  • So löschen Sie einen Snapshot-Zeitplan:
    • compute.resourcePolicies.delete für die Ressourcenrichtlinie
    • compute.disks.removeResourcePolicies für das Laufwerk

Sie können diese Berechtigungen auch mit benutzerdefinierten Rollen oder anderen vordefinierten Rollen erhalten.

Snapshot-Zeitpläne aufrufen

Verwenden Sie zum Abrufen einer Liste der Snapshot-Zeitpläne die Console, den gcloud-Befehl oder die Compute Engine API. Diese Anfrage ruft den Namen, die Beschreibung und die Region aller Snapshot-Zeitpläne in einem Projekt ab.

Console

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

    Zur Seite "Snapshots"

  2. Wählen Sie den Tab Snapshot-Zeitpläne aus.
  3. Mit dem Feld Filter können Sie die Liste der Snapshot-Zeitpläne eingrenzen.
  4. Klicken Sie auf den Namen eines Snapshot-Zeitplans, um die zugehörigen Details aufzurufen.

gcloud

Eine Liste Ihrer Snapshot-Zeitpläne erhalten Sie mit dem Befehl resource-policies list.

 gcloud compute resource-policies list

Die Beschreibung eines bestimmten Snapshot-Zeitplans können Sie mit dem Befehl resource-policies describe abrufen.

gcloud compute resource-policies describe SCHEDULE_NAME

Ersetzen Sie SCHEDULE_NAME durch den Namen des Snapshot-Zeitplans.

Go

Snapshot-Zeitpläne auflisten

import (
	"context"
	"fmt"
	"io"

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

// listSnapshotSchedule retrieves a list of snapshot schedules.
func listSnapshotSchedule(w io.Writer, projectID, region, filter string) error {
	// projectID := "your_project_id"
	// snapshotName := "your_snapshot_name"
	// region := "eupore-central2"

	// Formatting for filters:
	// https://cloud.google.com/python/docs/reference/compute/latest/google.cloud.compute_v1.types.ListResourcePoliciesRequest

	ctx := context.Background()

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

	req := &computepb.ListResourcePoliciesRequest{
		Project: projectID,
		Region:  region,
		Filter:  proto.String(filter),
	}
	it := snapshotsClient.List(ctx, req)

	for {
		policy, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return err
		}
		fmt.Fprintf(w, "- %s", policy.GetName())
	}
	return nil
}

Snapshot-Zeitplan beschreiben

import (
	"context"
	"fmt"
	"io"

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

// getSnapshotSchedule gets a snapshot schedule.
func getSnapshotSchedule(w io.Writer, projectID, scheduleName, region string) error {
	// projectID := "your_project_id"
	// snapshotName := "your_snapshot_name"
	// region := "eupore-central2"

	ctx := context.Background()

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

	req := &computepb.GetResourcePolicyRequest{
		Project:        projectID,
		Region:         region,
		ResourcePolicy: scheduleName,
	}
	schedule, err := snapshotsClient.Get(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to get snapshot schedule: %w", err)
	}

	fmt.Fprintf(w, "Found snapshot schedule: %s\n", schedule.GetName())

	return nil
}

Java

Snapshot-Zeitpläne auflisten

import com.google.cloud.compute.v1.ListResourcePoliciesRequest;
import com.google.cloud.compute.v1.ResourcePoliciesClient;
import com.google.cloud.compute.v1.ResourcePoliciesClient.ListPagedResponse;
import com.google.cloud.compute.v1.ResourcePolicy;
import java.io.IOException;

public class ListSnapshotSchedules {

  public static void main(String[] args) throws IOException {
    // 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 region you want to list snapshot schedules from.
    String region = "us-central1";
    // Name of the snapshot schedule you want to list.
    String snapshotScheduleName = "YOUR_SCHEDULE_NAME";

    listSnapshotSchedules(projectId, region, snapshotScheduleName);
  }

  // Lists snapshot schedules in a specified region, optionally filtered.
  public static ListPagedResponse listSnapshotSchedules(
          String projectId, String region, String snapshotScheduleName) throws IOException {
    String filter = String.format("name = %s", snapshotScheduleName);
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (ResourcePoliciesClient resourcePoliciesClient = ResourcePoliciesClient.create()) {

      ListResourcePoliciesRequest request = ListResourcePoliciesRequest.newBuilder()
              .setProject(projectId)
              .setRegion(region)
              .setFilter(filter)
              .build();
      ListPagedResponse response = resourcePoliciesClient.list(request);
      for (ResourcePolicy resourcePolicy : response.iterateAll()) {
        System.out.println(resourcePolicy);
      }
      return response;
    }
  }
}

Snapshot-Zeitpläne beschreiben

import com.google.cloud.compute.v1.GetResourcePolicyRequest;
import com.google.cloud.compute.v1.ResourcePoliciesClient;
import com.google.cloud.compute.v1.ResourcePolicy;
import java.io.IOException;

public class GetSnapshotSchedule {

  public static void main(String[] args) throws IOException {
    // 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 region in which your snapshot schedule is located.
    String region = "us-central1";
    // Name of your snapshot schedule.
    String snapshotScheduleName = "YOUR_SCHEDULE_NAME";

    getSnapshotSchedule(projectId, region, snapshotScheduleName);
  }

  // Retrieves the details of a snapshot schedule.
  public static ResourcePolicy getSnapshotSchedule(
        String projectId, String region, String snapshotScheduleName) throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (ResourcePoliciesClient resourcePoliciesClient = ResourcePoliciesClient.create()) {
      GetResourcePolicyRequest request = GetResourcePolicyRequest.newBuilder()
              .setProject(projectId)
              .setRegion(region)
              .setResourcePolicy(snapshotScheduleName)
              .build();
      ResourcePolicy resourcePolicy = resourcePoliciesClient.get(request);
      System.out.println(resourcePolicy);

      return resourcePolicy;
    }
  }
}

Node.js

// Import the Compute library
const computeLib = require('@google-cloud/compute');

// Instantiate a resourcePoliciesClient
const resourcePoliciesClient = new computeLib.ResourcePoliciesClient();

/**
 * TODO(developer): Update/uncomment these variables before running the sample.
 */
// The project name.
const projectId = await resourcePoliciesClient.getProjectId();

// The location of the snapshot schedule resource policy.
// region = 'us-central1';

// The name of the snapshot schedule.
// snapshotScheduleName = 'snapshot-schedule-name';

async function callGetSnapshotSchedule() {
  const [response] = await resourcePoliciesClient.get({
    project: projectId,
    region,
    resourcePolicy: snapshotScheduleName,
  });

  console.log(JSON.stringify(response));
}

await callGetSnapshotSchedule();

Python

Snapshot-Zeitpläne auflisten

from google.cloud import compute_v1
from google.cloud.compute_v1.services.resource_policies import pagers


def snapshot_schedule_list(project_id: str, region: str) -> pagers.ListPager:
    """
    Lists snapshot schedules for a specified project and region.
    Args:
        project_id (str): The ID of the Google Cloud project.
        region (str): The region where the snapshot schedules are located.
    Returns:
        ListPager: A pager for iterating through the list of snapshot schedules.
    """
    client = compute_v1.ResourcePoliciesClient()

    request = compute_v1.ListResourcePoliciesRequest(
        project=project_id,
        region=region,
        filter='status = "READY"',  # Optional filter
    )

    schedules = client.list(request=request)
    return schedules

Snapshot-Zeitplan beschreiben

from google.cloud import compute_v1


def snapshot_schedule_get(
    project_id: str, region: str, snapshot_schedule_name: str
) -> compute_v1.ResourcePolicy:
    """
    Retrieves a snapshot schedule for a specified project and region.
    Args:
        project_id (str): The ID of the Google Cloud project.
        region (str): The region where the snapshot schedule is located.
        snapshot_schedule_name (str): The name of the snapshot schedule.
    Returns:
        compute_v1.ResourcePolicy: The retrieved snapshot schedule.
    """
    client = compute_v1.ResourcePoliciesClient()
    schedule = client.get(
        project=project_id, region=region, resource_policy=snapshot_schedule_name
    )
    return schedule

REST

Senden Sie eine GET-Anfrage an resourcePolicies.aggregatedList, um eine Liste der Snapshot-Zeitpläne in einem Projekt abzurufen.

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/aggregated/resourcePolicies

Ersetzen Sie PROJECT_ID durch den Projektnamen.

Snapshot-Zeitpläne nach Region ansehen

Verwenden Sie die Google Cloud Console, die gcloud CLI oder REST, um die Snapshot-Zeitpläne für ein Projekt in einer bestimmten Region aufzurufen.

Console

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

    Zur Seite "Snapshots"

  2. Wählen Sie den Tab Snapshot-Zeitpläne aus.
  3. Mit dem Feld Filter können Sie Snapshot-Zeitpläne für eine bestimmte Region auflisten.

gcloud

Verwenden Sie den Befehl resource-policies list, um die Snapshot-Zeitpläne für ein Projekt in einer bestimmten Region aufzurufen.

gcloud compute resource-policies list PROJECT_ID --filter REGION

Ersetzen Sie dabei Folgendes:

  • PROJECT_ID: der Projektname
  • REGION: Die Region, z. B. us-west1

REST

Senden Sie eine GET-Anfrage an die Methode resourcePolicies.list, um die in einer Region erstellten Snapshot-Zeitpläne abzurufen.

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/resourcePolicies

Ersetzen Sie dabei Folgendes:

  • PROJECT_ID: der Projektname
  • REGION: Die Region, z. B. us-west1

Snapshot-Zeitplan ändern

Nachdem Sie einen Snapshot-Zeitplan erstellt haben, können Sie die folgenden Felder dynamisch ändern. Gehen Sie dazu wie unter Snapshot-Zeitplan aktualisieren beschrieben vor:

  • Beschreibung
  • Zeitplan für Snapshots
  • Auf die generierten Snapshots angewendete Labels
  • Richtlinie zum Löschen des Quelllaufwerks für die Verarbeitung automatisch generierter Snapshots, wenn das Quelllaufwerk gelöscht wird
  • Aufbewahrungsrichtlinie, mit der Sie definieren können, wie lange über den Snapshot-Zeitplan generierte Snapshots aufbewahrt werden

Zum Aktualisieren anderer Werte für einen Snapshot-Zeitplan müssen Sie den Snapshot-Zeitplan löschen und einen neuen erstellen, wie unter Snapshot-Zeitplan ersetzen beschrieben.

Die Aktualisierungen des Snapshot-Zeitplans werden im ersten Snapshot nach den Aktualisierungen wirksam. Wenn ein Snapshot ausgeführt wird, während Sie den Snapshot-Zeitplan aktualisieren, werden die Änderungen im folgenden Snapshot wirksam.

Snapshot-Zeitplan aktualisieren

Mit der Google Cloud CLI oder der Compute Engine API können Sie einige der Attribute Ihres Snapshot-Zeitplans ändern, wie unter Snapshot-Zeitplan ändern beschrieben.

Verwenden Sie die unter Snapshot-Zeitplan ersetzen beschriebene Methode, um andere Attribute Ihres Snapshot-Zeitplans zu ändern.

Console

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

    Zur Seite "Snapshots"

  2. Wählen Sie Snapshot-Zeitpläne aus, um eine Liste Ihrer Zeitpläne aufzurufen.
  3. Klicken Sie auf den Namen des Snapshot-Zeitplans, den Sie ändern möchten.
  4. Klicken Sie auf der Detailseite des Snapshot-Zeitplans auf die Schaltfläche Zeitplan bearbeiten.

gcloud

Verwenden Sie den Befehl compute resource-policies update, um die Beschreibung, den Zeitplan, die Aufbewahrungsrichtlinie oder die Labels eines Snapshot-Zeitplans zu aktualisieren.

gcloud compute resource-policies update snapshot-schedule SCHEDULE_NAME \
   --region=REGION \
   --description="DESCRIPTION" \
   --snapshot-labels="KEY=VALUE" \
   --max-retention-days=DAYS \
   --on-source-disk-delete=DELETE_OPTION \
   --start-time=START_TIME \
   SCHEDULE_FLAG

Ersetzen Sie dabei Folgendes:

  • SCHEDULE_NAME ist der Name des Snapshot-Zeitplans
  • REGION ist die Region, in der sich der Snapshot-Zeitplan befindet
  • DESCRIPTION ist eine Beschreibung des Snapshot-Zeitplans Setzen Sie die Beschreibung in Anführungszeichen.
  • KEY und VALUE: ein Schlüssel/Wert-Paar, mit dem verwandte oder zugehörige Ressourcen gruppiert werden können.
  • DAYS: Maximale Anzahl von Tagen für die Aufbewahrung eines Snapshots, bevor er gelöscht wird.
  • DELETE_OPTION: Aufbewahrungsverhalten für automatische Snapshots nach dem Löschen des ursprünglichen Laufwerks. Der Wert muss einer der folgenden sein:
    • apply-retention-policy: Wenn das Quelllaufwerk gelöscht wird, gilt das Aufbewahrungsfenster für alle vom Snapshot-Zeitplan erstellten Snapshots weiterhin.
    • keep-auto-snapshots (Standardeinstellung): Wenn das Quelllaufwerk gelöscht wird, werden alle vom Snapshot-Zeitplan erstellten Snapshots unabhängig vom Aufbewahrungsfenster beibehalten.
  • START_TIME ist die Startzeit für UTC. Sie müssen die Uhrzeit als volle Stunde angeben. Beispiel:
    • 14:00 Uhr PST ist 22:00.
    • Wenn Sie als Startzeit 22:13 festlegen, erhalten Sie eine Fehlermeldung.
  • SCHEDULE_FLAG: eines der folgenden Flags:

    • --hourly-schedule=HOURLY_INTERVAL: die Anzahl der Stunden zwischen jedem Snapshot. HOURLY_INTERVAL muss eine Ganzzahl zwischen 1 und 23 sein. Beispiel: Wenn Sie --hourly-schedule auf 12 setzen, bedeutet das, dass der Snapshot alle 12 Stunden generiert wird.
    • --daily-schedule: Führt täglich einen Snapshot unter START_TIME aus
    • --weekly-schedule=WEEKLY_INTERVAL: definiert den Tag, an dem der Snapshot generiert werden soll. Wochentag muss ausgeschrieben werden; die Groß-/Kleinschreibung wird nicht berücksichtigt.

    • --weekly-schedule-from-file=FILE_NAME: gibt eine Datei an, die den wöchentlichen Snapshot-Zeitplan enthält. Sie können wöchentliche Zeitpläne an verschiedenen Wochentagen und zu unterschiedlichen Zeiten mithilfe einer Datei angeben. Beispiel: Sie können in der Datei einen Snapshot-Zeitplan für jeweils Montag und Mittwoch festlegen: none [{"day": "MONDAY", "startTime": "04:00"}, {"day": "WEDNESDAY", "startTime": "02:00"}] Wenn Sie in der Datei eine Startzeit angeben, wird das Flag --start-time nicht benötigt. Der Zeitplan verwendet die UTC-Zeitzone. Sie müssen die Uhrzeit als volle Stunde angeben. Beispiel:

      • 14:00 Uhr PST ist 22:00.
      • Wenn Sie als Startzeit 22:13 festlegen, erhalten Sie eine Fehlermeldung.

    Die Flags der Snapshot-Häufigkeit hourly-schedule, daily-schedule, weekly-schedule undweekly-schedule-from-file schließen sich gegenseitig aus. Sie können nur eins für den Snapshot-Zeitplan verwenden.

Beispiele:

So ändern Sie einen Snapshot-Zeitplan in einen täglichen Zeitplan:

gcloud compute resource-policies update snapshot-schedule SCHEDULE_NAME \
    --region=REGION --daily-schedule --start-time=START_TIME

So ändern Sie einen Snapshot in einen stündlichen Zeitplan und aktualisieren auch die Beschreibung und das Snapshot-Label:

gcloud compute resource-policies update snapshot-schedule SCHEDULE_NAME \
    --region=REGION --description="DESCRIPTION" \
    --hourly-schedule=HOURLY_INTERVAL --start-time=START_TIME \
    --snapshot-labels="KEY=VALUE"

So ändern Sie die Richtlinien für die Snapshot-Aufbewahrung und das Löschen von Quelllaufwerken für einen Snapshot-Zeitplan:

gcloud compute resource-policies update snapshot-schedule SCHEDULE_NAME \
    --region=REGION --max-retention-days=DAYS \
    --on-source-disk-delete=DELETE_OPTION

Go

import (
	"context"
	"fmt"
	"io"

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

// editSnapshotSchedule edits a snapshot schedule.
func editSnapshotSchedule(w io.Writer, projectID, scheduleName, region string) error {
	// projectID := "your_project_id"
	// snapshotName := "your_snapshot_name"
	// region := "eupore-central2"

	ctx := context.Background()

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

	req := &computepb.PatchResourcePolicyRequest{
		Project:        projectID,
		Region:         region,
		ResourcePolicy: scheduleName,
		ResourcePolicyResource: &computepb.ResourcePolicy{
			Name:        proto.String(scheduleName),
			Description: proto.String("MY HOURLY SNAPSHOT SCHEDULE"),
			SnapshotSchedulePolicy: &computepb.ResourcePolicySnapshotSchedulePolicy{
				Schedule: &computepb.ResourcePolicySnapshotSchedulePolicySchedule{
					HourlySchedule: &computepb.ResourcePolicyHourlyCycle{
						HoursInCycle: proto.Int32(12),
						StartTime:    proto.String("22:00"),
					},
				},
			},
		},
	}
	op, err := snapshotsClient.Patch(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to create snapshot schedule: %w", err)
	}

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

	fmt.Fprint(w, "Snapshot schedule changed\n")

	return nil
}

Java

import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.Operation.Status;
import com.google.cloud.compute.v1.PatchResourcePolicyRequest;
import com.google.cloud.compute.v1.ResourcePoliciesClient;
import com.google.cloud.compute.v1.ResourcePolicy;
import com.google.cloud.compute.v1.ResourcePolicySnapshotSchedulePolicy;
import com.google.cloud.compute.v1.ResourcePolicySnapshotSchedulePolicyRetentionPolicy;
import com.google.cloud.compute.v1.ResourcePolicySnapshotSchedulePolicyRetentionPolicy.OnSourceDiskDelete;
import com.google.cloud.compute.v1.ResourcePolicySnapshotSchedulePolicySchedule;
import com.google.cloud.compute.v1.ResourcePolicySnapshotSchedulePolicySnapshotProperties;
import com.google.cloud.compute.v1.ResourcePolicyWeeklyCycle;
import com.google.cloud.compute.v1.ResourcePolicyWeeklyCycleDayOfWeek;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class EditSnapshotSchedule {

  public static void main(String[] args) throws Exception {
    // 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 region where your snapshot schedule is located.
    String region = "us-central1";
    // Name of the snapshot schedule you want to update.
    String snapshotScheduleName = "YOUR_SCHEDULE_NAME";

    editSnapshotSchedule(projectId, region, snapshotScheduleName);
  }

  // Edits a snapshot schedule.
  public static Status editSnapshotSchedule(
          String projectId, String region, String snapshotScheduleName)
          throws IOException, InterruptedException, ExecutionException, 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.
    try (ResourcePoliciesClient resourcePoliciesClient = ResourcePoliciesClient.create()) {
      Map<String, String> snapshotLabels = new HashMap<>();
      snapshotLabels.put("key", "value");

      ResourcePolicySnapshotSchedulePolicySnapshotProperties.Builder snapshotProperties =
              ResourcePolicySnapshotSchedulePolicySnapshotProperties.newBuilder();
      snapshotProperties.putAllLabels(snapshotLabels);

      ResourcePolicyWeeklyCycleDayOfWeek dayOfWeek = ResourcePolicyWeeklyCycleDayOfWeek.newBuilder()
              .setDay("Tuesday")
              .setStartTime("09:00")
              .build();
      ResourcePolicyWeeklyCycle weeklySchedule = ResourcePolicyWeeklyCycle.newBuilder()
              .addDayOfWeeks(dayOfWeek)
              .build();

      int maxRetentionDays = 3;

      ResourcePolicySnapshotSchedulePolicyRetentionPolicy.Builder retentionPolicy =
              ResourcePolicySnapshotSchedulePolicyRetentionPolicy.newBuilder();
      retentionPolicy.setOnSourceDiskDelete(OnSourceDiskDelete.APPLY_RETENTION_POLICY.toString());
      retentionPolicy.setMaxRetentionDays(maxRetentionDays);

      String description = "Updated description";

      ResourcePolicy updatedSchedule = ResourcePolicy.newBuilder()
              .setName(snapshotScheduleName)
              .setDescription(description)
              .setSnapshotSchedulePolicy(
                      ResourcePolicySnapshotSchedulePolicy.newBuilder()
                              .setSchedule(ResourcePolicySnapshotSchedulePolicySchedule.newBuilder()
                                      .setWeeklySchedule(weeklySchedule))
                              .setSnapshotProperties(snapshotProperties)
                              .setRetentionPolicy(retentionPolicy.build())
                              .build())
              .build();

      PatchResourcePolicyRequest request = PatchResourcePolicyRequest.newBuilder()
              .setProject(projectId)
              .setRegion(region)
              .setResourcePolicy(snapshotScheduleName)
              .setResourcePolicyResource(updatedSchedule)
              .build();

      Operation response = resourcePoliciesClient.patchAsync(request).get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        throw new Error("Failed to update snapshot schedule! " + response.getError());
      }
      return response.getStatus();
    }
  }
}

Node.js

// Import the Compute library
const computeLib = require('@google-cloud/compute');
const compute = computeLib.protos.google.cloud.compute.v1;

// Instantiate a resourcePoliciesClient
const resourcePoliciesClient = new computeLib.ResourcePoliciesClient();
// Instantiate a regionOperationsClient
const regionOperationsClient = new computeLib.RegionOperationsClient();

/**
 * TODO(developer): Update/uncomment these variables before running the sample.
 */
// The project name.
const projectId = await resourcePoliciesClient.getProjectId();

// The location of the snapshot schedule resource policy.
// region = 'us-central1';

// The name of the snapshot schedule.
// snapshotScheduleName = 'snapshot-schedule-name';

async function callEditSnapshotSchedule() {
  const [response] = await resourcePoliciesClient.patch({
    project: projectId,
    region,
    resourcePolicy: snapshotScheduleName,
    resourcePolicyResource: compute.ResourcePolicy({
      snapshotSchedulePolicy:
        compute.ResourcePolicyInstanceSchedulePolicySchedule({
          schedule: compute.ResourcePolicySnapshotSchedulePolicySchedule({
            weeklySchedule: compute.ResourcePolicyWeeklyCycle({
              dayOfWeeks: [
                compute.ResourcePolicyWeeklyCycleDayOfWeek({
                  day: 'Tuesday',
                  startTime: '9:00',
                }),
              ],
            }),
          }),
        }),
    }),
  });

  let operation = response.latestResponse;

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

  console.log(`Snapshot schedule: ${snapshotScheduleName} edited.`);
}

await callEditSnapshotSchedule();

Python

from __future__ import annotations

import sys
from typing import Any

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


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

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

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

    Returns:
        Whatever the operation.result() returns.

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

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

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

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

    return result


def snapshot_schedule_update(
    project_id: str,
    region: str,
    schedule_name: str,
    schedule_description: str,
    labels: dict,
) -> compute_v1.ResourcePolicy:
    """
    Updates a snapshot schedule for a specified project and region.
    Args:
        project_id (str): The ID of the Google Cloud project.
        region (str): The region where the snapshot schedule is located.
        schedule_name (str): The name of the snapshot schedule to update.
        schedule_description (str): The new description for the snapshot schedule.
        labels (dict): A dictionary of new labels to apply to the snapshot schedule.
    Returns:
        compute_v1.ResourcePolicy: The updated snapshot schedule.
    """

    # Every Monday, starts between 12:00 AM and 1:00 AM
    day = compute_v1.ResourcePolicyWeeklyCycleDayOfWeek(
        day="MONDAY", start_time="00:00"
    )
    weekly_schedule = compute_v1.ResourcePolicyWeeklyCycle(day_of_weeks=[day])

    schedule = compute_v1.ResourcePolicySnapshotSchedulePolicySchedule()
    # You can change the schedule type to daily_schedule, weekly_schedule, or hourly_schedule
    schedule.weekly_schedule = weekly_schedule

    # Autodelete snapshots after 10 days
    retention_policy = compute_v1.ResourcePolicySnapshotSchedulePolicyRetentionPolicy(
        max_retention_days=10
    )
    snapshot_properties = (
        compute_v1.ResourcePolicySnapshotSchedulePolicySnapshotProperties(
            guest_flush=False, labels=labels
        )
    )

    snapshot_policy = compute_v1.ResourcePolicySnapshotSchedulePolicy()
    snapshot_policy.schedule = schedule
    snapshot_policy.retention_policy = retention_policy
    snapshot_policy.snapshot_properties = snapshot_properties

    resource_policy_resource = compute_v1.ResourcePolicy(
        name=schedule_name,
        description=schedule_description,
        snapshot_schedule_policy=snapshot_policy,
    )

    client = compute_v1.ResourcePoliciesClient()
    operation = client.patch(
        project=project_id,
        region=region,
        resource_policy=schedule_name,
        resource_policy_resource=resource_policy_resource,
    )
    wait_for_extended_operation(operation, "Resource Policy updating")

    return client.get(project=project_id, region=region, resource_policy=schedule_name)

REST

Erstellen Sie eine PATCH-Anfrage an die Methode resourcePolicies, um die Beschreibung, den Zeitplan, die Aufbewahrungsrichtlinie, die Richtlinie zum Löschen des Quelllaufwerks oder die Labels eines Snapshot-Zeitplans zu aktualisieren. Im Anfragetext müssen Sie nur den name und die Felder angeben, die Sie aktualisieren möchten.

  • Ändern Sie die Beschreibung und das Label:

    PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/resourcePolicies/SCHEDULE_NAME
    {
        "name": "SCHEDULE_NAME",
        "description": "DESCRIPTION",
        "snapshotProperties": {
            "labels": {"KEY": "VALUE"}
        }
    }
    
  • Ändern Sie den Snapshot-Zeitplan in Stündlich:

    PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/resourcePolicies/SCHEDULE_NAME
    {
        "name": "SCHEDULE_NAME",
        "snapshotSchedulePolicy": {
            "schedule": {
              "hourlySchedule": {
                  "hoursInCycle": HOURLY_INTERVAL,
                  "startTime": START_TIME
               }
            }
        }
    }
    
  • Ändern Sie den Snapshot-Zeitplan in Täglich:

    PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/resourcePolicies/SCHEDULE_NAME
    {
        "name": "SCHEDULE_NAME",
        "snapshotSchedulePolicy": {
            "schedule": {
              "dailySchedule": {
                  "daysInCycle": DAILY_INTERVAL,
                  "startTime": START_TIME
               }
            }
        }
    }
    
  • Ändern Sie den Snapshot-Zeitplan in Wöchentlich:

    PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/resourcePolicies/SCHEDULE_NAME
    {
        "name": "SCHEDULE_NAME",
        "snapshotSchedulePolicy": {
            "schedule": {
               "weeklySchedule": {
                  "dayOfWeeks": [
                     {
                        "day": WEEKLY_INTERVAL,
                        "startTime": START_TIME
                     }
                  ]
               }
            }
        }
    }
    
  • Ändern Sie die Aufbewahrungsrichtlinie des Snapshots:

    PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/resourcePolicies/SCHEDULE_NAME
    {
        "name": "SCHEDULE_NAME",
        "snapshotSchedulePolicy": {
            "retentionPolicy": {
                "maxRetentionDays": DAYS,
                "onSourceDiskDelete":"DELETE_OPTION"
            }
       }
    }
    

Ersetzen Sie dabei Folgendes:

  • PROJECT_ID ist der Projektname
  • REGION ist die Region, in der sich der Snapshot-Zeitplan befindet.
  • SCHEDULE_NAME ist der Name des Snapshot-Zeitplans
  • DESCRIPTION ist eine Beschreibung des Snapshot-Zeitplans Setzen Sie die Beschreibung in Anführungszeichen.
  • KEY und VALUE ist ein Schlüssel/Wert-Paar, mit dem verwandte oder verknüpfte Ressourcen gruppiert werden können.
  • HOURLY_INTERVAL definiert das Intervall, in dem die Snapshots generiert werden sollen. Legen Sie den stündlichen Zeitplan mit einer Ganzzahl zwischen 1und 23 fest. Damit die Snapshots jeden Tag zur selben Zeit erstellt werden, wählen Sie eine Zahl aus, die gleichmäßig in 24 geteilt wird (1, 2, 3, 4, 6, 8 oder 12). Beispiel: Wenn Sie --hourly-schedule auf 12 setzen, bedeutet das, dass der Snapshot alle 12 Stunden generiert wird.
  • DAILY_INTERVAL definiert die Anzahl der Tage zwischen jedem Snapshot. Verwenden Sie den Wert 1, um jeden Tag einen Snapshot zu erstellen.
  • WEEKLY_INTERVAL definiert einen Zeitplan, der an bestimmten Wochentagen ausgeführt wird. Geben Sie einen oder mehrere Tage an. Folgende Optionen sind verfügbar: MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY und SUNDAY. Wochentage werden ausgeschrieben; die Groß-/Kleinschreibung wird nicht berücksichtigt. Sie können bis zu sieben Intervalle für dayOfWeeks definieren, eines für jeden Wochentag.
  • START_TIME ist die Startzeit für UTC. Sie müssen die Uhrzeit als volle Stunde angeben. Beispiel:
    • 14:00 Uhr PST ist 22:00 UTC.
    • Wenn Sie als Startzeit 22:13 festlegen, erhalten Sie eine Fehlermeldung.
  • DAYS: Maximale Anzahl von Tagen für die Aufbewahrung eines Snapshots, bevor er gelöscht wird.
  • DELETE_OPTION: Aufbewahrungsverhalten für automatische Snapshots nach dem Löschen des ursprünglichen Laufwerks. Der Wert muss einer der folgenden sein:
    • APPLY_RETENTION_POLICY: Wenn das Quelllaufwerk gelöscht wird, gilt das Aufbewahrungsfenster für alle vom Snapshot-Zeitplan erstellten Snapshots weiterhin.
    • KEEP_AUTO_SNAPSHOTS (Standardeinstellung): Wenn das Quelllaufwerk gelöscht wird, werden alle vom Snapshot-Zeitplan erstellten Snapshots unabhängig vom Aufbewahrungsfenster beibehalten.

Snapshot-Zeitplan ersetzen

Führen Sie die folgenden Schritte aus, um den Snapshot-Zeitplan zu löschen und einen neuen zu erstellen. Verwenden Sie diese Methode, um Attribute von Snapshot-Zeitplänen zu ändern, die nicht mithilfe des Verfahrens unter Snapshot-Zeitplan aktualisieren geändert werden können.

Wenn Sie einen Snapshot-Zeitplan ersetzen, der bereits mit einem Laufwerk verknüpft ist, müssen Sie ihn zuerst vom Laufwerk trennen und löschen. Daraufhin können Sie einen neuen Zeitplan erstellen und mit dem Laufwerk verknüpfen.

Alle aus dem getrennten Snapshot-Zeitplan generierten Snapshots werden nicht von der neuen Richtlinie verwaltet. Diese Snapshots werden auf unbestimmte Zeit aufbewahrt, bis Sie sie löschen.

Verwenden Sie die Google Cloud Console, die gcloud CLI oder REST, um den Snapshot-Zeitplan zu entfernen und zu ersetzen.

Console

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

    Zur Seite "Laufwerke"

  2. Wählen Sie das Laufwerk mit dem Zeitplan aus, den Sie trennen möchten.
  3. Klicken Sie auf der Seite Laufwerk verwalten auf Bearbeiten. Möglicherweise müssen Sie zuerst auf das Menü Weitere Aktionen klicken.
  4. Öffnen Sie das Drop-down-Menü Snapshot-Zeitplan.
  5. Klicken Sie auf Kein Zeitplan vorhanden, um den Zeitplan vom Laufwerk zu trennen.
  6. Sie können einen neuen Zeitplan erstellen oder den Zeitplan austauschen, wenn Sie die Laufwerksoptionen bearbeiten.
  7. Klicken Sie auf Speichern, um die Aufgabe abzuschließen.

gcloud

  1. Verwenden Sie den -Befehl gcloud disks remove-resource-policies, um den Snapshot-Zeitplan von dem Laufwerk mit dem Zeitplan zu trennen, den Sie ändern möchten.

    gcloud compute disks remove-resource-policies DISK_NAME \
        --resource-policies SCHEDULE_NAME \
        --region REGION \
        --zone ZONE
    

    Ersetzen Sie dabei Folgendes:

    • DISK_NAME: Name des Laufwerks, mit dem der Snapshot-Zeitplan verknüpft ist
    • SCHEDULE_NAME: der Name des Snapshot-Zeitplans, den Sie von diesem Laufwerk trennen möchten
    • REGION ist die Region, in der sich der Snapshot-Zeitplan befindet
    • ZONE ist die Zone, in der sich das zonale Laufwerk befindet.
  2. Verwenden Sie den Befehl gcloud disks add-resource-policies, um dem Laufwerk den neuen Snapshot-Zeitplan hinzuzufügen.

    gcloud compute disks add-resource-policies DISK_NAME \
         --resource-policies SCHEDULE_NAME \
         --zone ZONE
    

    Ersetzen Sie dabei Folgendes:

    • DISK_NAME: der Name des Laufwerks mit der Ressourcenrichtlinie für den Snapshot-Zeitplan
    • SCHEDULE_NAME: der Name des Snapshot-Zeitplans, den Sie diesem Laufwerk hinzufügen möchten
    • ZONE ist die Zone, in der sich das Laufwerk befindet.

REST

  1. Trennen Sie den aktuellen Snapshot-Zeitplan von einem Laufwerk, indem Sie eine POST-Anfrage an disks.removeResourcePolicies erstellen.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/disks/DISK_NAME/removeResourcePolicies
    
    {
      "resourcePolicies": [
         "regions/REGION/resourcePolicies/SCHEDULE_NAME"
      ]
    }
    

    Ersetzen Sie dabei Folgendes:

    • PROJECT_ID: der Projektname
    • ZONE: die Zone, in der sich das Laufwerk befindet
    • DISK_NAME: der Name des Laufwerks mit dem zugehörigen Snapshot-Zeitplan
    • REGION: der Speicherort des Snapshot-Zeitplans
    • SCHEDULE_NAME ist der Name des Snapshot-Zeitplans, den Sie von diesem Laufwerk entfernen
  2. Hängen Sie den neuen Snapshot-Zeitplan an das Laufwerk an. Erstellen Sie dazu eine POST-Anfrage an die Methode disks.addResourcePolicies.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/disks/DISK_NAME/addResourcePolicies
    
    {
      "resourcePolicies": [
        "regions/REGION/resourcePolicies/SCHEDULE_NAME"
      ]
    }
    

    Ersetzen Sie dabei Folgendes:

    • PROJECT_ID: der Projektname
    • ZONE: der Speicherort des Laufwerks
    • DISK_NAME: Name des Laufwerks
    • REGION: der Speicherort des Snapshot-Zeitplans
    • SCHEDULE_NAME: der Name des Snapshot-Zeitplans, den Sie auf dieses Laufwerk anwenden

Snapshot-Zeitplan löschen

Wenn Sie einen Snapshot-Zeitplan löschen, werden alle automatisch generierten Snapshots, die mit dem Snapshot-Zeitplan verknüpft sind, dauerhaft beibehalten. Gelöschte Zeitpläne können jedoch keine Snapshots mehr generieren.

Die Aufbewahrungsrichtlinie ist Teil des Snapshot-Zeitplans. Nachdem der Zeitplan gelöscht wurde, ist die Aufbewahrungsrichtlinie nicht mehr gültig. Bereits generierte Snapshots werden dauerhaft beibehalten, können jedoch manuell gelöscht werden.

Verwenden Sie zum Löschen eines vorhandenen Snapshot-Zeitplans die Google Cloud Console, die Google Cloud CLI oder die Compute Engine API. Wenn Sie einen Zeitplan löschen möchten, der bereits mit einem Laufwerk verknüpft ist, trennen Sie den Zeitplan zuerst vom Laufwerk, bevor Sie ihn löschen. Mit einem Laufwerk verknüpfte Snapshot-Zeitpläne können nicht gelöscht werden.

Console

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

    Zur Seite "Snapshots"

  2. Wählen Sie Snapshot-Zeitpläne aus, um eine Liste Ihrer Zeitpläne aufzurufen.
  3. Wählen Sie einen Zeitplan aus, der mit keinem Laufwerk verknüpft ist.
  4. Klicken Sie auf Löschen.

gcloud

Verwenden Sie den Befehl resource-policies delete, um einen bestimmten Snapshot-Zeitplan zu löschen.

gcloud compute resource-policies delete SCHEDULE_NAME \
    --region REGION

Ersetzen Sie dabei Folgendes:

  • SCHEDULE_NAME: der Name des Snapshot-Zeitplans
  • REGION: der Speicherort des Snapshot-Zeitplans

Go

import (
	"context"
	"fmt"
	"io"

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

// deleteSnapshotSchedule deletes a snapshot schedule.
func deleteSnapshotSchedule(w io.Writer, projectID, scheduleName, region string) error {
	// projectID := "your_project_id"
	// snapshotName := "your_snapshot_name"
	// region := "eupore-central2"

	ctx := context.Background()

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

	req := &computepb.DeleteResourcePolicyRequest{
		Project:        projectID,
		Region:         region,
		ResourcePolicy: scheduleName,
	}
	op, err := snapshotsClient.Delete(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to delete snapshot schedule: %w", err)
	}

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

	fmt.Fprint(w, "Snapshot schedule deleted\n")

	return nil
}

Java

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

public class DeleteSnapshotSchedule {
  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 region where your snapshot schedule is located.
    String region = "us-central1";
    // Name of the snapshot schedule you want to delete.
    String snapshotScheduleName = "YOUR_SCHEDULE_NAME";

    deleteSnapshotSchedule(projectId, region, snapshotScheduleName);
  }

  // Deletes a snapshot schedule policy.
  public static Status deleteSnapshotSchedule(
          String projectId, String region, String snapshotScheduleName)
          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.
    try (ResourcePoliciesClient resourcePoliciesClient = ResourcePoliciesClient.create()) {
      DeleteResourcePolicyRequest request = DeleteResourcePolicyRequest.newBuilder()
              .setProject(projectId)
              .setRegion(region)
              .setResourcePolicy(snapshotScheduleName)
              .build();
      Operation response = resourcePoliciesClient.deleteAsync(request).get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        throw new Error("Snapshot schedule deletion failed! " + response.getError());
      }
      return response.getStatus();
    }
  }
}

Node.js

// Import the Compute library
const computeLib = require('@google-cloud/compute');

// Instantiate a resourcePoliciesClient
const resourcePoliciesClient = new computeLib.ResourcePoliciesClient();
// Instantiate a regionOperationsClient
const regionOperationsClient = new computeLib.RegionOperationsClient();

/**
 * TODO(developer): Update/uncomment these variables before running the sample.
 */
// The project name.
const projectId = await resourcePoliciesClient.getProjectId();

// The location of the snapshot schedule resource policy.
// region = 'us-central1';

// The name of the snapshot schedule.
// snapshotScheduleName = 'snapshot-schedule-name'

async function callDeleteSnapshotSchedule() {
  // If the snapshot schedule is already attached to a disk, you will receive an error.
  const [response] = await resourcePoliciesClient.delete({
    project: projectId,
    region,
    resourcePolicy: snapshotScheduleName,
  });

  let operation = response.latestResponse;

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

  console.log(`Snapshot schedule: ${snapshotScheduleName} deleted.`);
}

await callDeleteSnapshotSchedule();

Python

from __future__ import annotations

import sys
from typing import Any

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


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

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

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

    Returns:
        Whatever the operation.result() returns.

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

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

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

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

    return result


def snapshot_schedule_delete(
    project_id: str, region: str, snapshot_schedule_name: str
) -> None:
    """
    Deletes a snapshot schedule for a specified project and region.
    Args:
        project_id (str): The ID of the Google Cloud project.
        region (str): The region where the snapshot schedule is located.
        snapshot_schedule_name (str): The name of the snapshot schedule to delete.
    Returns:
        None
    """
    client = compute_v1.ResourcePoliciesClient()
    operation = client.delete(
        project=project_id, region=region, resource_policy=snapshot_schedule_name
    )
    wait_for_extended_operation(operation, "Resource Policy deletion")

REST

Senden Sie eine DELETE-Anfrage an die Methode resourcePolicies.delete, um einen Snapshot-Zeitplan zu löschen. Wenn der Snapshot-Zeitplan bereits mit einem Laufwerk verknüpft ist, wird eine Fehlermeldung angezeigt.

DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/resourcePolicies/SCHEDULE_NAME

Ersetzen Sie dabei Folgendes:

  • PROJECT_ID: der Projektname
  • REGION: der Speicherort des Snapshot-Zeitplans
  • SCHEDULE_NAME: der Name des Snapshot-Zeitplans

Logging und Monitoring

Jeder Snapshot, der mit einem Laufwerk verknüpft ist, erstellt kontinuierlich ein Systemereignis, das jederzeit überwacht und geloggt wird. Audit-Logs zu Systemereignissen sind immer aktiviert.

Diese Logs bieten Verhaltensinformationen zu Ihren geplanten Snapshots für jedes verknüpfte Laufwerk. Sie können Ihre Logs über das Logging-Menü in der Google Cloud Console aufrufen.

Weitere Informationen zur Verwendung des Log-Explorers finden Sie unter Logs mit dem Log-Explorer ansehen.

Console

  1. Rufen Sie in der Google Cloud Console die Seite Logs-Explorer auf.

    Zur Seite „Log-Explorer“

  2. Zeigen Sie in der Drop-down-Liste Alle Ressourcen auf Laufwerk und wählen Sie Alle disk_id aus.

  3. Wählen Sie in der Drop-down-Liste Alle Logs den Wert cloudaudit.googleapis.com/system_event aus und klicken Sie auf OK.

  4. Wählen Sie in der Drop-down-Liste Any log level (Alle Logebenen) den Logtyp aus.

Nächste Schritte