Modifier le type de machine d'une instance de VM


Si votre VM ne dispose pas de disque SSD local et ne fait pas partie d'un groupe d'instances géré (MIG), vous pouvez modifier le type de machine de votre VM après l'avoir arrêtée.

Si votre type de machine existant ne convient pas aux charges de travail que vous exécutez sur votre VM, modifiez son type. Vous pouvez modifier le type de machine d'une VM pour ajuster le nombre de processeurs virtuels et la quantité de mémoire à mesure que votre charge de travail évolue. Par exemple, vous pouvez commencer avec un type de machine plus modeste pour la configuration, le développement et les tests, puis modifier la VM pour passer à un type plus puissant lorsque vous êtes prêt à traiter des charges de travail de production.

Pour les VM sans disque SSD local et ne faisant pas partie d'un MIG, vous pouvez modifier le type de machine sans affecter les ressources suivantes :

  • Les clés SSH de la VM
  • Les configurations de la VM, telles que les métadonnées de la VM
  • Les données de disque persistant de la VM, y compris les applications installées et les données d'application

Si vous devez modifier le type de machine des VM au sein d'un MIG, consultez la section Appliquer automatiquement les mises à jour de configuration de VM dans un MIG.

Avant de commencer

  • Découvrez comment arrêter une VM.
  • Consultez la documentation relative aux types de machines.
  • 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 services et aux API Google Cloud. Pour exécuter du code ou des exemples depuis un environnement de développement local, vous pouvez vous authentifier auprès de Compute Engine comme suit :

    Sélectionnez l'onglet correspondant à la façon dont vous prévoyez d'utiliser les exemples de cette page :

    Console

    Lorsque vous utilisez la console Google Cloud pour accéder aux services et aux API Google Cloud, vous n'avez pas besoin de configurer l'authentification.

    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. Installez Google Cloud CLI.
    2. Pour initialiser gcloudCLI, exécutez la commande suivante :

      gcloud init
    3. Créez des identifiants d'authentification locaux pour votre compte Google :

      gcloud auth application-default login

    Pour en savoir plus, consultez les sections sur Configurer l'authentification pour un environnement de développement local.

    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. Installez Google Cloud CLI.
    2. Pour initialiser gcloudCLI, exécutez la commande suivante :

      gcloud init
    3. Créez des identifiants d'authentification locaux pour votre compte Google :

      gcloud auth application-default login

    Pour en savoir plus, consultez les sections sur Configurer l'authentification pour un environnement de développement local.

    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.

      Installez Google Cloud CLI, puis initialisez-la en exécutant la commande suivante :

      gcloud init

Limites

Implications en termes de facturation

Chaque type de machine est facturé à un tarif différent. Assurez-vous donc de bien comprendre les implications en termes de facturation qui découlent de la modification du type de machine. Par exemple, un type de machine e2-standard-2 coûte plus cher qu'un type de machine e2-micro.

La modification d'un type de machine peut également affecter vos remises automatiques proportionnelles à une utilisation soutenue pour cette VM. Les remises automatiques proportionnelles à une utilisation soutenue sont calculées séparément selon les différentes catégories d'une même région. Si vous modifiez les types de machines pour que le nouveau type de machine appartienne à une autre catégorie, la prochaine durée d'exécution de la VM sera comptabilisée dans la remise liée à la nouvelle catégorie.

Imaginons par exemple que vous disposiez d'une VM dotée du type de machine n2-standard-2, qui s'exécute depuis 15 jours. Vous décidez de remplacer le type de machine par m1-ultramem-40. Une fois la modification effectuée, Compute Engine commence à comptabiliser la durée d'exécution de la VM dans la remise pour utilisation soutenue liée au processeur virtuel à mémoire optimisée et à la catégorie de mémoire.

Sur votre facture, vous constaterez une remise appliquée au type de machine n2-standard-2 avant sa modification, ainsi qu'une remise séparée appliquée au type m1-ultramem-40 (à condition que votre instance conserve le type m1-ultramem-40 pour une durée égale à au moins 25 % du reste du mois).

