Gerenciar agendamentos de snapshots para discos


Este documento descreve como gerenciar programações de snapshots para seu disco permanente zonal e regional e o hiperdisco do Google Cloud .

Você pode gerenciar programações de snapshots da seguinte maneira:

  • Ver programações de instantâneos
  • Alterar programações de snapshots
  • Excluir programações de snapshots

Você também pode configurar alertas para snapshots agendados .

Antes de começar

Funções e permissões necessárias

Para obter as permissões necessárias para criar uma programação de snapshot, peça ao administrador para conceder a você as seguintes funções do IAM no projeto:

Para obter mais informações sobre a concessão de funções, consulte Gerenciar acesso a projetos, pastas e organizações .

Essas funções predefinidas contêm as permissões necessárias para criar uma programação de snapshot. Para ver as permissões exatas necessárias, expanda a seção Permissões necessárias :

Permissões necessárias

As seguintes permissões são necessárias para criar uma programação de snapshot:

  • Para visualizar programações de snapshots: compute.resourcePolicies.list no projeto ou organização
  • Para atualizar uma programação de snapshot:
    • compute.resourcePolicies.update na política de recursos
    • compute.resourcePolicies.get na política de recursos
  • Para substituir uma programação de snapshot:
    • compute.resourcePolicies.use na política de recursos
    • compute.disks.addResourcePolicies no disco
    • compute.disks.removeResourcePolicies no disco
  • Para excluir uma programação de snapshot:
    • compute.resourcePolicies.delete na política de recursos
    • compute.disks.removeResourcePolicies no disco

Você também poderá obter essas permissões com funções personalizadas ou outras funções predefinidas .

Ver programações de instantâneos

Para ver uma lista de programações de snapshots, use o console, o comando gcloud ou o método da API Compute Engine. Essa solicitação exibe o nome, a descrição e a região de todos os agendamentos de snapshots em um projeto.

Console

  1. No console do Google Cloud, acesse a página Instantâneos .

    Vá para a página Instantâneos

  2. Selecione a guia Programações de instantâneos .
  3. Use o campo Filtro para restringir a lista de planejamentos de snapshots.
  4. Clique no nome de uma programação de snapshot para ver seus detalhes.

gcloud

Para ver uma lista de seus agendamentos de snapshots, use o comando resource-policies list .

 gcloud compute resource-policies list

Para ver a descrição de um planejamento de captura instantânea específico, use o comando resource-policies describe .

gcloud compute resource-policies describe SCHEDULE_NAME

Substitua SCHEDULE_NAME pelo nome da programação do snapshot.

Ir

Listar programações de snapshots

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
}

Descrever uma programação de snapshot

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 programações de snapshots

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

Descrever uma programação de snapshot

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

Pitão

Listar programações de snapshots

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

Descrever uma programação de snapshot

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

Faça uma solicitação GET para resourcePolicies.aggregatedList para retornar uma lista dos agendamentos de snapshots de um projeto.

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

Substitua PROJECT_ID pelo nome do projeto.

Ver programações de snapshots por região

Para visualizar as programações de snapshots de um projeto em uma região específica, use o console do Google Cloud, a CLI gcloud ou REST.

Console

  1. No console do Google Cloud, acesse a página Instantâneos .

    Vá para a página Instantâneos

  2. Selecione a guia Programações de instantâneos .
  3. Use o campo Filtro para listar programações de snapshots para uma região específica.

gcloud

Para visualizar os cronogramas de snapshots de um projeto em uma região específica, use o comando resource-policies list .

gcloud compute resource-policies list PROJECT_ID --filter REGION

Substitua o seguinte:

  • PROJECT_ID : o nome do projeto
  • REGION : a região, por exemplo us-west1

DESCANSAR

Faça uma solicitação GET para o método resourcePolicies.list para recuperar os agendamentos de snapshots criados em uma região.

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

Substitua o seguinte:

  • PROJECT_ID : o nome do projeto
  • REGION : a região, por exemplo us-west1

Alterar uma programação de snapshot

Depois de criar um planejamento de captura instantânea, será possível modificar os campos a seguir dinamicamente, usando o procedimento Atualizar um agendamento de captura instantânea :

  • Descrição
  • Programação de instantâneo
  • Rótulos aplicados aos instantâneos gerados
  • Política de exclusão do disco de origem para lidar com instantâneos gerados automaticamente se o disco de origem for excluído
  • Política de retenção para definir por quanto tempo manter os snapshots gerados a partir da programação de snapshots

