Edita el tipo de máquina de una instancia de procesamiento


Si tu instancia de máquina virtual (VM) no tiene un SSD local adjunto y no forma parte de un grupo de instancias administrado (MIG), puedes cambiar el tipo de máquina de la instancia después de detenerla.

Si el tipo de máquina existente no es adecuado para las cargas de trabajo que ejecutas en la VM, cambia el tipo de máquina de esa VM. Por ejemplo, puedes iniciar una VM con un tipo de máquina más pequeña durante el proceso de configuración, desarrollo y prueba, y cambiar la VM a fin de usar un tipo de máquina más grande cuando estés listo para las cargas de trabajo de producción.

Puedes usar este procedimiento en las siguientes situaciones:

  • Para cambiar a un tipo de máquina similar, pero con una cantidad diferente de CPU virtuales o memoria dentro de la misma serie de máquinas, por ejemplo:
    • Puedes cambiar n2-highcpu-4 a n2-standard-4.
    • Puedes cambiar c3d-standard-30 a c3d-highmem-30.
  • Para cambiar el tipo de máquina y usar una serie de máquinas diferente. Esto solo es compatible con las series de máquinas de primera y segunda generación, excepto las series de máquinas T2A y A2. Por ejemplo:
    • Puedes cambiar n2-standard-4 a c2-standard-8.
    • Puedes cambiar n1-highmem-4 a n2d-standard-16.

Si deseas cambiar el tipo de máquina de una VM que usa una serie de máquinas de primera o segunda generación (N1, N2, M1, etc.) a un tipo de máquina de una serie de máquinas de tercera generación o posterior (M3, C3, N4, etc.), debes usar el procedimiento documentado en Mueve tu carga de trabajo a una instancia de procesamiento nueva.

Puedes cambiar el tipo de máquina sin afectar los siguientes recursos:

  • Las claves SSH de la VM
  • Los parámetros de configuración de la VM, como los metadatos de VM
  • Los datos del Persistent Disk o Hyperdisk conectado, incluidos los datos de aplicaciones y las aplicaciones instaladas

Para cambiar el tipo de máquina de las VMs dentro de un MIG, consulta Aplica de forma automática las actualizaciones de configuración de VM en un MIG.

Antes de comenzar

  • Obtén más información sobre cómo detener una VM.
  • Obtén información sobre los tipos de máquina.
  • Si aún no lo hiciste, configura la autenticación. La autenticación es el proceso mediante el cual se verifica tu identidad para acceder a los servicios y las API de Google Cloud. Para ejecutar código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:

    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.

    Java

    Para usar las muestras de Java de esta página en un entorno de desarrollo local, instala e inicializa gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. 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.

    Para obtener más información, consulta Set up authentication for a local development environment.

    Python

    Para usar las muestras de Python de esta página en un entorno de desarrollo local, instala e inicializa gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. 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.

    Para obtener más información, consulta Set up authentication for a local development environment.

    REST

    Para usar las muestras de la API de REST en esta página en un entorno de desarrollo local, debes usar las credenciales que proporcionas a la CLI de gcloud.

      Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init

    Si deseas obtener más información, consulta Autentica para usar REST en la documentación de autenticación de Google Cloud.

Roles obligatorios

Para obtener los permisos que necesitas para cambiar el tipo de máquina de una VM, 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.

Estos roles predefinidos contienen los permisos necesarios para cambiar el tipo de máquina de una VM. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para cambiar el tipo de máquina de una VM:

  • compute.instances.setMachineType en la VM
  • compute.instances.start en la VM
  • compute.instances.stop en la VM

También puedes obtener estos permisos con roles personalizados o con otros roles predefinidos.

Limitaciones

  • Si tu instancia de procesamiento tiene uno o más SSD locales, no puedes cambiar el tipo de máquina de la instancia.
  • Si la instancia usa una dirección IP externa efímera, es posible que la dirección IP cambie cuando modifiques el tipo de máquina de la instancia. Para conservar la dirección IP, asciéndela a una dirección IP externa estática antes de cambiar el tipo de máquina.
  • Cambiar el tipo de máquina de una instancia de procesamiento no está disponible para algunas configuraciones:

Implicaciones de facturación

Cada tipo de máquina se factura a una tarifa diferente. Por lo tanto, asegúrate de comprender las implicaciones de precios del cambio de tipos de máquina. Por ejemplo, un tipo de máquina e2-standard-2 cuesta más que uno e2-micro.

Cambiar un tipo de máquina también puede influir en los descuentos por uso continuo para esa VM. Los descuentos por uso continuo se calculan por separado para diferentes categorías en la misma región. Si cambias los tipos de máquina a fin de que el tipo de máquina nuevo esté en una categoría diferente, el tiempo de ejecución posterior de la VM de máquina virtual se considera para el descuento por uso continuo de la categoría nueva.

