Gérer les programmations d'instantanés pour des disques


Ce document explique comment gérer les programmations d'instantanés de vos disques persistants zonaux et régionaux et Google Cloud Hyperdisk.

Vous pouvez gérer les programmations d'instantanés comme suit :

  • Afficher les programmations d'instantanés
  • Modifier les programmations d'instantanés
  • Supprimer les programmations d'instantanés

Vous pouvez également configurer des alertes pour les instantanés programmés.

Avant de commencer

  • Si ce n'est pas déjà fait, configurez l'authentification. L'authentification est le processus permettant de valider votre identité pour accéder aux Google Cloud services et aux API. Pour exécuter du code ou des exemples depuis un environnement de développement local, vous pouvez vous authentifier auprès de Compute Engine en sélectionnant l'une des options suivantes:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    2. Set a default region and zone.
    3. Go

      Pour utiliser les exemples Go de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

      1. Install the Google Cloud CLI.
      2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

      3. To initialize the gcloud CLI, run the following command:

        gcloud init
      4. If you're using a local shell, then create local authentication credentials for your user account:

        gcloud auth application-default login

        You don't need to do this if you're using Cloud Shell.

        If an authentication error is returned, confirm that you have configured the gcloud CLI to use Workforce Identity Federation.

      Pour en savoir plus, consultez Set up authentication for a local development environment.

      Java

      Pour utiliser les exemples Java de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

      1. Install the Google Cloud CLI.
      2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

      3. To initialize the gcloud CLI, run the following command:

        gcloud init
      4. If you're using a local shell, then create local authentication credentials for your user account:

        gcloud auth application-default login

        You don't need to do this if you're using Cloud Shell.

        If an authentication error is returned, confirm that you have configured the gcloud CLI to use Workforce Identity Federation.

      Pour en savoir plus, consultez Set up authentication for a local development environment.

      Node.js

      Pour utiliser les exemples Node.js de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

      1. Install the Google Cloud CLI.
      2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

      3. To initialize the gcloud CLI, run the following command:

        gcloud init
      4. If you're using a local shell, then create local authentication credentials for your user account:

        gcloud auth application-default login

        You don't need to do this if you're using Cloud Shell.

        If an authentication error is returned, confirm that you have configured the gcloud CLI to use Workforce Identity Federation.

      Pour en savoir plus, consultez Set up authentication for a local development environment.

      Python

      Pour utiliser les exemples Python de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

      1. Install the Google Cloud CLI.
      2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

      3. To initialize the gcloud CLI, run the following command:

        gcloud init
      4. If you're using a local shell, then create local authentication credentials for your user account:

        gcloud auth application-default login

        You don't need to do this if you're using Cloud Shell.

        If an authentication error is returned, confirm that you have configured the gcloud CLI to use Workforce Identity Federation.

      Pour en savoir plus, consultez Set up authentication for a local development environment.

      REST

      Pour utiliser les exemples d'API REST de cette page dans un environnement de développement local, vous devez utiliser les identifiants que vous fournissez à gcloud CLI.

        After installing the Google Cloud CLI, initialize it by running the following command:

        gcloud init

        If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

      Pour en savoir plus, consultez la section S'authentifier pour utiliser REST dans la documentation sur l'authentification Google Cloud.

Rôles et autorisations requis

Pour obtenir les autorisations nécessaires pour créer une programmation d'instantanés, demandez à votre administrateur de vous accorder les rôles IAM suivants sur le projet:

Pour en savoir plus sur l'attribution de rôles, consultez la page Gérer l'accès aux projets, aux dossiers et aux organisations.

Ces rôles prédéfinis contiennent les autorisations requises pour créer une programmation d'instantanés. Pour connaître les autorisations exactes requises, développez la section Autorisations requises :

Autorisations requises

Les autorisations suivantes sont requises pour créer une programmation d'instantanés:

  • Pour afficher les programmations d'instantanés : compute.resourcePolicies.list sur le projet ou l'organisation
  • Pour mettre à jour une programmation d'instantanés, procédez comme suit :
    • compute.resourcePolicies.update sur la règle de ressource
    • compute.resourcePolicies.get sur la règle de ressource
  • Pour remplacer une programmation d'instantanés, procédez comme suit :
    • compute.resourcePolicies.use sur la règle de ressource
    • compute.disks.addResourcePolicies sur le disque
    • compute.disks.removeResourcePolicies sur le disque
  • Pour supprimer une programmation d'instantanés, procédez comme suit :
    • compute.resourcePolicies.delete sur la règle de ressource
    • compute.disks.removeResourcePolicies sur le disque