Para atualizar outros valores para um planejamento de captura instantânea, deve-se excluir o planejamento de captura instantânea e criar um novo, conforme descrito em Substituir um planejamento de captura instantânea .

As atualizações de agendamento de snapshot entram em vigor no primeiro snapshot após as atualizações. Se um instantâneo estiver em execução enquanto você atualiza o planejamento de instantâneo, as alterações entrarão em vigor no instantâneo seguinte.

Atualizar uma programação de snapshot

Você pode usar a CLI do Google Cloud ou a API Compute Engine para alterar algumas propriedades da programação de snapshots, conforme descrito em Alterar uma programação de snapshots .

Para alterar outras propriedades do planejamento de captura instantânea, use o método descrito em Substituir uma programação de captura instantânea .

Console

  1. No console do Google Cloud, acesse a página Instantâneos .

    Vá para a página Instantâneos

  2. Selecione Programações de instantâneos para ver uma lista de suas programações.
  3. Clique no nome da programação de captura instantânea que você deseja modificar.
  4. Na página de detalhes do agendamento de snapshot, clique no botão Editar agendamento .

gcloud

Use o comando compute resource-policies update para atualizar a descrição, o planejamento, a política de retenção ou os rótulos de um agendamento de captura instantânea.

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

Substitua o seguinte:

  • SCHEDULE_NAME : o nome da programação do snapshot.
  • REGION : a região onde reside sua programação de snapshot.
  • DESCRIPTION : uma descrição da programação do snapshot. Use aspas em torno de sua descrição.
  • KEY e VALUE : um par chave-valor que pode ser usado para agrupar recursos relacionados ou associados .
  • DAYS : número máximo de dias que o instantâneo é retido antes de ser excluído.
  • DELETE_OPTION : Comportamento de retenção de instantâneos automáticos após a exclusão do disco original. O valor deve ser um dos seguintes:
    • apply-retention-policy : quando o disco de origem for excluído, continue a aplicar a janela de retenção para quaisquer snapshots criados pela programação de snapshots.
    • keep-auto-snapshots : (padrão) se o disco de origem for excluído, mantenha todos os snapshots criados pelo agendamento de snapshot, independentemente da janela de retenção.
  • START_TIME : a hora de início UTC. O tempo deve começar na hora. Por exemplo:
    • 14h PST são 22:00 .
    • Se você definir um horário de início para 22:13 , receberá um erro.
  • SCHEDULE_FLAG : um dos seguintes sinalizadores:

    • --hourly-schedule= HOURLY_INTERVAL : o número de horas entre cada instantâneo. O HOURLY_INTERVAL deve ser um número inteiro entre 1 e 23 . Por exemplo, definir --hourly-schedule como 12 significa que o instantâneo é gerado a cada 12 horas.
    • --daily-schedule : executa um instantâneo diariamente, às START_TIME
    • --weekly-schedule= WEEKLY_INTERVAL : define o dia em que você deseja que o instantâneo ocorra. Você deve especificar o dia da semana; os valores não diferenciam maiúsculas de minúsculas.

    • --weekly-schedule-from-file= FILE_NAME : especifica um arquivo que contém a programação semanal do snapshot. Você pode especificar programações semanais em diferentes dias da semana e em horários diferentes usando um arquivo. Por exemplo, seu arquivo pode especificar uma programação de snapshot para segunda e quarta-feira: none [{"day": "MONDAY", "startTime": "04:00"}, {"day": "WEDNESDAY", "startTime": "02:00"}] Se você incluir uma hora de início em seu arquivo, não será necessário definir o sinalizador --start-time . A programação usa o fuso horário UTC. O tempo deve começar na hora. Por exemplo:

      • 14h PST são 22:00 .
      • Se você definir um horário de início para 22:13 , receberá um erro.

    Os sinalizadores de frequência de snapshot hourly-schedule , daily-schedule , weekly-schedule e weekly-schedule-from-file são mutuamente exclusivos. Você pode usar apenas um para sua programação de snapshot.

Exemplos:

Para alterar uma programação de snapshot para uma programação diária:

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

Para alterar um snapshot para uma programação horária e também atualizar a descrição e o rótulo do snapshot:

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 alterar políticas de retenção de snapshot e exclusão de disco de origem para um agendamento de snapshot:

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

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

Pitão

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