Bonnes pratiques

Voici quelques bonnes pratiques qui vous aideront à modifier le type de machine d'une VM.

  • Effectuez des sauvegardes régulières de vos données de disque persistant à l'aide d'instantanés. Envisagez de prendre un instantané de vos données de disque persistant avant de modifier le type de machine. Vous pouvez vous assurer que le nouveau type de machine saura traiter les données de la VM existante en prenant un instantané de disque persistant, puis en démarrant une deuxième VM possédant le nouveau type à partir de cet instantané pour vérifier qu'elle se lance bien.

  • Ajoutez des disques persistants supplémentaires au fichier /etc/fstab. Si des disques persistants supplémentaires sont associés à votre VM, veillez à les ajouter au fichier /etc/fstab afin qu'ils soient installés automatiquement au redémarrage de la VM.

  • Créez une réservation avant de modifier le type de machine. Pour éviter les erreurs liées à la disponibilité des ressources, créez des réservations Compute Engine pour les nouveaux types de machines lorsqu'ils sont disponibles pour les réserver dans une zone. Les réservations vous permettent de vous assurer que les ressources sont disponibles lorsque vous en avez besoin.

Pour créer une réservation, procédez comme suit :

  1. Créez une réservation (ou identifiez les réservations existantes) avec des propriétés identiques aux VM planifiées. Le nombre de VM de la réservation doit être supérieur ou égal au nombre de VM que vous souhaitez modifier. Vous pouvez éventuellement empêcher les autres VM d'utiliser cette réservation en utilisant l'option specificReservationRequired.

  2. Vérifiez que les VM planifiées pourront utiliser la réservation :

    1. Vérifiez que les VM souhaitées ont l'affinité de réservation appropriée.
    2. Immédiatement avant de modifier les VM, assurez-vous que la réservation dispose d'une capacité suffisante.

Modifier un type de machine

Vous ne pouvez modifier le type de machine d'une VM que si elle est arrêtée. Une VM n'est considérée comme arrêtée que lorsqu'elle possède l'état TERMINATED. Il n'est pas possible de modifier le type de machine d'une VM en cours d'exécution.

Si vous mettez à niveau votre type de machine vers la dernière génération, consultez la section Déplacer votre VM vers la série de machines de troisième génération avant de continuer.

Autorisations requises pour cette tâche

Pour effectuer cette tâche, vous devez disposer des autorisations suivantes :

  • compute.instances.setMachineType sur la VM

Console

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

    Accéder à la page "Instances de VM"

  2. Dans la colonne Nom, cliquez sur le nom de la VM pour laquelle vous souhaitez modifier le type de machine.

  3. Sur la page des détails de l'instance de VM, procédez comme suit :

    1. Si la VM est en cours d'exécution, sélectionnez Arrêter dans le menu situé en haut de la page afin de l'arrêter.
    2. Pour modifier la VM, cliquez sur Modifier.
    3. Dans la section Configuration de la machine, sélectionnez le type de machine que vous souhaitez utiliser ou créez un type de machine personnalisé.

    4. Pour enregistrer vos modifications, cliquez sur Enregistrer.

    5. Redémarrez la VM.

gcloud

  1. Arrêtez la VM à l'aide de la commande gcloud compute instances stop :

    gcloud compute instances stop VM_NAME
    

    Remplacez VM_NAME par la VM contenant le type de machine à modifier.

  2. Modifiez le type de machine à l'aide de la commande gcloud compute instances set-machine-type :

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

    Remplacez NEW_MACHINE_TYPE par le nouveau type de machine pour la VM. Il peut s'agir de l'un des types de machines suivants :

  3. Arrêtez la VM à l'aide de la commande gcloud compute instances start :

    gcloud compute instances start VM_NAME
    

    Remplacez VM_NAME par le nom de la VM que vous avez modifiée.