Vous pouvez également obtenir ces autorisations avec des rôles personnalisés ou d'autres rôles prédéfinis.

Afficher les programmations d'instantanés

Pour obtenir la liste des programmations d'instantanés, utilisez la console, l'outil gcloud ou la méthode API Compute Engine. La requête présentée ici affiche le nom, la description et la région de toutes les programmations d'instantanés d'un projet.

Console

  1. Dans Google Cloud Console, accédez à la page Instantanés.

    Accéder à la page Instantanés

  2. Sélectionnez l'onglet Programmations d'instantanés.
  3. Utilisez le champ Filtre pour affiner la liste des programmations d'instantanés.
  4. Cliquez sur le nom d'une programmation d'instantanés pour afficher ses détails.

gcloud

Pour afficher la liste des programmations d'instantanés, utilisez la commande resource-policies list.

 gcloud compute resource-policies list

Pour consulter la description d'une programmation d'instantanés spécifique, utilisez la commande resource-policies describe.

gcloud compute resource-policies describe SCHEDULE_NAME

Remplacez SCHEDULE_NAME par le nom de la programmation d'instantanés.

Go

Lister les programmations d'instantanés

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
}

Décrire une programmation d'instantanés

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

Lister les programmations d'instantanés

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

Décrire une programmation d'instantanés

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

public class GetSnapshotSchedule {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";
    // Name of the region in which your snapshot schedule is located.
    String region = "us-central1";
    // Name of your snapshot schedule.
    String snapshotScheduleName = "YOUR_SCHEDULE_NAME";

    getSnapshotSchedule(projectId, region, snapshotScheduleName);
  }

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

      return resourcePolicy;
    }
  }
}

Node.js

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

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

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

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

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

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

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

await callGetSnapshotSchedule();

Python

Lister les programmations d'instantanés

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

Décrire une programmation d'instantanés

from google.cloud import compute_v1


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

REST

Envoyez une requête GET à resourcePolicies.aggregatedList pour afficher la liste des programmations d'instantanés figurant dans un projet.

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

Remplacez PROJECT_ID par le nom du projet.

Afficher les programmations d'instantanés par région

Pour afficher les programmations d'instantanés d'un projet dans une région particulière, utilisez la console Google Cloud, gcloud CLI ou REST.

Console

  1. Dans Google Cloud Console, accédez à la page Instantanés.

    Accéder à la page Instantanés

  2. Sélectionnez l'onglet Programmations d'instantanés.
  3. Utilisez le champ Filtre pour répertorier les programmations d'instantanés d'une région spécifique.

gcloud

Pour afficher les programmations d'instantanés d'un projet dans une région spécifique, utilisez la commande resource-policies list.

gcloud compute resource-policies list PROJECT_ID --filter REGION

Remplacez les éléments suivants :

  • PROJECT_ID : nom du projet
  • REGION : région, par exemple us-west1

REST

Envoyez une requête GET à la méthode resourcePolicies.list pour récupérer les programmations d'instantanés créées dans une région.

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

Remplacez les éléments suivants :

  • PROJECT_ID : nom du projet
  • REGION : région, par exemple us-west1

Modifier une programmation d'instantanés

Après avoir créé une programmation d'instantanés, vous pouvez modifier les champs suivants de manière dynamique, à l'aide de la procédure Mettre à jour une programmation d'instantanés :

  • Description
  • Programmation des instantanés
  • Libellés appliqués aux instantanés générés
  • Règle de suppression du disque source pour gérer les instantanés générés automatiquement si le disque source est supprimé
  • Règle de conservation permettant de définir la durée de conservation des instantanés générés à partir de la programmation d'instantanés

Pour mettre à jour d'autres valeurs d'une programmation d'instantanés, vous devez supprimer la programmation d'instantanés et en créer une autre, comme décrit dans la section Remplacer une programmation d'instantanés.

