Administrar programas de instantáneas para discos


Este documento describe cómo administrar programas de instantáneas para su disco persistente zonal y regional y Google Cloud Hyperdisk .

Puede administrar programaciones de instantáneas de la siguiente manera:

  • Ver horarios de instantáneas
  • Cambiar horarios de instantáneas
  • Eliminar programas de instantáneas

También puede configurar alertas para instantáneas programadas .

Antes de comenzar

Roles y permisos necesarios

Para obtener los permisos que necesita para crear una programación de instantáneas, solicite a su administrador que le otorgue los siguientes roles de IAM en el proyecto:

Para obtener más información sobre cómo otorgar roles, consulte Administrar el acceso a proyectos, carpetas y organizaciones .

Estos roles predefinidos contienen los permisos necesarios para crear una programación de instantáneas. Para ver los permisos exactos que se requieren, expanda la sección Permisos requeridos :

Permisos requeridos

Se requieren los siguientes permisos para crear una programación de instantáneas:

  • Para ver programas de instantáneas: compute.resourcePolicies.list en el proyecto u organización.
  • Para actualizar una programación de instantáneas:
    • compute.resourcePolicies.update en la política de recursos.
    • compute.resourcePolicies.get en la política de recursos
  • Para reemplazar una programación de instantáneas:
    • compute.resourcePolicies.use en la política de recursos.
    • compute.disks.addResourcePolicies en el disco
    • compute.disks.removeResourcePolicies en el disco
  • Para eliminar una programación de instantáneas:
    • compute.resourcePolicies.delete en la política de recursos.
    • compute.disks.removeResourcePolicies en el disco

Es posible que también pueda obtener estos permisos con roles personalizados u otros roles predefinidos .

Ver horarios de instantáneas

Para obtener una lista de programaciones de instantáneas, usa la consola, el comando gcloud o el método API de Compute Engine. Esta solicitud muestra el nombre, la descripción y la región de todas las programaciones de instantáneas dentro de un proyecto.

Consola

  1. En la consola de Google Cloud, vaya a la página Instantáneas .

    Ir a la página de instantáneas

  2. Seleccione la pestaña Programaciones de instantáneas .
  3. Utilice el campo de filtro para limitar la lista de programaciones de instantáneas.
  4. Haga clic en el nombre de un programa de instantáneas para ver sus detalles.

nube de gcloud

Para ver una lista de sus programaciones de instantáneas, use el comando resource-policies list .

 gcloud compute resource-policies list

Para ver la descripción de una programación de instantáneas específica, utilice el comando resource-policies describe .

gcloud compute resource-policies describe SCHEDULE_NAME

Reemplace SCHEDULE_NAME con el nombre de la programación de instantáneas.

Ir

Listar programas de instantáneas

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
}

Describir un cronograma instantáneo

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

Listar programas de instantáneas

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;
    }
  }
}

Describir una instantánea de los horarios

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;
    }
  }
}

Nodo.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();

Pitón

Listar programas de instantáneas

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

Describir un cronograma instantáneo

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

DESCANSAR

Realice una solicitud GET a resourcePolicies.aggregatedList para devolver una lista de los cronogramas de instantáneas de un proyecto.

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

Reemplace PROJECT_ID con el nombre del proyecto.

Ver programas de instantáneas por región

Para ver los cronogramas de instantáneas de un proyecto dentro de una región en particular, use la consola de Google Cloud, la CLI de gcloud o REST.

Consola

  1. En la consola de Google Cloud, vaya a la página Instantáneas .

    Ir a la página de instantáneas

  2. Seleccione la pestaña Programaciones de instantáneas .
  3. Utilice el campo de filtro para enumerar las programaciones de instantáneas para una región específica.

nube de gcloud

Para ver los cronogramas de instantáneas de un proyecto dentro de una región específica, use el comando resource-policies list .

gcloud compute resource-policies list PROJECT_ID --filter REGION

Reemplace lo siguiente:

  • PROJECT_ID : el nombre del proyecto
  • REGION : la región, por ejemplo us-west1

DESCANSAR

Realice una solicitud GET al método resourcePolicies.list para recuperar las programaciones de instantáneas creadas en una región.

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

Reemplace lo siguiente:

  • PROJECT_ID : el nombre del proyecto
  • REGION : la región, por ejemplo us-west1

Cambiar una programación de instantáneas

Después de crear una programación de instantáneas, puede modificar los siguientes campos dinámicamente mediante el procedimiento Actualizar una programación de instantáneas :

  • Descripción
  • Calendario de instantáneas
  • Etiquetas aplicadas a las instantáneas generadas.
  • Política de eliminación del disco de origen para manejar instantáneas generadas automáticamente si se elimina el disco de origen
  • Política de retención para definir durante cuánto tiempo se conservarán las instantáneas generadas a partir de la programación de instantáneas.

