Modifica la configuración de un Persistent Disk o de Google Cloud Hyperdisk

Puedes usar volúmenes de Google Cloud Hyperdisk y Persistent Disk como discos de arranque y discos de datos para instancias de Compute Engine.

En este documento, se explica cómo completar las siguientes tareas:

  • Crea un disco nuevo que contenga los datos del disco original para convertirlo en otro tipo de Persistent Disk o Hyperdisk. Según el tipo de disco nuevo que elijas, puedes obtener los siguientes beneficios:

    • Alcanza niveles de rendimiento más altos si eliges un tipo de disco más rápido
    • Reducir los costos si eliges un tipo de disco más rentable
  • Configura si Compute Engine borra los discos de arranque o de datos de una instancia de procesamiento cuando borras la instancia. Se generan costos por un disco hasta que lo borras, incluso si no está conectado a ninguna instancia. Puedes reducir los costos si habilitas la eliminación automática de los discos que no necesitarás después de que se borre la instancia adjunta.

  • Actualiza el modo de acceso de un volumen de Hyperdisk para habilitar o inhabilitar el acceso al volumen desde varias instancias de Compute Engine.

Para cambiar el tamaño de un volumen de Hyperdisk o Persistent Disk, consulta Cómo modificar el tamaño o el rendimiento aprovisionado de un volumen de Hyperdisk y Cómo modificar el tamaño de un disco persistente, respectivamente.

Cambia el tipo de un volumen de Persistent Disk

A veces, debes cambiar el tipo de un volumen de Persistent Disk en particular para satisfacer tus requisitos de rendimiento o precios. Por ejemplo, es posible que desees cambiar el disco de datos de una carga de trabajo de un disco persistente estándar a un Persistent Disk balanceado.

No puedes cambiar directamente el tipo de un volumen de Persistent Disk existente. Debes crear una instantánea del disco existente y, luego, usar esa instantánea para crear un disco del tipo nuevo.

Para cambiar un volumen de Persistent Disk (el disco de origen) a otro tipo de Persistent Disk (el disco nuevo), sigue este proceso:

  1. Si el disco de origen está conectado a una instancia de procesamiento, detén la instancia.

  2. Crea una instantánea del disco de origen.

  3. Crea el disco nuevo a partir de la instantánea del disco de origen.

  4. Para comenzar a usar el disco nuevo, desconecta el disco fuente de la instancia y conecta el disco nuevo que acabas de crear.

  5. Inicia la instancia.

  6. Verifica que el disco nuevo funcione según lo esperado.

  7. Después de probar el disco nuevo, puedes borrar la instantánea y borrar el disco de origen. Se te seguirán cobrando cargos por el disco de origen y la instantánea hasta que los borres.

Modifica la configuración de eliminación automática de un disco

Para evitar la pérdida accidental de datos, puedes controlar si Compute Engine borra automáticamente alguno de los volúmenes de Hyperdisk o Persistent Disk de Google Cloud que se adjuntan a una instancia cuando borras la instancia. Los discos SSD locales siempre se borran junto con la instancia.

La propiedad autoDelete de cada volumen de Google Cloud Hyperdisk o Persistent Disk conectado a la instancia controla este comportamiento.

Para conservar un volumen específico cuando borres la instancia, establece la propiedad autoDelete del volumen en false. Por el contrario, para borrar un volumen cuando borras la instancia, establece la propiedad autoDelete en true.

No puedes borrar automáticamente un disco si está conectado a la instancia en modo de solo lectura.

Console

  1. En la consola de Google Cloud , ve a la página Instancias de VM.

    Ir a Instancias de VM

  2. Selecciona la instancia que tiene los discos asociados.

  3. Haga clic en el nombre de la instancia. Aparecerá la página Detalles de instancia de VM.

  4. Haz clic en Editar.

  5. Para actualizar el parámetro de configuración de eliminación automática de tus discos, en la sección Almacenamiento, sigue estos pasos:

    • En el disco de arranque, debajo del encabezado Disco de arranque, selecciona la Regla de eliminación del disco de arranque.
    • Para cada disco adicional conectado a la instancia, busca el disco en la sección Discos adicionales y, luego, sigue estos pasos:
      1. Haz clic en Editar disco. Se abrirá el panel Disco existente.
      2. En Modo de conexión, configura la Regla de eliminación del disco. Para guardar el parámetro de configuración del disco y cerrar el panel, haz clic en Guardar.
  6. Para guardar los cambios, haz clic en Guardar.

gcloud

Establece el estado de eliminación automática de un disco con el comando gcloud compute instances set-disk-auto-delete.

Para conservar el disco cuando borres la instancia, especifica la marca --no-auto-delete. Para borrar el disco, especifica la marca --auto-delete.

Si la instancia tiene varios discos conectados, debes ejecutar el comando para cada disco conectado a la instancia.

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

Reemplaza lo siguiente:

  • INSTANCE_NAME: El nombre de la instancia.
  • AUTO_DELETE_SETTING: Indica si se debe borrar automáticamente el disco. Especifica --no-auto-delete para conservar el disco después de borrar la instancia de procesamiento y --auto-delete para borrar el disco al mismo tiempo que la instancia.
  • DISK_NAME: el nombre del disco.

Go

Antes de probar esta muestra, sigue las instrucciones de configuración de Go en la Guía de inicio rápido de Compute Engine: Usa las bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Go de Compute Engine.

Para autenticarte en Compute Engine, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo 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

Antes de probar esta muestra, sigue las instrucciones de configuración de Java en la Guía de inicio rápido de Compute Engine: Usa las bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Java de Compute Engine.

Para autenticarte en Compute Engine, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo 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

Antes de probar esta muestra, sigue las instrucciones de configuración de Node.js en la Guía de inicio rápido de Compute Engine: Usa las bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Node.js de Compute Engine.