Les mises à jour de la programmation d'instantanés prennent effet dans le premier instantané après les mises à jour. Si un instantané est en cours d'exécution pendant la mise à jour de la programmation d'instantanés, les modifications prennent effet dans l'instantané suivant.

Mettre à jour une programmation d'instantanés

Vous pouvez utiliser Google Cloud CLI ou l'API Compute Engine pour modifier certaines des propriétés de votre programmation d'instantanés, comme décrit dans la section Modifier une programmation d'instantanés.

Pour modifier d'autres propriétés de votre programmation d'instantanés, utilisez la méthode décrite dans la section Remplacer une programmation d'instantanés.

Console

  1. Dans Google Cloud Console, accédez à la page Instantanés.

    Accéder à la page Instantanés

  2. Sélectionnez Programmations d'instantanés pour afficher la liste de vos programmations.
  3. Cliquez sur le nom de la programmation d'instantanés que vous souhaitez modifier.
  4. Sur la page d'informations de la programmation d'instantanés, cliquez sur le bouton Modifier la programmation.

gcloud

Utilisez la commande compute resource-policies update pour mettre à jour une description, une programmation, une règle de conservation ou les libellés d'une programmation d'instantanés.

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

Remplacez les éléments suivants :

  • SCHEDULE_NAME : nom de la programmation d'instantanés.
  • REGION : région où se trouve votre programmation d'instantanés.
  • DESCRIPTION : description de la programmation d'instantanés. Utilisez des guillemets autour de votre description.
  • KEY et VALUE : paire clé-valeur pouvant être utilisée pour regrouper des ressources liées ou associées.
  • DAYS : nombre maximal de jours de conservation de l'instantané avant sa suppression.
  • DELETE_OPTION : comportement de conservation des instantanés automatiques après la suppression du disque d'origine. La valeur doit être l'une des suivantes :
    • apply-retention-policy : lorsque le disque source est supprimé, continuez à appliquer la durée de conservation pour tous les instantanés créés par la programmation d'instantanés.
    • keep-auto-snapshots : (par défaut) si le disque source est supprimé, conservez tous les instantanés créés par la programmation d'instantanés, quelle que soit la durée de conservation.
  • START_TIME : heure de début (UTC). L'heure ne doit pas inclure de minutes. Exemple :
    • 14h PST correspond à 22:00.
    • Si vous définissez une heure de début ayant la valeur 22:13, une erreur sera renvoyée.
  • SCHEDULE_FLAG : l'une des options suivantes :

    • --hourly-schedule=HOURLY_INTERVAL : nombre d'heures entre chaque instantané. Le paramètre HOURLY_INTERVAL doit être un nombre entier compris entre 1 et 23 Par exemple, si vous définissez --hourly-schedule sur 12, l'instantané est généré toutes les 12 heures.
    • --daily-schedule : effectue un instantané quotidiennement, à l'heure définie sur START_TIME.
    • --weekly-schedule=WEEKLY_INTERVAL : définit les jours auxquels vous souhaitez que la création d'instantanés ait lieu. Vous devez rédiger en entier le jour de la semaine. Les valeurs ne sont pas sensibles à la casse.

    • --weekly-schedule-from-file=FILE_NAME : spécifie un fichier contenant la programmation d'instantanés à fréquence hebdomadaire. Vous pouvez spécifier des programmations hebdomadaires à différents jours et à différentes heures à l'aide d'un fichier. Par exemple, votre fichier peut spécifier une programmation d'instantanés les lundis et mercredis : none [{"day": "MONDAY", "startTime": "04:00"}, {"day": "WEDNESDAY", "startTime": "02:00"}]. Si vous incluez une heure de début dans votre fichier, vous n'avez pas besoin de définir l'option --start-time. La programmation utilise le fuseau horaire UTC standard. L'heure ne doit pas inclure de minutes. Exemple :

      • 14h PST correspond à 22:00.
      • Si vous définissez une heure de début ayant la valeur 22:13, une erreur sera renvoyée.

    Les options de fréquence d'instantanés hourly-schedule, daily-schedule, weekly-schedule et weekly-schedule-from-file s'excluent mutuellement. Vous ne pouvez en utiliser qu'une seule pour la programmation d'instantanés.

Exemples :

Pour remplacer une programmation d'instantanés par une programmation à fréquence quotidienne, procédez comme suit :

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