Por ejemplo, supongamos que tienes una VM con el tipo de máquina n2-standard-2 que se ejecuta durante medio mes. Luego, decides cambiar el tipo de máquina a m1-ultramem-40. Una vez que realizas ese cambio, Compute Engine comienza a considerar el tiempo de ejecución de la instancia de VM para el descuento por uso continuo de la categoría de CPU virtual con optimización de memoria y memoria.

En tu factura, verás un descuento por uso continuo aplicado al tipo de máquina n2-standard-2 antes de realizar el cambio y un descuento por uso continuo para m1-ultramem-40, si la VM se sigue ejecutando en m1-ultramem-40 durante al menos el 25% del resto del mes.

Pasa a un tipo de máquina más pequeño

Si pasas de un tipo de máquina con más recursos a uno con menos recursos, como pasar de un tipo de máquina e2-standard-8 a uno e2-standard-2, podrías tener problemas de recursos de hardware o limitaciones de rendimiento dado que los tipos de máquina más pequeños son menos eficaces que los tipos de máquina más grandes. Asegúrate de que el tipo de máquina nuevo sea compatible con cualquier aplicación o servicio que se esté ejecutando en la VM actual, o de actualizar los servicios y las aplicaciones para que se ejecuten en los tipos de máquina más pequeños.

Revisa las recomendaciones de redimensionamiento antes de cambiar el tipo de máquina. Para obtener información sobre las recomendaciones de tamaño de Compute Engine, consulta Aplica recomendaciones de tipo de máquina para instancias de VM.

Prácticas recomendadas

Estas son algunas de las prácticas recomendadas que ofrecemos para ayudarte a cambiar correctamente el tipo de máquina de VM.

  • Haz copias de seguridad regulares de los datos del Persistent Disk mediante instantáneas. Considera tomar una instantánea de los datos del Persistent Disk antes de cambiar el tipo de máquina. Si deseas asegurarte de que el tipo de máquina nuevo sea compatible con los datos de la VM existente, puedes tomar una instantánea del Persistent Disk y usarla para iniciar una segunda VM con el tipo de máquina nuevo para confirmar que la VM se inicia correctamente.

  • Agrega discos adicionales al archivo /etc/fstab. Si tienes discos adicionales adjuntos a tu VM, asegúrate de que se agreguen al archivo /etc/fstab para que se activen de forma automática cuando se reinicie la VM.

  • Crea una reserva antes de cambiar el tipo de máquina. Para evitar errores relacionados con la disponibilidad de recursos, crea Reservas de Compute Engine para los nuevos tipos de máquinas cuando están disponibles para reservarlos dentro de una zona. Las reservas ayudan a garantizar que los recursos estén disponibles cuando los necesites.

Para crear una reserva, completa los siguientes pasos:

  1. Crea una reserva (o identifica las reservas existentes) con propiedades idénticas a las VMs planificadas. El recuento de VM de la reserva debe ser igual o mayor que la cantidad de VMs que deseas cambiar. De forma opcional, para evitar que otras VMs consuman esta reserva, usa la opción specificReservationRequired.

  2. Verifica que las VMs planificadas puedan consumir la reserva:

    1. Verifica que las VMs tengan la afinidad de reserva correcta.
    2. Inmediatamente antes de cambiar las VMs, asegúrate de que la reserva tenga suficiente capacidad.

Cambia un tipo de máquina

Solo puedes cambiar el tipo de máquina de una instancia detenida. Una VM se considera detenida solo cuando está en estado TERMINATED. No puedes cambiar el tipo de máquina de una VM en ejecución.

Si quieres actualizar tu tipo de máquina a la última generación, revisa Evalúa las opciones de migración de VMs antes de continuar.

Console

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

    Ir a Instancias de VM

  2. En la columna Nombre, haz clic en el nombre de la VM en la que deseas cambiar el tipo de máquina.

  3. En la página de detalles de la instancia de VM, completa los siguientes pasos:

    1. Si la VM se está ejecutando, en el menú en la parte superior de la página, selecciona Detener para detener la VM.
    2. Para editar la VM, haz clic en Editar.
    3. En la sección Configuración de la máquina, selecciona el tipo de máquina que deseas usar o crea un tipo personalizado de máquina.

    4. Para guardar los cambios, haz clic en Guardar.

    5. Reinicia la VM.

