Modifier les paramètres d'un disque Persistent Disk ou Google Cloud Hyperdisk

Vous pouvez utiliser les volumes Google Cloud Hyperdisk et Persistent Disk comme disques de démarrage et disques de données pour les instances Compute Engine.

Ce document explique comment effectuer les tâches suivantes :

  • Convertissez un disque en un autre type de Persistent Disk ou Hyperdisk en créant un disque contenant les données du disque d'origine. En fonction du nouveau type de disque que vous choisissez, vous pouvez bénéficier des avantages suivants :

    • Atteignez des niveaux de performances plus élevés si vous choisissez un type de disque plus rapide.
    • Réduisez les coûts en choisissant un type de disque plus économique.
  • Configurez si Compute Engine supprime ou non les disques de démarrage ou de données d'une instance de calcul lorsque vous supprimez l'instance. Vous êtes facturé pour un disque jusqu'à ce que vous le supprimiez, même s'il n'est associé à aucune instance. Vous pouvez réduire les coûts en activant la suppression automatique des disques dont vous n'aurez plus besoin une fois l'instance associée supprimée.

Pour modifier la taille d'un disque, consultez Modifier la taille ou les performances provisionnées d'un volume Hyperdisk et Modifier la taille d'un disque persistant, respectivement.

Modifier le type d'un volume Persistent Disk

Vous devez parfois modifier le type d'un volume de disque persistant spécifique pour répondre à vos exigences en termes de performances ou de prix. Par exemple, vous pouvez remplacer le disque de données d'une charge de travail par un disque persistant équilibré.

Vous ne pouvez pas modifier directement le type d'un volume de disque persistant existant. Vous devez créer un instantané du disque existant, puis utiliser cet instantané pour créer un disque du nouveau type.

Pour remplacer un volume Persistent Disk (le disque source) par un autre type de Persistent Disk (le nouveau disque), procédez comme suit :

  1. Si le disque source est associé à une instance de calcul, arrêtez l'instance.

  2. Créez un instantané du disque source.

  3. Créez le nouveau disque à partir de l'instantané du disque source.

  4. Pour commencer à utiliser le nouveau disque, dissociez le disque source de l'instance et associez le nouveau disque que vous venez de créer.

  5. Démarrez l'instance.

  6. Vérifiez que le nouveau disque fonctionne comme prévu.

  7. Après avoir testé le nouveau disque, vous pouvez supprimer l'instantané et supprimer le disque source. Des frais continuent de vous être facturés pour le disque source et l'instantané jusqu'à ce que vous les supprimiez.

Modifier le paramètre de suppression automatique d'un disque

Pour éviter toute perte de données accidentelle, vous pouvez contrôler si Compute Engine supprime automatiquement les volumes Google Cloud Hyperdisk ou Persistent Disk associés à l'instance lorsque vous supprimez l'instance. Les disques SSD locaux sont toujours supprimés avec l'instance.

La propriété autoDelete de chaque volume Google Cloud Hyperdisk ou Persistent Disk associé à l'instance contrôle ce comportement.

Pour conserver un volume spécifique lorsque vous supprimez l'instance, définissez la propriété autoDelete du volume sur false. Inversement, pour supprimer un volume lorsque vous supprimez l'instance, définissez la propriété autoDelete sur true.

Vous ne pouvez pas supprimer automatiquement un disque s'il est associé à l'instance en mode lecture seule.

Console

  1. Dans la console Google Cloud , accédez à la page Instances de VM.

    Accéder à la page Instances de VM

  2. Sélectionnez l'instance à laquelle les disques sont associés.

  3. Cliquez sur le nom de l'instance. La page Informations sur l'instance de VM s'affiche.

  4. Cliquez sur Modifier.

  5. Pour modifier le paramètre de suppression automatique de vos disques, procédez comme suit dans la section Stockage :

    • Pour le disque de démarrage, sous l'en-tête Disque de démarrage, sélectionnez la Règle de suppression du disque de démarrage.
    • Pour un disque supplémentaire, recherchez-le dans la section Disques supplémentaires, puis procédez comme suit :
      1. Cliquez sur Modifier le disque. Le volet Disque existant s'ouvre.
      2. Sous Mode de rattachement, définissez la Règle de suppression du disque. Pour enregistrer le paramètre du disque et fermer le volet, cliquez sur Enregistrer.
  6. Pour enregistrer vos modifications, cliquez sur Enregistrer.

