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

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

Ce document explique comment effectuer les tâches suivantes :

  • Convertir un disque en un autre type de disque persistant ou Hyperdisk en créant un disque contenant les données du disque d'origine. Selon le nouveau type de disque que vous choisissez, vous pouvez bénéficier des avantages suivants :

    • Atteindre des niveaux de performances plus élevés si vous choisissez un type de disque plus rapide
    • Réduire les coûts si vous choisissez un type de disque plus économique
  • Configurer si Compute Engine supprime les disques de démarrage ou de données d'une instance de calcul lorsque vous supprimez l'instance. Des frais vous sont facturés 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.

  • Mettre à jour le mode d'accès d'un volume Hyperdisk pour activer ou désactiver l'accès au volume à partir de plusieurs instances Compute Engine.

Pour modifier la taille d'un volume Hyperdisk ou Persistent Disk, 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 disque persistant (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 continueront 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 à une 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. À l'inverse, 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 chaque disque supplémentaire associé à l'instance, recherchez le disque 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 appliquer vos modifications, cliquez sur Enregistrer.

gcloud

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

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

Si plusieurs disques sont associés à l'instance, vous devez exécuter la commande pour chaque disque associé à l'instance.

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é.

Si plusieurs disques sont associés à l'instance, vous devez envoyer une requête pour chaque disque associé à l'instance.

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 du 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 ou non lorsque vous supprimez l'instance. Pour supprimer le disque, définissez-le sur true. Définissez-le sur false pour conserver le disque après la suppression de l'instance.

Mode d'accès pour les volumes Hyperdisk

Pour partager un volume Hyperdisk entre plusieurs instances et accorder à chaque instance un accès simultané en lecture seule ou en lecture/écriture au volume, vous devez définir le mode d'accès du volume sur lecture seule ou écriture simultanée, respectivement.

D'autre part, pour effectuer certaines actions, comme créer une image, sur un volume Hyperdisk en mode lecture seule ou écriture simultanée, vous devez définir son mode d'accès sur écriture unique.

Cette section explique comment définir le mode d'accès d'un disque.

Pour en savoir plus sur le partage de disques, consultez Partager des disques entre plusieurs instances.

Limites concernant les modifications du mode d'accès

  • Vous ne pouvez pas définir le mode d'accès d'un disque tant que vous ne l'avez pas dissocié de toutes les instances.

  • Les volumes Hyperdisk Throughput ne sont compatibles qu'avec le mode écriture unique. Vous ne pouvez pas définir le mode d'accès pour un volume Hyperdisk Throughput.

  • Pour les volumes Hyperdisk Balanced, Hyperdisk Extreme et Hyperdisk Balanced High Availability, vous ne pouvez qu'activer ou désactiver le mode écriture simultanée. Vous ne pouvez pas définir le mode d'accès sur lecture seule.

  • Pour les volumes Hyperdisk ML, vous ne pouvez définir le mode d'accès que sur lecture seule. Les volumes Hyperdisk ML ne sont pas compatibles avec le mode écriture simultanée.

  • Vous ne pouvez pas modifier le mode d'accès d'un volume Hyperdisk ML une fois que vous l'avez défini sur lecture seule.

Rôles et autorisations requis

Pour obtenir l'autorisation nécessaire pour définir le mode d'accès d'un disque, demandez à votre administrateur de vous attribuer les rôles IAM suivants sur le projet :

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

Ce rôle prédéfini contient l'autorisation compute.disks.update , qui est requise pour définir le mode d'accès d'un disque.

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

Définir le mode d'accès d'un volume Hyperdisk

Avant de définir le mode d'accès d'un disque, vous devez le dissocier de toutes les instances.

Vous pouvez définir le mode d'accès à l'aide de la Google Cloud console, de Google Cloud CLI ou de REST.

Console

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

    Accéder à la page Disques

  2. Dans la liste des disques de votre projet, cliquez sur le nom du volume Hyperdisk que vous souhaitez modifier.

  3. Sur la page d'informations du disque, cliquez sur Modifier.

  4. Dans le champ Mode d'accès, sélectionnez le mode d'accès souhaité :

    • Pour activer le mode lecture seule, sélectionnez Plusieurs VM en lecture seule.
    • Pour activer le mode écriture simultanée, sélectionnez Plusieurs VM en mode lecture/écriture.
    • (Par défaut) Pour activer le mode écriture unique, sélectionnez Une seule VM en mode lecture/écriture.
  5. Pour appliquer vos modifications, cliquez sur Enregistrer.

gcloud

Exécutez la disks update commande et spécifiez le mode d'accès à l'aide de l'option --access-mode.

gcloud compute disks update DISK_NAME  \
   --access-mode=DISK_ACCESS_MODE

Remplacez les éléments suivants :

  • DISK_NAME : nom du volume Hyperdisk que vous modifiez.
  • DISK_ACCESS_MODE : mode d'accès des instances aux données sur le disque. Les valeurs compatibles sont :
    • READ_ONLY_MANY pour un accès en lecture seule à partir de plusieurs instances.
    • READ_WRITE_MANY pour un accès en lecture/écriture à partir de plusieurs VM.
    • (Par défaut) READ_WRITE_SINGLE pour un accès en lecture/écriture à partir d'une instance.

REST

Envoyez une requête PATCH à la compute.disks.update méthode. Dans le corps de la requête, définissez le mode d'accès en incluant le paramètre accessMode.

PATCH https://compute./compute/v1/projects/PROJECT_ID/zones/ZONE/disks/DISK_NAME/update
{
   "accessMode": "DISK_ACCESS_MODE"
}

Remplacez les éléments suivants :

  • PROJECT_ID : ID de votre projet.
  • ZONE : zone où se trouve votre volume Hyperdisk.
  • DISK_NAME: nom du volume Hyperdisk à modifier.
  • DISK_ACCESS_MODE : mode d'accès des instances aux données sur le disque. Les valeurs compatibles sont :
    • READ_ONLY_MANY pour un accès en lecture seule à partir de plusieurs instances.
    • READ_WRITE_MANY pour un accès en lecture/écriture à partir de plusieurs VM.
    • READ_WRITE_SINGLEpour le mode écriture unique, c'est-à-dire un accès en lecture/écriture à partir d'une 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