Pour remplacer un instantané par une programmation à fréquence horaire, et mettre à jour la description et le libellé de l'instantané, procédez comme suit :

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"

Pour modifier les règles de conservation des instantanés et de suppression des disques sources pour une programmation d'instantanés, procédez comme suit :

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

Go

import (
	"context"
	"fmt"
	"io"

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

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

	ctx := context.Background()

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

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

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

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

	return nil
}

Java

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

public class EditSnapshotSchedule {

  public static void main(String[] args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";
    // Name of the region where your snapshot schedule is located.
    String region = "us-central1";
    // Name of the snapshot schedule you want to update.
    String snapshotScheduleName = "YOUR_SCHEDULE_NAME";

    editSnapshotSchedule(projectId, region, snapshotScheduleName);
  }

  // Edits a snapshot schedule.
  public static Status editSnapshotSchedule(
          String projectId, String region, String snapshotScheduleName)
          throws IOException, InterruptedException, ExecutionException, TimeoutException {

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (ResourcePoliciesClient resourcePoliciesClient = ResourcePoliciesClient.create()) {
      Map<String, String> snapshotLabels = new HashMap<>();
      snapshotLabels.put("key", "value");

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

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

      int maxRetentionDays = 3;

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

      String description = "Updated description";

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

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

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

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

Node.js

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

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

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

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

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

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

  let operation = response.latestResponse;

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

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

await callEditSnapshotSchedule();

Python

from __future__ import annotations

import sys
from typing import Any

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


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

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

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

    Returns:
        Whatever the operation.result() returns.

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

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

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

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

    return result


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

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

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

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

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

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

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

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

REST

Créez une requête PATCH à la méthode resourcePolicies pour mettre à jour la description, la programmation, la règle de conservation, la règle de suppression du disque source ou les libellés d'une programmation d'instantanés. Dans le corps de la requête, il vous suffit de spécifier le champ name et les champs que vous souhaitez mettre à jour.

  • Modifiez la description et le libellé :

    PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/resourcePolicies/SCHEDULE_NAME
    {
        "name": "SCHEDULE_NAME",
        "description": "DESCRIPTION",
        "snapshotProperties": {
            "labels": {"KEY": "VALUE"}
        }
    }
    
  • Définissez la programmation d'instantanés sur une fréquence horaire :

    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
               }
            }
        }
    }
    
  • Définissez la programmation d'instantanés sur une fréquence quotidienne :

    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
               }
            }
        }
    }
    
  • Définissez la programmation d'instantanés sur une fréquence hebdomadaire :

    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
                     }
                  ]
               }
            }
        }
    }
    
  • Modifiez la règle de conservation des instantanés :

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

Remplacez les éléments suivants :

  • PROJECT_ID : nom du projet
  • REGION : région où se trouve la programmation d'instantanés.
  • SCHEDULE_NAME : nom de la programmation d'instantanés.
  • DESCRIPTION : description de la programmation d'instantanés. Utilisez des guillemets autour de votre description.
  • KEY et VALUE : paire clé-valeur pouvant être utilisées pour regrouper des ressources liées ou associées.
  • HOURLY_INTERVAL : définit l'intervalle auquel vous souhaitez que la création d'instantanés ait lieu. Définissez la programmation à fréquence horaire à l'aide d'un entier compris entre 1 et 23. Pour que les instantanés soient créés en même temps chaque jour, choisissez un nombre qui se divise uniformément en 24 (1, 2, 3, 4, 6, 8 ou 12). Par exemple, si vous définissez --hourly-schedule sur 12, l'instantané est généré toutes les 12 heures.
  • DAILY_INTERVAL : définit le nombre de jours entre chaque instantané. Pour créer un instantané chaque jour, utilisez la valeur 1.
  • WEEKLY_INTERVAL : définit une programmation qui s'exécute certains jours de la semaine. Indiquez un ou plusieurs jours. Les options suivantes sont disponibles : MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY et SUNDAY. Vous devez rédiger en entier les jours de la semaine. Ils ne sont pas sensibles à la casse. Vous pouvez définir jusqu'à 7 intervalles pour dayOfWeeks, un pour chaque jour de la semaine.
  • START_TIME : heure de début (UTC). L'heure ne doit pas inclure de minutes. Exemple :
    • 14h PST correspond à 22:00 UTC.
    • Si vous définissez une heure de début ayant la valeur 22:13, une erreur sera renvoyée.
  • DAYS : nombre maximal de jours de conservation de l'instantané avant sa suppression.
  • DELETE_OPTION : comportement de conservation des instantanés automatiques après la suppression du disque d'origine. La valeur doit être l'une des suivantes :
    • APPLY_RETENTION_POLICY : lorsque le disque source est supprimé, continuez à appliquer la durée de conservation pour tous les instantanés créés par la programmation d'instantanés.
    • KEEP_AUTO_SNAPSHOTS : (par défaut) si le disque source est supprimé, conservez tous les instantanés créés par la programmation d'instantanés, quelle que soit la durée de conservation.