Construa uma solicitação PATCH para o método resourcePolicies para atualizar a descrição, o agendamento, a política de retenção, a política de exclusão do disco de origem ou os rótulos de um agendamento de snapshot. No corpo da solicitação, você só precisa especificar o name e os campos que deseja atualizar.

  • Altere a descrição e o rótulo:

    PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/resourcePolicies/SCHEDULE_NAME
    {
        "name": "SCHEDULE_NAME",
        "description": "DESCRIPTION",
        "snapshotProperties": {
            "labels": {"KEY": "VALUE"}
        }
    }
    
  • Altere a programação do snapshot para de hora em 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
               }
            }
        }
    }
    
  • Altere a programação do snapshot para diariamente:

    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
               }
            }
        }
    }
    
  • Altere a programação do snapshot para 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
                     }
                  ]
               }
            }
        }
    }
    
  • Altere a política de retenção de 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"
            }
       }
    }
    

Substitua o seguinte:

  • PROJECT_ID : o nome do projeto.
  • REGION : a região onde a programação do snapshot está localizada.
  • SCHEDULE_NAME : o nome da programação do snapshot.
  • DESCRIPTION : uma descrição da programação do snapshot. Use aspas em torno de sua descrição.
  • KEY e VALUE : um par chave-valor que pode ser usado para agrupar recursos relacionados ou associados .
  • HOURLY_INTERVAL : define o intervalo em que você deseja que o snapshot ocorra. Defina a programação horária usando um número inteiro entre 1 e 23 . Para que os instantâneos sejam criados no mesmo horário todos os dias, escolha um número que se divida igualmente por 24 (1, 2, 3, 4, 6, 8 ou 12). Por exemplo, definir --hourly-schedule como 12 significa que o instantâneo é gerado a cada 12 horas.
  • DAILY_INTERVAL : define o número de dias entre cada snapshot. Para criar um instantâneo todos os dias, use o valor 1 .
  • WEEKLY_INTERVAL : define uma programação que é executada em dias específicos da semana. Especifique um ou mais dias. As seguintes opções estão disponíveis: MONDAY , TUESDAY WEDNESDAY , THURSDAY FRIDAY , SATURDAY FEIRA, SÁBADO e SUNDAY . Você deve especificar os dias da semana; eles não diferenciam maiúsculas de minúsculas. Você pode definir até 7 intervalos para dayOfWeeks , um para cada dia da semana.
  • START_TIME : a hora de início UTC. O tempo deve começar na hora. Por exemplo:
    • 14:00 PST são 22:00 UTC.
    • Se você definir um horário de início para 22:13 , receberá um erro.
  • DAYS : número máximo de dias que o instantâneo é retido antes de ser excluído.
  • DELETE_OPTION : Comportamento de retenção de instantâneos automáticos após a exclusão do disco original. O valor deve ser um dos seguintes:
    • APPLY_RETENTION_POLICY : quando o disco de origem for excluído, continue a aplicar a janela de retenção para quaisquer snapshots criados pela programação de snapshots.
    • KEEP_AUTO_SNAPSHOTS : (Padrão) Se o disco de origem for excluído, mantenha todos os instantâneos criados pelo agendamento de instantâneos, independentemente da janela de retenção.

Substituir uma programação de snapshot

Siga estas etapas para excluir a programação de snapshot e criar uma nova. Use este método para modificar propriedades de agendamento de captura instantânea que não podem ser alteradas usando o procedimento atualizar um agendamento de captura instantânea .

Se você estiver substituindo um planejamento de snapshot que já está anexado a um disco, primeiro será necessário desanexar o planejamento do disco e excluí-lo. Depois você pode criar uma nova programação e anexá-la ao disco.

Os instantâneos gerados a partir do agendamento de instantâneos desanexados não serão gerenciados pela nova política. Esses instantâneos serão retidos indefinidamente até que você os exclua.

Use o console do Google Cloud, a CLI gcloud ou REST para remover e substituir sua programação de snapshot.

Console

  1. No console do Google Cloud, acesse a página Discos .

    Vá para a página Discos

  2. Selecione o disco que contém a programação que você deseja desanexar.
  3. Na página Gerenciar disco , clique em Editar . Talvez seja necessário clicar primeiro no menu Mais ações .
  4. Abra o menu suspenso Agendamento de instantâneos.
  5. Clique em Sem agendamento para separar o agendamento do disco.
  6. Você pode criar um novo agendamento ou trocá-lo enquanto edita as opções do disco.
  7. Clique em Salvar para concluir a tarefa.