Para actualizar otros valores para una programación de instantáneas, debe eliminar la programación de instantáneas y crear una nueva, como se describe en Reemplazar una programación de instantáneas .

Las actualizaciones de la programación de instantáneas entran en vigor en la primera instantánea después de las actualizaciones. Si se ejecuta una instantánea mientras actualiza la programación de instantáneas, los cambios surtirán efecto en la siguiente instantánea.

Actualizar una programación de instantáneas

Puedes usar la CLI de Google Cloud o la API de Compute Engine para cambiar algunas de las propiedades de tu programación de instantáneas, como se describe en Cambiar una programación de instantáneas .

Para cambiar otras propiedades de su programación de instantáneas, utilice el método descrito en Reemplazar una programación de instantáneas .

Consola

  1. En la consola de Google Cloud, vaya a la página Instantáneas .

    Ir a la página de instantáneas

  2. Seleccione Horarios instantáneos para ver una lista de sus horarios.
  3. Haga clic en el nombre de la programación de instantáneas que desea modificar.
  4. En la página de detalles del programa de instantáneas, haga clic en el botón Editar programa .

nube de gcloud

Utilice el comando compute resource-policies update para actualizar la descripción, la programación, la política de retención o las etiquetas de una programación de instantáneas.

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

Reemplace lo siguiente:

  • SCHEDULE_NAME : el nombre de la programación de instantáneas.
  • REGION : la región donde reside su programación de instantáneas.
  • DESCRIPTION : una descripción del programa de instantáneas. Utilice comillas alrededor de su descripción.
  • KEY y VALUE : un par clave-valor que se puede utilizar para agrupar recursos relacionados o asociados .
  • DAYS : Número máximo de días que se conserva la instantánea antes de eliminarla.
  • DELETE_OPTION : comportamiento de retención de instantáneas automáticas después de eliminar el disco original. El valor debe ser uno de:
    • apply-retention-policy : cuando se elimina el disco de origen, continúa aplicando la ventana de retención para cualquier instantánea creada mediante la programación de instantáneas.
    • keep-auto-snapshots : (predeterminado) si se elimina el disco de origen, conserve las instantáneas creadas mediante la programación de instantáneas, independientemente de la ventana de retención.
  • START_TIME : la hora de inicio UTC. El tiempo debe comenzar en punto. Por ejemplo:
    • Las 2:00 p.m. PST son 22:00 .
    • Si establece una hora de inicio de 22:13 , recibirá un error.
  • SCHEDULE_FLAG : una de las siguientes banderas:

    • --hourly-schedule= HOURLY_INTERVAL : el número de horas entre cada instantánea. HOURLY_INTERVAL debe ser un número entero entre 1 y 23 . Por ejemplo, configurar --hourly-schedule en 12 significa que la instantánea se genera cada 12 horas.
    • --daily-schedule : realiza una instantánea diariamente, a las START_TIME
    • --weekly-schedule= WEEKLY_INTERVAL : define el día en el que desea que se realice la instantánea. Debes deletrear el día de la semana; los valores no distinguen entre mayúsculas y minúsculas.

    • --weekly-schedule-from-file= FILE_NAME : especifica un archivo que contiene la programación de instantáneas semanal. Puede especificar programaciones semanales en diferentes días de la semana y en diferentes momentos utilizando un archivo. Por ejemplo, su archivo podría especificar una programación de instantáneas los lunes y miércoles: none [{"day": "MONDAY", "startTime": "04:00"}, {"day": "WEDNESDAY", "startTime": "02:00"}] Si incluye una hora de inicio en su archivo, no necesita configurar la marca --start-time . El horario utiliza la zona horaria UTC. El tiempo debe comenzar en punto. Por ejemplo:

      • Las 2:00 p.m. PST son 22:00 .
      • Si establece una hora de inicio de 22:13 , recibirá un error.

    Los indicadores de frecuencia de instantáneas hourly-schedule , daily-schedule , weekly-schedule y weekly-schedule-from-file son mutuamente excluyentes. Puede utilizar solo uno para su programación de instantáneas.

Ejemplos:

Para cambiar una programación de instantáneas a una programación diaria:

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

Para cambiar una instantánea a un horario por horas y también actualizar la descripción y la etiqueta de la instantánea:

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"

Para cambiar las políticas de retención de instantáneas y eliminación del disco de origen para una programación de instantáneas:

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

Ir

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();
    }
  }
}

Nodo.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();