Remplacer une programmation d'instantanés

Pour supprimer la programmation d'instantanés et en créer une autre, procédez comme suit : Utilisez cette méthode pour modifier les propriétés d'une programmation d'instantanés qui ne peuvent pas être modifiées à l'aide de la procédure Mettre à jour une programmation d'instantanés.

Si vous remplacez une programmation d'instantanés déjà associée à un disque, vous devez d'abord dissocier la programmation du disque, puis la supprimer. Vous pouvez alors créer une autre programmation et l'associer au disque.

Les instantanés générés à partir de la programmation d'instantanés dissociée ne sont pas gérés par la nouvelle règle. Ces instantanés sont conservés indéfiniment jusqu'à ce que vous les supprimiez.

Utilisez la console Google Cloud, gcloud CLI ou REST pour supprimer et remplacer votre programmation d'instantanés.

Console

  1. Dans la console Google Cloud, accédez à la page Disques.

    Accéder à la page Disques

  2. Sélectionnez le disque contenant la programmation que vous souhaitez dissocier.
  3. Sur la page Gérer le disque, cliquez sur Modifier. Vous devrez peut-être d'abord cliquer sur le menu Autres actions.
  4. Ouvrez le menu déroulant Programmation des instantanés.
  5. Cliquez sur Pas de programmation pour dissocier la programmation du disque.
  6. Vous pouvez alors créer une autre programmation, ou l'échanger lorsque vous modifiez les options du disque.
  7. Cliquez sur Enregistrer pour terminer la tâche.

gcloud

  1. Utilisez la commande gcloud disks remove-resource-policies pour dissocier la programmation d'instantanés du disque contenant la programmation que vous souhaitez modifier.

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

    Remplacez les éléments suivants :

    • DISK_NAME : nom du disque auquel la programmation d'instantanés est associée
    • SCHEDULE_NAME : nom de la programmation d'instantanés que vous souhaitez dissocier de ce disque
    • REGION : région où se trouve votre programmation d'instantanés
    • ZONE : zone où réside votre disque zonal
  2. Exécutez la commande gcloud disks add-resource-policies pour ajouter la nouvelle programmation d'instantanés sur le disque.

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

    Remplacez les éléments suivants :

    • DISK_NAME : nom du disque avec la règle de ressource de la programmation d'instantanés
    • SCHEDULE_NAME : nom de la programmation d'instantanés que vous souhaitez ajouter à ce disque
    • ZONE : zone où se trouve votre disque

REST

  1. Dissociez la programmation d'instantanés actuelle d'un disque en envoyant une requête POST à disks.removeResourcePolicies.

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

    Remplacez les éléments suivants :

    • PROJECT_ID : nom du projet
    • ZONE : zone où se trouve le disque
    • DISK_NAME : nom du disque avec la programmation d'instantanés associée
    • REGION : emplacement de la programmation d'instantanés
    • SCHEDULE_NAME : nom de la programmation d'instantanés que vous supprimez de ce disque
  2. Associez la nouvelle programmation d'instantanés au disque en envoyant une requête POST à la méthode disks.addResourcePolicies.

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

    Remplacez les éléments suivants :

    • PROJECT_ID : nom du projet
    • ZONE : emplacement du disque.
    • DISK_NAME : le nom du disque
    • REGION : emplacement de la programmation d'instantanés
    • SCHEDULE_NAME : nom de la programmation d'instantanés que vous appliquez à ce disque

Supprimer une programmation d'instantanés