gcloud

Définissez l'état de suppression automatique d'un disque à l'aide de la commande gcloud compute instances set-disk-auto-delete.

Pour conserver le disque lorsque vous supprimez l'instance, spécifiez l'indicateur --no-auto-delete.

Pour supprimer le disque, spécifiez le flag --auto-delete.

gcloud compute instances set-disk-auto-delete INSTANCE_NAME \
  AUTO_DELETE_SETTING \
  --disk DISK_NAME

Remplacez les éléments suivants :

  • INSTANCE_NAME : nom de l'instance.
  • AUTO_DELETE_SETTING : indique si le disque doit être supprimé automatiquement ou non. Spécifiez --no-auto-delete pour conserver le disque après la suppression de l'instance de calcul, et --auto-delete pour supprimer le disque en même temps que l'instance.
  • DISK_NAME : nom du disque.

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go décrites dans le Guide de démarrage rapide de Compute Engine à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Go Compute Engine.

Pour vous authentifier auprès de Compute Engine, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

import (
	"context"
	"fmt"
	"io"

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

// setDiskAutodelete sets the autodelete flag of a disk to given value.
func setDiskAutoDelete(
	w io.Writer,
	projectID, zone, instanceName, diskName string, autoDelete bool,
) error {
	// projectID := "your_project_id"
	// zone := "us-west3-b"
	// instanceName := "your_instance_name"
	// diskName := "your_disk_name"
	// autoDelete := true

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

	getInstanceReq := &computepb.GetInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
	}

	instance, err := instancesClient.Get(ctx, getInstanceReq)
	if err != nil {
		return fmt.Errorf("unable to get instance: %w", err)
	}

	diskExists := false

	for _, disk := range instance.GetDisks() {
		if disk.GetDeviceName() == diskName {
			diskExists = true
			break
		}
	}

	if !diskExists {
		return fmt.Errorf(
			"instance %s doesn't have a disk named %s attached",
			instanceName,
			diskName,
		)
	}

	req := &computepb.SetDiskAutoDeleteInstanceRequest{
		Project:    projectID,
		Zone:       zone,
		Instance:   instanceName,
		DeviceName: diskName,
		AutoDelete: autoDelete,
	}

	op, err := instancesClient.SetDiskAutoDelete(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to set disk autodelete field: %w", err)
	}

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

	fmt.Fprintf(w, "disk autoDelete field updated.\n")

	return nil
}

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java décrites dans le Guide de démarrage rapide de Compute Engine à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Java Compute Engine.

Pour vous authentifier auprès de Compute Engine, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.