gcloud

  1. Use o comando gcloud disks remove-resource-policies para desanexar a programação de snapshot do disco com a programação que você deseja alterar.

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

    Substitua o seguinte:

    • DISK_NAME : o nome do disco com a programação de snapshot anexada a ele
    • SCHEDULE_NAME : o nome da programação de snapshot que você deseja desanexar deste disco
    • REGION : a região onde reside sua programação de snapshot
    • ZONE : a zona onde reside o seu disco zonal
  2. Use o comando gcloud disks add-resource-policies para adicionar a nova programação de snapshot ao disco.

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

    Substitua o seguinte:

    • DISK_NAME : o nome do disco com a política de recurso de agendamento de snapshot
    • SCHEDULE_NAME : o nome da programação de snapshot que você deseja adicionar a este disco
    • ZONE : a zona onde seu disco reside

DESCANSAR

  1. Desanexe a programação de snapshot atual de um disco construindo uma solicitação POST para disks.removeResourcePolicies .

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

    Substitua o seguinte:

    • PROJECT_ID : o nome do projeto
    • ZONE : a zona onde o disco reside
    • DISK_NAME : o nome do disco com a programação de snapshot associada
    • REGION : o local da programação do snapshot
    • SCHEDULE_NAME : o nome da programação de snapshot que você está removendo deste disco
  2. Anexe o novo agendamento de snapshot ao disco construindo uma solicitação POST para o 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"
      ]
    }
    

    Substitua o seguinte:

    • PROJECT_ID : o nome do projeto
    • ZONE : a localização do disco
    • DISK_NAME : o nome do disco
    • REGION : o local da programação do snapshot
    • SCHEDULE_NAME : o nome da programação de snapshot que você está aplicando a este disco

Excluir uma programação de snapshot

Se você excluir um agendamento de snapshot, todos os snapshots gerados automaticamente associados ao agendamento de snapshot serão mantidos permanentemente. No entanto, após a exclusão do agendamento, ele não poderá mais gerar instantâneos.

Sua política de retenção faz parte da programação do snapshot. Depois que o agendamento for excluído, sua política de retenção não será mais aplicada. Os instantâneos que já foram gerados são mantidos permanentemente até que você os exclua manualmente.

Para excluir uma programação de snapshot existente, use o console do Google Cloud, a Google Cloud CLI ou o método da API Compute Engine. Se o agendamento já estiver anexado a um disco, primeiro desconecte-o do disco e, em seguida, exclua-o. Você não pode excluir um agendamento de snapshot anexado a um disco.

Console

  1. No console do Google Cloud, acesse a página Instantâneos .

    Vá para a página Instantâneos

  2. Selecione Programações de instantâneos para ver uma lista de suas programações.
  3. Selecione qualquer agendamento não associado a um disco.
  4. Clique em Excluir .

gcloud

Para excluir um planejamento de captura instantânea, use o comando resource-policies delete .

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

Substitua o seguinte:

  • SCHEDULE_NAME : o nome da programação do snapshot
  • REGION : o local da programação do snapshot

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

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

Pitão

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 excluir uma programação de snapshot, faça uma solicitação DELETE para o método resourcePolicies.delete . Se a programação do snapshot já estiver anexada a um disco, você receberá um erro.

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

Substitua o seguinte:

  • PROJECT_ID : o nome do projeto
  • REGION : o local da programação do snapshot
  • SCHEDULE_NAME : o nome da programação do snapshot

Registro e monitoramento

Cada instantâneo agendado associado a um disco cria continuamente um evento do sistema , que é monitorado e registrado em todos os momentos. Os logs de auditoria de eventos do sistema estão sempre habilitados.

Esses logs fornecem informações comportamentais sobre seus snapshots agendados para cada disco associado. Você pode visualizar seus registros no menu Logging no console do Google Cloud.

Para obter mais informações sobre como usar o Logs Explorer, consulte Visualizar logs usando o Logs Explorer .

Console

  1. No console do Google Cloud, acesse a página do Logs Explorer .

    Acesse a página do Explorador de registros

  2. Na lista suspensa Todos os recursos , aponte para Disco e selecione Todos disk_id .

  3. Na lista suspensa Todos os registros , selecione cloudaudit.googleapis.com/system_event e clique em OK .

  4. Na lista suspensa Qualquer nível de log , selecione o tipo de log.

O que vem a seguir