Si vous supprimez une programmation d'instantanés, tous les instantanés générés automatiquement associés à cette programmation sont conservés de manière permanente. Cependant, une fois la programmation supprimée, elle ne peut plus générer d'instantanés.

La règle de conservation fait partie de votre programmation d'instantanés. Une fois la programmation supprimée, la règle de conservation ne s'applique plus. Les instantanés déjà générés sont conservés jusqu'à ce que vous les supprimiez manuellement.

Pour supprimer une programmation d'instantanés existante, utilisez la console Google Cloud, Google Cloud CLI ou la méthode API Compute Engine. Si la programmation est déjà associée à un disque, dissociez-la d'abord du disque, puis supprimez-la. Vous ne pouvez pas supprimer une programmation d'instantanés associée à un disque.

Console

  1. Dans Google Cloud Console, accédez à la page Instantanés.

    Accéder à la page Instantanés

  2. Sélectionnez Programmations d'instantanés pour afficher la liste de vos programmations.
  3. Sélectionnez une programmation non associée à un disque.
  4. Cliquez sur Supprimer.

gcloud

Pour supprimer une programmation d'instantanés, utilisez la commande resource-policies delete.

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

Remplacez les éléments suivants :

  • SCHEDULE_NAME : nom de la programmation d'instantanés
  • REGION : emplacement de la programmation d'instantanés

Go

import (
	"context"
	"fmt"
	"io"

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

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

	ctx := context.Background()

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

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

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

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

	return nil
}

Java

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

public class DeleteSnapshotSchedule {
  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";
    // Name of the region where your snapshot schedule is located.
    String region = "us-central1";
    // Name of the snapshot schedule you want to delete.
    String snapshotScheduleName = "YOUR_SCHEDULE_NAME";

    deleteSnapshotSchedule(projectId, region, snapshotScheduleName);
  }

  // Deletes a snapshot schedule policy.
  public static Status deleteSnapshotSchedule(
          String projectId, String region, String snapshotScheduleName)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (ResourcePoliciesClient resourcePoliciesClient = ResourcePoliciesClient.create()) {
      DeleteResourcePolicyRequest request = DeleteResourcePolicyRequest.newBuilder()
              .setProject(projectId)
              .setRegion(region)
              .setResourcePolicy(snapshotScheduleName)
              .build();
      Operation response = resourcePoliciesClient.deleteAsync(request).get(3, TimeUnit.MINUTES);

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

Node.js

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

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

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

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

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

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

  let operation = response.latestResponse;

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

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

await callDeleteSnapshotSchedule();

Python

from __future__ import annotations

import sys
from typing import Any

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


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

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

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

    Returns:
        Whatever the operation.result() returns.

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

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

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

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

    return result


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

REST

Pour supprimer une programmation d'instantanés, envoyez une requête DELETE à la méthode resourcePolicies.delete. Si la programmation d'instantanés est déjà associée à un disque, une erreur sera renvoyée.

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

Remplacez les éléments suivants :

  • PROJECT_ID : nom du projet
  • REGION : emplacement de la programmation d'instantanés
  • SCHEDULE_NAME : nom de la programmation d'instantanés

Journalisation et surveillance

Chaque programmation d'instantanés associée à un disque crée de manière continue des événements système, qui sont surveillés et journalisés à tout moment. Les journaux d'audit d'événements système sont toujours activés.

Ces journaux fournissent des informations sur le comportement des instantanés programmés pour chaque disque associé. Vous pouvez afficher vos journaux à partir du menu "Journalisation" de la console Google Cloud.

Pour en savoir plus sur l'utilisation de l'explorateur de journaux, consultez la page Afficher les journaux à l'aide de l'explorateur de journaux.

Console

  1. Dans Google Cloud Console, accédez à la page Explorateur de journaux.

    Accéder à la page "Explorateur de journaux"

  2. Dans la liste déroulante All resource (Toutes les ressources), pointez sur Disk (Disque) et sélectionnez All disk_id (Tous les ID de disque).

  3. Dans la liste déroulante All logs (Tous les journaux), sélectionnez cloudaudit.googleapis.com/system_event et cliquez sur OK.

  4. Dans la liste déroulante Any log level (Tous les niveaux de journalisation), sélectionnez le type de journal.

Étapes suivantes