Java

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

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 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. Arrêtez la VM à l'aide de la méthode instances.stop :

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

    Remplacez les éléments suivants :

    • PROJECT_ID : ID du projet

    • ZONE : zone contenant la VM.

    • VM_NAME : VM contenant le type de machine à modifier.

  2. Modifiez le type de machine à l'aide de la méthode instances.setMachineType :

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

    Dans le corps de la requête, indiquez le machineType mis à jour :

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

    Remplacez les éléments suivants :

    • MACHINE_TYPE_ZONE : zone contenant le type de machine.

    • NEW_MACHINE_TYPE : nouveau type de machine pour la VM.

      Il peut s'agir de l'un des types de machines suivants :

  3. Démarrez la VM à l'aide de la méthode instances.start :

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

    Remplacez les éléments suivants :

    • PROJECT_ID : ID du projet
    • ZONE : zone contenant la VM.
    • VM_NAME : nom de la VM que vous avez modifiée.

Passer à un type de machine plus petit

Si vous passez d'un type de machine disposant d'importantes ressources à un type qui en comporte moins (de e2-standard-8 à e2-standard-2, par exemple), vous risquez d'être confronté à des problèmes de ressources matérielles ou à des limites de performances. Les types de machines plus petits sont en effet moins puissants que les plus grands. Assurez-vous que votre nouveau type de machine puisse traiter l'ensemble des applications ou services en cours d'exécution sur la VM, ou mettez à jour vos services et applications pour qu'ils puissent s'exécuter sur les types de machines plus petits.

Consultez les recommandations de dimensionnement avant de modifier le type de machine. Pour en savoir plus sur les recommandations de dimensionnement de Compute Engine, consultez la page Appliquer les recommandations de types de machines pour des instances de VM.

Déplacer votre VM vers la série de machines de troisième génération

Lorsque les conditions sont remplies, vous pouvez modifier votre VM pour utiliser un type de machine dans une série de machines de nouvelle génération en modifiant le type de machine, par exemple de m1-ultramem-160 à m3-ultramem-128.

Les types de machines de troisième génération et les types de machines Arm T2A peuvent ne pas être compatibles avec les mêmes fonctionnalités et interfaces que votre type de machine actuel. Avant de commencer le processus de migration, consultez les exigences et les considérations de la section Préparer le déplacement vers une nouvelle VM.

Pour remplacer le type de machine de votre instance de VM par un type de machine de troisième génération, vous pouvez utiliser l'une des approches suivantes.

Créer une instance de VM et déplacer votre charge de travail

Dans cette procédure, vous créez une instance de VM, puis vous déplacez votre charge de travail vers la nouvelle VM.

Pour en savoir plus sur la procédure à suivre, consultez la section Déplacer votre charge de travail d'une VM existante vers une nouvelle VM.

Remplacer le type de machine par un nouveau type de machine

Dans cette procédure, vous vérifiez que votre instance de VM actuelle peut être mise à jour pour utiliser le nouveau type de machine, puis vous modifiez le type de machine.

  1. Vérifiez que votre instance de VM actuelle utilise une version de système d'exploitation compatible avec le nouveau type de machine. Si la version n'est pas compatible, suivez les instructions de la section Déplacer votre charge de travail d'une VM existante vers une nouvelle VM.

  2. Si vous souhaitez remplacer le type de machine de votre VM par un type de machine T2A, suivez les instructions de la section Déplacer votre charge de travail d'une VM existante vers une nouvelle VM.

  3. Si votre VM actuelle est associée à un disque SSD local, suivez les instructions de la section Déplacer votre charge de travail d'une VM existante vers une nouvelle VM.

  4. Vérifiez que vos applications et vos programmes sont compatibles avec une autre interface réseau ou de stockage, telle que gVNIC ou NVMe.

  5. Consultez les bonnes pratiques de modification du type de machine d'une VM.

  6. Suivez la procédure décrite à la section Modifier un type de machine.

Étapes suivantes