Pitón

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)

DESCANSAR

Cree una solicitud PATCH para el método resourcePolicies para actualizar la descripción, la programación, la política de retención, la política de eliminación del disco de origen o las etiquetas de una programación de instantáneas. En el cuerpo de la solicitud, solo necesita especificar el name y los campos que desea actualizar.

  • Cambiar la descripción y la etiqueta:

    PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/resourcePolicies/SCHEDULE_NAME
    {
        "name": "SCHEDULE_NAME",
        "description": "DESCRIPTION",
        "snapshotProperties": {
            "labels": {"KEY": "VALUE"}
        }
    }
    
  • Cambie el cronograma de instantáneas a cada hora:

    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
               }
            }
        }
    }
    
  • Cambie el programa de instantáneas a diario:

    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
               }
            }
        }
    }
    
  • Cambie el programa de instantáneas a semanal:

    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
                     }
                  ]
               }
            }
        }
    }
    
  • Cambie la política de retención de instantáneas:

    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"
            }
       }
    }
    

Reemplace lo siguiente:

  • PROJECT_ID : el nombre del proyecto.
  • REGION : la región donde se encuentra el programa de instantáneas.
  • SCHEDULE_NAME : el nombre de la programación de instantáneas.
  • DESCRIPTION : una descripción del programa de instantáneas. Utilice comillas alrededor de su descripción.
  • KEY y VALUE : un par clave-valor que se puede utilizar para agrupar recursos relacionados o asociados .
  • HOURLY_INTERVAL : define el intervalo en el que desea que se realicen las instantáneas. Establezca el horario horario utilizando un número entero entre 1 y 23 . Para crear las instantáneas a la misma hora todos los días, elija un número que se divida uniformemente entre 24 (1, 2, 3, 4, 6, 8 o 12). Por ejemplo, configurar --hourly-schedule en 12 significa que la instantánea se genera cada 12 horas.
  • DAILY_INTERVAL : define el número de días entre cada instantánea. Para crear una instantánea todos los días, utilice el valor 1 .
  • WEEKLY_INTERVAL : define una programación que se ejecuta en días específicos de la semana. Especifique uno o más días. Están disponibles las siguientes opciones: MONDAY , TUESDAY , WEDNESDAY , THURSDAY , FRIDAY , SATURDAY y SUNDAY . Debes deletrear los días de la semana; no distinguen entre mayúsculas y minúsculas. Puede definir hasta 7 intervalos para dayOfWeeks , uno para cada día de la semana.
  • START_TIME : la hora de inicio UTC. El tiempo debe comenzar en punto. Por ejemplo:
    • Las 2:00 p.m. PST son 22:00 UTC.
    • Si establece una hora de inicio de 22:13 , recibirá un error.
  • DAYS : Número máximo de días que se conserva la instantánea antes de eliminarla.
  • DELETE_OPTION : comportamiento de retención de instantáneas automáticas después de eliminar el disco original. El valor debe ser uno de:
    • APPLY_RETENTION_POLICY : cuando se elimina el disco de origen, continúa aplicando la ventana de retención para cualquier instantánea creada mediante la programación de instantáneas.
    • KEEP_AUTO_SNAPSHOTS : (Predeterminado) Si se elimina el disco de origen, conserve las instantáneas creadas mediante la programación de instantáneas, independientemente de la ventana de retención.

Reemplazar una programación de instantáneas

Siga estos pasos para eliminar la programación de instantáneas y crear una nueva. Utilice este método para modificar las propiedades de la programación de instantáneas que no se pueden cambiar mediante el procedimiento de actualización de una programación de instantáneas .

Si está reemplazando una programación de instantáneas que ya está adjunta a un disco, primero debe desconectar la programación del disco y eliminarla. Luego puede crear una nueva programación y adjuntarla al disco.

La nueva política no administrará las instantáneas que se generen a partir de la programación de instantáneas separadas. Esas instantáneas se conservarán indefinidamente hasta que las elimine.

Usa la consola de Google Cloud, la CLI de gcloud o REST para eliminar y reemplazar tu programación de instantáneas.

Consola

  1. En la consola de Google Cloud, vaya a la página Discos .

    Ir a la página de Discos

  2. Seleccione el disco que tiene el programa que desea desconectar.
  3. En la página Administrar disco , haga clic en Editar . Es posible que primero tengas que hacer clic en el menú Más acciones .
  4. Abra el menú desplegable Programación de instantáneas .
  5. Haga clic en Sin programación para desconectar la programación del disco.
  6. Puede crear una nueva programación o cambiar la programación mientras edita las opciones del disco.
  7. Haga clic en Guardar para completar la tarea.