Para autenticarte en Compute Engine, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo 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

Antes de probar esta muestra, sigue las instrucciones de configuración de Python en la Guía de inicio rápido de Compute Engine: Usa las bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Python de Compute Engine.

Para autenticarte en Compute Engine, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo 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

Para establecer el estado de eliminación automática con la API, realiza una solicitud POST al método instances.setDiskAutoDelete. Usa el parámetro autoDelete para indicar si se debe borrar el disco.

Si la instancia tiene varios discos conectados, debes realizar una solicitud para cada disco conectado a la instancia.

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

Reemplaza lo siguiente:

  • PROJECT_ID: el ID de tu proyecto
  • ZONE: La zona en la que se encuentran la instancia y el disco
  • INSTANCE_NAME: el nombre de tu instancia
  • DISK_NAME: Es el nombre del disco conectado a la instancia.
  • AUTO_DELETE_OPTION: Indica si se debe borrar automáticamente el disco cuando se borra la instancia. Para borrar el disco, configúralo como true. Establece en false para conservar el disco después de borrar la instancia.

Modo de acceso para volúmenes de Hyperdisk

Para compartir un volumen de Hyperdisk entre varias instancias y otorgar a cada instancia acceso simultáneo de solo lectura o lectura y escritura al volumen, debes establecer el modo de acceso del volumen en modo de solo lectura o de varios escritores, respectivamente.

Por otro lado, para realizar ciertas acciones, como crear una imagen, en un volumen de Hyperdisk que esté en modo de solo lectura o de varios escritores, debes establecer su modo de acceso en un solo escritor.

En esta sección, se describe cómo configurar el modo de acceso de un disco.

Para obtener más información sobre el uso compartido de discos, consulta Comparte discos entre instancias.

Limitaciones para los cambios en el modo de acceso

  • No puedes establecer el modo de acceso de un disco a menos que desconectes el disco de todas las instancias.

  • Los volúmenes de Hyperdisk Throughput solo admiten el modo de un solo escritor y no puedes establecer el modo de acceso para un volumen de Hyperdisk Throughput.

  • En el caso de los volúmenes de Hyperdisk Balanced, Hyperdisk Extreme y Hyperdisk Balanced High Availability, solo puedes habilitar o inhabilitar el modo de varios escritores. No puedes establecer el modo de acceso como de solo lectura.

  • En el caso de los volúmenes de Hyperdisk ML, solo puedes establecer el modo de acceso como de solo lectura. Los volúmenes de Hyperdisk ML no admiten el modo de varios escritores.

  • No puedes modificar el modo de acceso de un volumen de Hyperdisk ML después de configurarlo como de solo lectura.

Roles y permisos requeridos

Para obtener el permiso que necesitas para establecer el modo de acceso de un disco, pídele a tu administrador que te otorgue los siguientes roles de IAM en el proyecto:

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

Este rol predefinido contiene el permiso compute.disks.update, que se requiere para establecer el modo de acceso de un disco.

También puedes obtener este permiso con roles personalizados o con otros roles predefinidos.

Establece el modo de acceso de un volumen de Hyperdisk

Antes de configurar el modo de acceso de un disco, debes separar el disco de todas las instancias.

Puedes configurar el modo de acceso con la consola de Google Cloud , Google Cloud CLI o REST.

Console

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

    Ir a Discos

  2. En la lista de discos de tu proyecto, haz clic en el nombre del volumen de Hyperdisk que deseas modificar.

  3. En la página de detalles del disco, haz clic en Editar.

  4. En el campo Modo de acceso, selecciona el modo de acceso que desees:

    • Para habilitar el modo de solo lectura, selecciona Solo lectura en varias VMs.
    • Para habilitar el modo de multiescritura, selecciona Lectura y escritura en varias VMs.
    • (Predeterminado) Para habilitar el modo de un solo escritor, selecciona Lectura y escritura en una sola VM.
  5. Para aplicar los cambios, haz clic en Guardar.

gcloud

Ejecuta el comando disks update y especifica el modo de acceso con la marca --access-mode.

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

Reemplaza lo siguiente:

  • DISK_NAME: el nombre del volumen de Hyperdisk que se modifica.
  • DISK_ACCESS_MODE: Cómo pueden las instancias acceder a los datos del disco Los valores admitidos son
      .
    • READ_ONLY_MANY, para el acceso de solo lectura desde varias instancias.
    • READ_WRITE_MANY, para el acceso de lectura/escritura desde varias instancias.
    • READ_WRITE_SINGLE (predeterminado), para el acceso de lectura y escritura desde una instancia.

REST

Realiza una solicitud PATCH al método compute.disks.update. En el cuerpo de la solicitud, configura el modo de acceso incluyendo el parámetro accessMode.

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

Reemplaza lo siguiente:

  • PROJECT_ID: el ID de tu proyecto.
  • ZONE: la zona en la que se encuentra el volumen de hiperdisco.
  • DISK_NAME: el nombre del volumen de Hyperdisk que se modificará.
  • DISK_ACCESS_MODE: Cómo pueden las instancias acceder a los datos del disco Los valores admitidos son
      .
    • READ_ONLY_MANY, para el acceso de solo lectura desde varias instancias.
    • READ_WRITE_MANY, para el acceso de lectura/escritura desde varias instancias.
    • READ_WRITE_SINGLE, para el modo de un solo escritor, es decir, acceso de lectura y escritura desde una instancia.

Soluciona problemas

A fin de encontrar métodos para diagnosticar y resolver problemas relacionados con los discos completos y el cambio de tamaño de los discos, consulta Soluciona problemas de discos completos y cambio de tamaño de disco.

¿Qué sigue?