gcloud

  1. Detén la VM mediante el comando gcloud compute instances stop:

    gcloud compute instances stop VM_NAME
    

    Reemplaza VM_NAME por la VM que contiene el tipo de máquina que deseas cambiar.

  2. Cambia el tipo de máquina con el comando gcloud compute instances set-machine-type:

    gcloud compute instances set-machine-type VM_NAME \
        --machine-type NEW_MACHINE_TYPE
    

    Reemplaza NEW_MACHINE_TYPE con el nuevo tipo de máquina para la VM. El tipo de máquina puede ser uno de los siguientes:

  3. Inicia la VM con el comando gcloud compute instances start:

    gcloud compute instances start VM_NAME
    

    Reemplaza VM_NAME por el nombre de la VM que cambiaste.

Java

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.Instance.Status;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.InstancesSetMachineTypeRequest;
import com.google.cloud.compute.v1.Operation;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ChangeInstanceMachineType {

  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 zone your instance belongs to.
    String zone = "zone-name";
    // Name of the VM you want to modify.
    String instanceName = "instance-name";
    // The new machine type you want to use for the VM.
    // For example: "e2-standard-8", "e2-custom-4-2048" or "m1-ultramem-40"
    // More about machine types: https://cloud.google.com/compute/docs/machine-resource
    String newMachineType = "e2-standard-8";
    changeMachineType(projectId, zone, instanceName, newMachineType);
  }

  // Changes the machine type of VM.
  // The VM needs to be in the 'TERMINATED' state for this operation to be successful.
  public static void changeMachineType(String projectId, String zone, String instanceName,
      String newMachineType)
      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()) {

      Instance instance = instancesClient.get(projectId, zone, instanceName);
      if (!instance.getStatus().equals(Status.TERMINATED.name())) {
        throw new Error(String.format(
            "Only machines in TERMINATED state can have their machine type changed. "
                + "%s is in %s state.", instance.getName(), instance.getStatus()));
      }

      InstancesSetMachineTypeRequest machineTypeRequest =
          InstancesSetMachineTypeRequest.newBuilder()
              .setMachineType(String.format("projects/%s/zones/%s/machineTypes/%s",
                  projectId, zone, newMachineType))
              .build();

      Operation response = instancesClient
          .setMachineTypeAsync(projectId, zone, instanceName, machineTypeRequest)
          .get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        System.out.println("Machine type update failed! " + response);
        return;
      }
      System.out.println("Machine type update - operation status: " + response.getStatus());
    }
  }
}

Python

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 change_machine_type(
    project_id: str, zone: str, instance_name: str, new_machine_type: str
) -> None:
    """
    Changes the machine type of VM. The VM needs to be in the 'TERMINATED' state for this operation to be successful.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone your instance belongs to.
        instance_name: name of the VM you want to modify.
        new_machine_type: the new machine type you want to use for the VM.
            For example: `e2-standard-8`, `e2-custom-4-2048` or `m1-ultramem-40`
            More about machine types: https://cloud.google.com/compute/docs/machine-resource
    """
    client = compute_v1.InstancesClient()
    instance = client.get(project=project_id, zone=zone, instance=instance_name)

    if instance.status != compute_v1.Instance.Status.TERMINATED.name:
        raise RuntimeError(
            f"Only machines in TERMINATED state can have their machine type changed. "
            f"{instance.name} is in {instance.status}({instance.status_message}) state."
        )

    machine_type = compute_v1.InstancesSetMachineTypeRequest()
    machine_type.machine_type = (
        f"projects/{project_id}/zones/{zone}/machineTypes/{new_machine_type}"
    )
    operation = client.set_machine_type(
        project=project_id,
        zone=zone,
        instance=instance_name,
        instances_set_machine_type_request_resource=machine_type,
    )

    wait_for_extended_operation(operation, "changing machine type")

REST

  1. Detén la VM mediante el método instances.stop:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/stop
    

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID del proyecto

    • ZONE: la zona que contiene la VM

    • VM_NAME: la VM que contiene el tipo de máquina que se debe cambiar

  2. Para cambiar el tipo de máquina, usa el método instances.setMachineType:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMachineType
    

    En el cuerpo de la solicitud, proporciona el machineType actualizado:

    {
        machineType: "zones/MACHINE_TYPE_ZONE/machineTypes/NEW_MACHINE_TYPE"
    }
    

    Reemplaza lo siguiente:

    • MACHINE_TYPE_ZONE: la zona que contiene el tipo de máquina

    • NEW_MACHINE_TYPE: el tipo de máquina nuevo para la VM

      El tipo de máquina puede ser uno de los siguientes:

  3. Detén la VM mediante el método instances.start:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/start
    

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID del proyecto
    • ZONE: la zona que contiene la VM
    • VM_NAME: El nombre de la VM que cambiaste.

¿Qué sigue?