nube de gcloud

  1. Usa el comando gcloud disks remove-resource-policies para desconectar la programación de instantáneas del disco con la programación que deseas cambiar.

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

    Reemplace lo siguiente:

    • DISK_NAME : el nombre del disco con la programación de instantáneas adjunta
    • SCHEDULE_NAME : el nombre de la programación de instantáneas que desea desconectar de este disco
    • REGION : la región donde reside su programación de instantáneas
    • ZONE : la zona donde reside su disco zonal
  2. Usa el comando gcloud disks add-resource-policies para agregar la nueva programación de instantáneas al disco.

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

    Reemplace lo siguiente:

    • DISK_NAME : el nombre del disco con la política de recursos de programación de instantáneas
    • SCHEDULE_NAME : el nombre de la programación de instantáneas que desea agregar a este disco
    • ZONE : la zona donde reside su disco

DESCANSAR

  1. Separe la programación de instantáneas actual de un disco mediante la creación de una solicitud POST a disks.removeResourcePolicies .

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

    Reemplace lo siguiente:

    • PROJECT_ID : el nombre del proyecto
    • ZONE : la zona donde reside el disco
    • DISK_NAME : el nombre del disco con la programación de instantáneas asociada
    • REGION : la ubicación del programa de instantáneas
    • SCHEDULE_NAME : el nombre de la programación de instantáneas que estás eliminando de este disco.
  2. Adjunte la nueva programación de instantáneas al disco mediante la creación de una solicitud POST al método disks.addResourcePolicies .

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

    Reemplace lo siguiente:

    • PROJECT_ID : el nombre del proyecto
    • ZONE : la ubicación del disco.
    • DISK_NAME : el nombre del disco
    • REGION : la ubicación del programa de instantáneas
    • SCHEDULE_NAME : el nombre de la programación de instantáneas que está aplicando a este disco

Eliminar una programación de instantáneas

Si elimina una programación de instantáneas, todas las instantáneas generadas automáticamente asociadas con la programación de instantáneas se conservan permanentemente. Sin embargo, una vez eliminada la programación, ya no podrá generar instantáneas.

Su política de retención es parte de su cronograma de instantáneas. Una vez eliminada la programación, su política de retención ya no se aplica. Las instantáneas que ya se han generado se conservan permanentemente hasta que las elimine manualmente.

Para eliminar una programación de instantáneas existente, use la consola de Google Cloud, la CLI de Google Cloud o el método API de Compute Engine. Si la programación ya está adjunta a un disco, primero desconecte la programación del disco y luego elimínela. No puede eliminar una programación de instantáneas adjunta a un disco.

Consola

  1. En la consola de Google Cloud, vaya a la página Instantáneas .

    Ir a la página de instantáneas

  2. Seleccione Horarios instantáneos para ver una lista de sus horarios.
  3. Seleccione cualquier programación no asociada con un disco.
  4. Haga clic en Eliminar .

nube de gcloud

Para eliminar una programación de instantáneas, utilice el comando resource-policies delete .

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

Reemplace lo siguiente:

  • SCHEDULE_NAME : el nombre de la programación de instantáneas
  • REGION : la ubicación del programa de instantáneas

Ir

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();
    }
  }
}

Nodo.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();

Pitón

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")

DESCANSAR

Para eliminar una programación de instantáneas, realice una solicitud DELETE al método resourcePolicies.delete . Si la programación de instantáneas ya está adjunta a un disco, recibirá un error.

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

Reemplace lo siguiente:

  • PROJECT_ID : el nombre del proyecto
  • REGION : la ubicación del programa de instantáneas
  • SCHEDULE_NAME : el nombre de la programación de instantáneas

Registro y monitoreo

Cada instantánea programada asociada con un disco crea continuamente un evento del sistema , que se monitorea y registra en todo momento. Los registros de auditoría de eventos del sistema siempre están habilitados.

Estos registros proporcionan información de comportamiento sobre las instantáneas programadas para cada disco asociado. Puede ver sus registros desde el menú Registro en la consola de Google Cloud.

Para obtener más información sobre el uso del Explorador de registros, consulte Ver registros mediante el Explorador de registros .

Consola

  1. En la consola de Google Cloud, vaya a la página Explorador de registros .

    Vaya a la página del Explorador de registros

  2. En la lista desplegable Todos los recursos , seleccione Disco y seleccione Todos disk_id .

  3. En la lista desplegable Todos los registros , seleccione cloudaudit.googleapis.com/system_event y haga clic en Aceptar .

  4. En la lista desplegable Cualquier nivel de registro , seleccione el tipo de registro.

¿Qué sigue?