import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.SetDiskAutoDeleteInstanceRequest;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class SetDiskAutodelete {

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

    // The zone of the disk that you want to modify.
    String zone = "europe-central2-b";

    // Name of the instance the disk is attached to.
    String instanceName = "YOUR_INSTANCE_NAME";

    // The name of the disk for which you want to modify the autodelete flag.
    String diskName = "YOUR_DISK_NAME";

    // The new value of the autodelete flag.
    boolean autoDelete = true;

    setDiskAutodelete(projectId, zone, instanceName, diskName, autoDelete);
  }

  // Sets the autodelete flag of a disk to given value.
  public static void setDiskAutodelete(String projectId, String zone, String instanceName,
      String diskName, boolean autoDelete)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `instancesClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (InstancesClient instancesClient = InstancesClient.create()) {

      // Retrieve the instance given by the instanceName.
      Instance instance = instancesClient.get(projectId, zone, instanceName);

      // Check if the instance contains a disk that matches the given diskName.
      boolean diskNameMatch = instance.getDisksList()
          .stream()
          .anyMatch(disk -> disk.getDeviceName().equals(diskName));

      if (!diskNameMatch) {
        throw new Error(
            String.format("Instance %s doesn't have a disk named %s attached", instanceName,
                diskName));
      }

      // Create the request object.
      SetDiskAutoDeleteInstanceRequest request = SetDiskAutoDeleteInstanceRequest.newBuilder()
          .setProject(projectId)
          .setZone(zone)
          .setInstance(instanceName)
          .setDeviceName(diskName)
          // Update the autodelete property.
          .setAutoDelete(autoDelete)
          .build();

      // Wait for the update instance operation to complete.
      Operation response = instancesClient.setDiskAutoDeleteAsync(request)
          .get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        System.out.println("Failed to update Disk autodelete field!" + response);
        return;
      }
      System.out.println(
          "Disk autodelete field updated. Operation Status: " + response.getStatus());
    }
  }
}

Node.js

Avant d'essayer cet exemple, suivez les instructions de configuration Node.js décrites dans le guide de démarrage rapide de Compute Engine sur l'utilisation des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Node.js Compute Engine.

Pour vous authentifier auprès de Compute Engine, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const zone = 'europe-central2-b';
// const instanceName = 'YOUR_INSTANCE_NAME';
// const diskName = 'YOUR_DISK_NAME';
// const autoDelete = true;

const compute = require('@google-cloud/compute');

async function setDiskAutodelete() {
  const instancesClient = new compute.InstancesClient();

  const [instance] = await instancesClient.get({
    project: projectId,
    zone,
    instance: instanceName,
  });

  if (!instance.disks.some(disk => disk.deviceName === diskName)) {
    throw new Error(
      `Instance ${instanceName} doesn't have a disk named ${diskName} attached.`
    );
  }

  const [response] = await instancesClient.setDiskAutoDelete({
    project: projectId,
    zone,
    instance: instanceName,
    deviceName: diskName,
    autoDelete,
  });
  let operation = response.latestResponse;
  const operationsClient = new compute.ZoneOperationsClient();

  // Wait for the update instance operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await operationsClient.wait({
      operation: operation.name,
      project: projectId,
      zone: operation.zone.split('/').pop(),
    });
  }

  console.log('Disk autoDelete field updated.');
}

setDiskAutodelete();

Python

Avant d'essayer cet exemple, suivez les instructions de configuration pour Python décrites dans le Guide de démarrage rapide de Compute Engine à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Python Compute Engine.

Pour vous authentifier auprès de Compute Engine, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

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 set_disk_autodelete(
    project_id: str, zone: str, instance_name: str, disk_name: str, autodelete: bool
) -> None:
    """
    Set the autodelete flag of a disk to given value.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone in which is the disk you want to modify.
        instance_name: name of the instance the disk is attached to.
        disk_name: the name of the disk which flag you want to modify.
        autodelete: the new value of the autodelete flag.
    """
    instance_client = compute_v1.InstancesClient()
    instance = instance_client.get(
        project=project_id, zone=zone, instance=instance_name
    )

    for disk in instance.disks:
        if disk.device_name == disk_name:
            break
    else:
        raise RuntimeError(
            f"Instance {instance_name} doesn't have a disk named {disk_name} attached."
        )

    disk.auto_delete = autodelete

    operation = instance_client.update(
        project=project_id,
        zone=zone,
        instance=instance_name,
        instance_resource=instance,
    )

    wait_for_extended_operation(operation, "disk update")

REST

Pour définir l'état de suppression automatique à l'aide de l'API, envoyez une requête POST à la méthode instances.setDiskAutoDelete.

Utilisez le paramètre autoDelete pour indiquer si le disque doit être supprimé.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/setDiskAutoDelete?deviceName=DISK_NAME,autoDelete=AUTO_DELETE_OPTION

Remplacez les éléments suivants :

  • PROJECT_ID : ID de votre projet.
  • ZONE : zone dans laquelle se trouvent l'instance et le disque.
  • INSTANCE_NAME : nom de l'instance
  • DISK_NAME : nom du disque associé à l'instance.
  • AUTO_DELETE_OPTION : indique si le disque doit être supprimé automatiquement lorsque vous supprimez l'instance. Pour supprimer le disque, définissez-le sur true. Définissez la valeur sur false pour conserver le disque après la suppression de l'instance.

Dépannage

Pour connaître les méthodes de diagnostic et de résolution des problèmes liés aux disques saturés et au redimensionnement des disques, consultez la page Résoudre les problèmes liés aux disques saturés et au redimensionnement des disques.

Étape suivante