Arrêter ou redémarrer une instance Compute Engine

Ce document explique comment arrêter ou redémarrer manuellement une instance Compute Engine. Pour automatiser l'arrêt ou le redémarrage d'une instance de calcul, consultez les ressources suivantes :

Il est possible d'arrêter manuellement une instance de calcul. Une fois l'opération d'arrêt terminée et l'état de l'instance de calcul passé à TERMINATED, vous pouvez redémarrer l'instance de calcul pour reprendre votre charge de travail ou la supprimer définitivement si vous n'en avez plus besoin. L'arrêt manuel d'une instance de calcul est utile lorsque vous souhaitez effectuer les opérations suivantes :

  • Réduire les coûts tout en conservant vos configurations : vous ne souhaitez plus exécuter de charges de travail sur l'instance de calcul. Toutefois, vous souhaitez conserver l'instance de calcul et ses disques associés, ses paramètres de configuration, ses adresses IP, ses adresses MAC et ses métadonnées. Si vous devez également conserver les données en mémoire et l'état de l'application, suspendez l'instance de calcul.

  • Mettre à jour les propriétés : vous souhaitez modifier une ou plusieurs propriétés qui nécessitent d'arrêter et de redémarrer l'instance de calcul avant que les modifications ne prennent effet (par exemple, vous souhaitez modifier le type de machine ou dissocier un disque). Pour en savoir plus, consultez la section Propriétés que vous pouvez mettre à jour.

Limites

Lorsque vous arrêtez une instance de calcul, les limites suivantes s'appliquent :

  • Vous ne pouvez arrêter ou redémarrer une instance de calcul que si l'état de l'instance de calcul le permet.

  • Vous ne pouvez redémarrer une instance de calcul que si les ressources sont suffisantes dans la zone où elle se trouve.

  • Vous ne pouvez pas redémarrer les instances de calcul TPU. Une fois que vous avez arrêté des instances de calcul TPU, vous ne pouvez que les supprimer.

Avant de commencer

Rôles requis

Pour obtenir les autorisations nécessaires pour arrêter ou redémarrer une instance de calcul, demandez à votre administrateur de vous accorder le rôle IAM Administrateur d'instances Compute (v1) (roles/compute.instanceAdmin.v1) 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 les autorisations requises pour arrêter ou redémarrer une instance de calcul. Pour connaître les autorisations exactes requises, développez la section Autorisations requises :

Autorisations requises

Les autorisations suivantes sont requises pour arrêter ou redémarrer une instance de calcul :

  • Pour arrêter une instance de calcul : compute.instances.stop sur l'instance de calcul
  • Pour arrêter une instance de calcul à partir de l'OS invité : compute.instances.setMetadata sur l'instance de calcul si elle utilise des clés SSH publiques au niveau de l'instance.
  • Pour redémarrer une instance de calcul : compute.instances.start sur l'instance de calcul
  • Pour redémarrer une instance de calcul qui utilise des clés de chiffrement : compute.instances.startWithEncryptionKey sur l'instance de calcul

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

Arrêter une instance de calcul

Pour arrêter votre instance de calcul, utilisez l'une des méthodes suivantes. La meilleure approche pour votre cas d'utilisation dépend de la présence ou non de disques SSD locaux associés à votre instance de calcul et de la manière dont vous souhaitez gérer les scripts d'arrêt :

  • Arrêter une instance de calcul à partir de Cloud de Confiance. Vous pouvez arrêter une ou plusieurs instances de calcul simultanément à partir de Cloud de Confiance. Si les instances de calcul sont associées à des disques SSD locaux, vous pouvez choisir d'ignorer ou de conserver (preview) les données des disques SSD locaux. Tous les scripts d'arrêt de l'instance de calcul doivent se terminer avant l'arrêt de l'instance de calcul. Pour obtenir des instructions, consultez l'une des pages suivantes :

  • Arrêter une instance de calcul à partir de l'OS invité. Cette approche garantit que l'exécution de vos scripts d'arrêt se termine avant l'arrêt de l'instance de calcul. Si vous avez activé l'arrêt progressif, vous pouvez l'ignorer ou y mettre fin. Toutefois, l'arrêt d'une instance de calcul à partir de l'OS invité supprime les données de tous les disques SSD locaux associés, sauf si vous les sauvegardez d'abord sur un stockage persistant. Pour obtenir des instructions, consultez Arrêter une instance de calcul à partir de l'OS invité.

Arrêter une instance de calcul sans disques SSD locaux

Pour arrêter une instance de calcul à laquelle aucun disque SSD local n'est associé, consultez les options suivantes :

  • Si vous avez activé l'arrêt progressif dans l'instance de calcul, vous pouvez réduire les coûts en ignorant ou en mettant fin à un arrêt progressif en cours. Pour ce faire, utilisez la console Cloud de Confiance , la gcloud CLI ou l'API REST.

  • Pour arrêter plusieurs instances de calcul simultanément, utilisez la consoleCloud de Confiance ou, pour les instances de calcul qui existent dans la même zone, la gcloud CLI.

Pour arrêter une ou plusieurs instances de calcul, sélectionnez l'une des options suivantes :

Console

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

    Accéder à la page Instances de VM

  2. Sélectionnez les instances de calcul en cours d'exécution à arrêter.

  3. Cliquez sur Arrêter. Si l'option Arrêter n'est pas disponible, cliquez sur Autres actions, puis sélectionnez Arrêter.

  4. Dans la boîte de dialogue qui apparaît, procédez comme suit :

    1. Facultatif : Pour arrêter les instances de calcul sans arrêt progressif ou pour mettre fin à un arrêt progressif en cours, cochez la case Ignorer l'arrêt progressif (le cas échéant).

    2. Pour confirmer, cliquez sur Arrêter.

gcloud

Pour arrêter une ou plusieurs instances de calcul existant dans la même zone, utilisez la commande gcloud compute instances stop :

gcloud compute instances stop INSTANCE_NAMES \
    --zone=ZONE

Remplacez les éléments suivants :

  • INSTANCE_NAMES : liste des noms des instances de calcul que vous souhaitez arrêter, séparés par des espaces. Par exemple, spécifiez instance-01 instance-02 instance-03.

  • ZONE : zone où se trouvent les instances de calcul.

Si vous souhaitez ignorer ou mettre fin à un arrêt progressif en cours, utilisez la même commande avec l'option --no-graceful-shutdown :

gcloud compute instances stop INSTANCE_NAMES \
    --no-graceful-shutdown \
    --zone=ZONE

Go

import (
	"context"
	"fmt"
	"io"

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

// stopInstance stops a started Google Compute Engine instance
func stopInstance(w io.Writer, projectID, zone, instanceName string) error {
	// projectID := "your_project_id"
	// zone := "europe-central2-b"
	// instanceName := "your_instance_name"

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

	req := &computepb.StopInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
	}

	op, err := instancesClient.Stop(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to stop instance: %w", err)
	}

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

	fmt.Fprintf(w, "Instance stopped\n")

	return nil
}

Java


import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.Operation.Status;
import com.google.cloud.compute.v1.StopInstanceRequest;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class StopInstance {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    /* project: project ID or project number of the Cloud project your instance belongs to.
       zone: name of the zone your instance belongs to.
       instanceName: name of the instance your want to stop.
     */
    String project = "your-project-id";
    String zone = "zone-name";
    String instanceName = "instance-name";

    stopInstance(project, zone, instanceName);
  }

  // Stops a started Google Compute Engine instance.
  public static void stopInstance(String project, String zone, String instanceName)
      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()) {

      StopInstanceRequest stopInstanceRequest = StopInstanceRequest.newBuilder()
          .setProject(project)
          .setZone(zone)
          .setInstance(instanceName)
          .build();

      OperationFuture<Operation, Operation> operation = instancesClient.stopAsync(
          stopInstanceRequest);
      Operation response = operation.get(3, TimeUnit.MINUTES);

      if (response.getStatus() == Status.DONE) {
        System.out.println("Instance stopped successfully ! ");
      }
    }
  }
}

Node.js

/**
 * 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 compute = require('@google-cloud/compute');

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

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

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

  console.log('Instance stopped.');
}

stopInstance();

PHP

use Google\Cloud\Compute\V1\Client\InstancesClient;
use Google\Cloud\Compute\V1\StopInstanceRequest;

/**
 * Stops a running Google Compute Engine instance.
 *
 * @param string $projectId Project ID or project number of the Cloud project your instance belongs to.
 * @param string $zone Name of the zone your instance belongs to.
 * @param string $instanceName Name of the instance you want to stop.
  *
 * @throws \Google\ApiCore\ApiException if the remote call fails.
 * @throws \Google\ApiCore\ValidationException if local error occurs before remote call.
 */
function stop_instance(
    string $projectId,
    string $zone,
    string $instanceName
) {
    // Stop the Compute Engine instance using InstancesClient.
    $instancesClient = new InstancesClient();
    $request = (new StopInstanceRequest())
        ->setInstance($instanceName)
        ->setProject($projectId)
        ->setZone($zone);
    $operation = $instancesClient->stop($request);

    // Wait for the operation to complete.
    $operation->pollUntilComplete();
    if ($operation->operationSucceeded()) {
        printf('Instance %s stopped successfully' . PHP_EOL, $instanceName);
    } else {
        $error = $operation->getError();
        printf('Failed to stop instance: %s' . PHP_EOL, $error?->getMessage());
    }
}

Python

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 stop_instance(project_id: str, zone: str, instance_name: str) -> None:
    """
    Stops a running Google Compute Engine instance.
    Args:
        project_id: project ID or project number of the Cloud project your instance belongs to.
        zone: name of the zone your instance belongs to.
        instance_name: name of the instance your want to stop.
    """
    instance_client = compute_v1.InstancesClient()

    operation = instance_client.stop(
        project=project_id, zone=zone, instance=instance_name
    )
    wait_for_extended_operation(operation, "instance stopping")

REST

Pour arrêter une instance de calcul, envoyez une requête POST à la méthode instances.stop :

POST https://compute.s3nsapis.fr/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/stop

Remplacez les éléments suivants :

  • INSTANCE_NAME : nom de l'instance de calcul.

  • PROJECT_ID : ID du projet dans lequel l'instance de calcul existe.

  • ZONE : zone où se trouve l'instance de calcul.

Si vous souhaitez ignorer ou mettre fin à un arrêt progressif en cours, incluez le paramètre de requête noGracefulShutdown=true dans l'URL de la requête :

POST https://compute.s3nsapis.fr/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/stop?noGracefulShutdown=true

Arrêter une instance de calcul avec des disques SSD locaux

La meilleure méthode pour arrêter une instance de calcul à laquelle sont associés des disques SSD locaux dépend de votre cas d'utilisation. Utilisez l'une des options suivantes :

  • Si vous avez activé l'arrêt progressif dans une instance de calcul, vous pouvez réduire les coûts en ignorant ou en mettant fin à un arrêt progressif en cours. Pour ce faire, utilisez la console Cloud de Confiance , la gcloud CLI ou l'API REST.

  • Pour conserver les données des disques SSD locaux (à l'exception des types de machines qui utilisent des Titanium SSD), utilisez la gcloud CLI ou l'API REST.

  • Pour arrêter plusieurs instances de calcul simultanément, utilisez la consoleCloud de Confiance ou, pour les instances de calcul qui existent dans la même zone, la gcloud CLI.

Pour arrêter une ou plusieurs instances de calcul auxquelles sont associés des disques SSD locaux, sélectionnez l'une des options suivantes :

Console

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

    Accéder à la page Instances de VM

  2. Sélectionnez les instances de calcul en cours d'exécution à arrêter.

  3. Cliquez sur Arrêter. Si l'option Arrêter n'est pas disponible, cliquez sur Autres actions, puis sélectionnez Arrêter.

  4. Dans la boîte de dialogue qui apparaît, procédez comme suit :

    1. Facultatif : Pour arrêter les instances de calcul sans arrêt progressif ou pour mettre fin à un arrêt progressif en cours, cochez la case Ignorer l'arrêt progressif (le cas échéant).

    2. Pour confirmer, cliquez sur Arrêter.

gcloud

Lorsque vous arrêtez une ou plusieurs instances de calcul auxquelles sont associés des disques SSD locaux dans la même zone, spécifiez si vous souhaitez supprimer ou conserver les données des disques SSD locaux comme suit :

  • Pour supprimer les données des disques SSD locaux, utilisez la commande gcloud compute instances stop avec l'option --discard-local-ssd=true :

    gcloud compute instances stop INSTANCE_NAMES \
        --discard-local-ssd=true \
        --zone=ZONE
    
  • Pour conserver les données des disques SSD locaux, utilisez la commande gcloud beta compute instances stop avec l'option --discard-local-ssd=false :

    gcloud beta compute instances stop INSTANCE_NAMES \
        --discard-local-ssd=false \
        --zone=ZONE
    

Remplacez les éléments suivants :

  • INSTANCE_NAMES : liste des noms des instances de calcul que vous souhaitez arrêter, séparés par des espaces. Par exemple, spécifiez instance-01 instance-02 instance-03.

  • ZONE : zone où se trouvent les instances de calcul.

Si vous souhaitez ignorer ou mettre fin à un arrêt progressif en cours, incluez l'option --no-graceful-shutdown dans la commande :

gcloud compute instances stop INSTANCE_NAMES \
    --discard-local-ssd=DISCARD_LOCAL_SSD \
    --no-graceful-shutdown \
    --zone=ZONE

Remplacez DISCARD_LOCAL_SSD par true pour supprimer les données des disques SSD locaux ou par false pour les conserver. Si vous spécifiez false, vous devez utiliser la commande gcloud beta compute instances stop.

REST

Lorsque vous arrêtez une ou plusieurs instances de calcul auxquelles sont associés des disques SSD locaux dans la même zone, spécifiez si vous souhaitez supprimer ou conserver les données des disques SSD locaux comme suit :

  • Pour supprimer les données des disques SSD locaux, envoyez une requête POST à la méthode instances.stop. Dans l'URL de la requête, incluez le paramètre de requête discardLocalSsd défini sur true :

    POST https://compute.s3nsapis.fr/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/stop?discardLocalSsd=true
    
  • Pour conserver les données des disques SSD locaux, envoyez une requête POST à la méthode beta.instances.stop. Dans l'URL de la requête, incluez le paramètre de requête discardLocalSsd défini sur false :

    POST https://compute.s3nsapis.fr/compute/beta/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/stop?discardLocalSsd=false
    

Remplacez les éléments suivants :

  • PROJECT_ID : ID du projet dans lequel l'instance de calcul existe.

  • ZONE : zone où se trouve l'instance de calcul.

  • INSTANCE_NAME : nom de l'instance de calcul.

Si vous souhaitez ignorer ou mettre fin à un arrêt progressif en cours, incluez le paramètre de requête noGracefulShutdown=true dans l'URL de la requête :

POST https://compute.s3nsapis.fr/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/stop?discardLocalSsd=DISCARD_LOCAL_SSD&noGracefulShutdown=true

Remplacez DISCARD_LOCAL_SSD par true pour supprimer les données des disques SSD locaux ou par false pour les conserver. Si vous spécifiez false, vous devez envoyer une requête POST à la méthode beta.instances.stop.

Arrêter une instance de calcul à partir de l'OS invité

Si des disques SSD locaux sont associés à une instance de calcul, l'arrêt de l'OS invité supprime automatiquement les données des SSD locaux. Pour conserver ces données, copiez-les manuellement vers une option de stockage persistant avant d'arrêter l'instance de calcul.

Pour arrêter une instance de calcul à partir de l'OS invité, sélectionnez l'une des options suivantes :

Linux

  1. Si ce n'est pas déjà fait, connectez-vous à l'instance de calcul.

  2. Pour arrêter l'instance de calcul à partir de son OS invité, sélectionnez l'une des méthodes suivantes :

    • Pour arrêter correctement l'OS invité uniquement après l'exécution de tous les scripts d'arrêt, exécutez la commande suivante :

      sudo shutdown -h now
      
    • Pour forcer l'arrêt de l'OS invité, exécutez la commande suivante :

      sudo poweroff
      

Windows

  1. Si vous ne l'avez pas encore fait, connectez-vous à l'instance de calcul à l'aide de l'une des méthodes suivantes :

  2. Pour arrêter l'instance de calcul à partir de son OS invité, sélectionnez l'une des méthodes suivantes :

    • Pour arrêter correctement l'OS invité uniquement après l'exécution de tous les scripts d'arrêt, exécutez la commande suivante :

      shutdown /s
      
    • Pour forcer l'arrêt de l'OS invité, exécutez la commande suivante :

      shutdown /f
      

Redémarrer une instance de calcul

Vous pouvez redémarrer une instance de calcul qui a été complètement arrêtée, c'est-à-dire lorsque l'état de l'instance de calcul est TERMINATED. Si vous avez choisi de conserver les données des disques SSD locaux lorsque vous avez arrêté votre instance de calcul, vous devrez peut-être réinstaller les disques SSD locaux après avoir redémarré l'instance de calcul. Pour en savoir plus, consultez Formater et installer un disque SSD local.

Pour redémarrer une instance de calcul, utilisez l'une des méthodes suivantes. La meilleure méthode pour votre cas d'utilisation dépend de la présence ou non de disques chiffrés avec des clés de chiffrement fournies par le client (CSEK) sur l'instance de calcul :

Redémarrer une instance de calcul qui n'est pas associée à des disques chiffrés par CSEK

Pour redémarrer plusieurs instances de calcul simultanément dans différentes zones, utilisez la console Cloud de Confiance . Pour les instances de calcul qui existent dans la même zone, vous pouvez utiliser la gcloud CLI. Sinon, pour les autres scénarios de redémarrage, sélectionnez l'une des options suivantes :

Console

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

    Accéder à la page Instances de VM

  2. Sélectionnez les instances de calcul que vous souhaitez redémarrer.

  3. Cliquez sur Démarrer/Réactiver.

gcloud

Pour redémarrer une ou plusieurs instances de calcul existant dans la même zone, utilisez la commande gcloud compute instances start :

gcloud compute instances start INSTANCE_NAMES \
    --zone=ZONE

Remplacez les éléments suivants :

  • INSTANCE_NAMES : liste des noms des instances de calcul que vous souhaitez redémarrer, séparés par des espaces. Par exemple, spécifiez instance-01 instance-02 instance-03.

  • ZONE : zone où se trouvent les instances de calcul.

Go

import (
	"context"
	"fmt"
	"io"

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

// startInstance starts a stopped Google Compute Engine instance (with unencrypted disks).
func startInstance(w io.Writer, projectID, zone, instanceName string) error {
	// projectID := "your_project_id"
	// zone := "europe-central2-b"
	// instanceName := "your_instance_name"

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

	req := &computepb.StartInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
	}

	op, err := instancesClient.Start(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to start instance: %w", err)
	}

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

	fmt.Fprintf(w, "Instance started\n")

	return nil
}

Java


import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.Operation.Status;
import com.google.cloud.compute.v1.StartInstanceRequest;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class StartInstance {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    /* project: project ID or project number of the Cloud project your instance belongs to.
       zone: name of the zone your instance belongs to.
       instanceName: name of the instance your want to start. */
    String project = "your-project-id";
    String zone = "zone-name";
    String instanceName = "instance-name";

    startInstance(project, zone, instanceName);
  }

  // Starts a stopped Google Compute Engine instance (with unencrypted disks).
  public static void startInstance(String project, String zone, String instanceName)
      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()) {

      // Create the request.
      StartInstanceRequest startInstanceRequest = StartInstanceRequest.newBuilder()
          .setProject(project)
          .setZone(zone)
          .setInstance(instanceName)
          .build();

      OperationFuture<Operation, Operation> operation = instancesClient.startAsync(
          startInstanceRequest);

      // Wait for the operation to complete.
      Operation response = operation.get(3, TimeUnit.MINUTES);

      if (response.getStatus() == Status.DONE) {
        System.out.println("Instance started successfully ! ");
      }
    }
  }
}

Node.js

/**
 * 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 compute = require('@google-cloud/compute');

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

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

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

  console.log('Instance started.');
}

startInstance();

PHP

use Google\Cloud\Compute\V1\Client\InstancesClient;
use Google\Cloud\Compute\V1\StartInstanceRequest;

/**
 * Starts a stopped Google Compute Engine instance (with unencrypted disks).
 *
 * @param string $projectId Project ID or project number of the Cloud project your instance belongs to.
 * @param string $zone Name of the zone your instance belongs to.
 * @param string $instanceName Name of the instance you want to stop.
  *
 * @throws \Google\ApiCore\ApiException if the remote call fails.
 * @throws \Google\ApiCore\ValidationException if local error occurs before remote call.
 */
function start_instance(
    string $projectId,
    string $zone,
    string $instanceName
) {
    // Start the Compute Engine instance using InstancesClient.
    $instancesClient = new InstancesClient();
    $request = (new StartInstanceRequest())
        ->setInstance($instanceName)
        ->setProject($projectId)
        ->setZone($zone);
    $operation = $instancesClient->start($request);

    // Wait for the operation to complete.
    $operation->pollUntilComplete();
    if ($operation->operationSucceeded()) {
        printf('Instance %s started successfully' . PHP_EOL, $instanceName);
    } else {
        $error = $operation->getError();
        printf('Failed to start instance: %s' . PHP_EOL, $error?->getMessage());
    }
}

Python

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 start_instance(project_id: str, zone: str, instance_name: str) -> None:
    """
    Starts a stopped Google Compute Engine instance (with unencrypted disks).
    Args:
        project_id: project ID or project number of the Cloud project your instance belongs to.
        zone: name of the zone your instance belongs to.
        instance_name: name of the instance your want to start.
    """
    instance_client = compute_v1.InstancesClient()

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

    wait_for_extended_operation(operation, "instance start")

REST

Pour redémarrer une instance de calcul, envoyez une requête POST à la méthode instances.start :

 POST https://compute.s3nsapis.fr/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/start

Remplacez les éléments suivants :

  • INSTANCE_NAME : nom de l'instance de calcul.

  • PROJECT_ID : ID du projet dans lequel l'instance de calcul existe.

  • ZONE : zone où se trouve l'instance de calcul.

Redémarrer une instance de calcul avec des disques chiffrés par CSEK

Lorsque vous redémarrez une instance de calcul arrêtée à laquelle sont associés des disques chiffrés à l'aide de clés de chiffrement fournies par le client, vous devez fournir les informations de clé de chiffrement.

Pour redémarrer plusieurs instances de calcul simultanément dans différentes zones, utilisez la console Cloud de Confiance . Pour les instances de calcul qui existent dans la même zone, vous pouvez utiliser la gcloud CLI. Sinon, pour les autres scénarios de redémarrage, sélectionnez l'une des options suivantes :

Console

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

    Accéder à la page Instances de VM

  2. Sélectionnez les instances de calcul que vous souhaitez redémarrer.

  3. Cliquez sur Démarrer/Réactiver.

  4. Dans la boîte de dialogue qui apparaît, procédez comme suit :

    1. Spécifiez la clé de chiffrement de chaque disque chiffré associé aux instances de calcul.

    2. Cliquez sur Démarrer.

gcloud

Pour redémarrer une ou plusieurs instances de calcul qui utilisent des disques chiffrés existant dans la même zone, utilisez la commande gcloud compute instances start avec l'option --csek-key-file. Si vous utilisez une clé encapsulée en RSA, exécutez la commande gcloud beta compute instances start avec l'option --csek-key-file à la place :

gcloud compute instances start INSTANCE_NAMES \
    --csek-key-file=ENCRYPTION_KEY_FILE \
    --zone=ZONE

Remplacez les éléments suivants :

  • INSTANCE_NAMES : liste des noms des instances de calcul que vous souhaitez redémarrer, séparés par des espaces. Par exemple, spécifiez instance-01 instance-02 instance-03.

  • ENCRYPTION_KEY_FILE : chemin relatif au fichier JSON contenant la clé de chiffrement fournie par le client. Vous ne pouvez redémarrer plusieurs instances de calcul simultanément que si elles utilisent la même clé de chiffrement fournie par le client. Le format du fichier est décrit dans Format de fichier de clé.

  • ZONE : zone où se trouvent les instances de calcul.

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
	"google.golang.org/protobuf/proto"
)

// startInstanceWithEncKey starts a stopped Google Compute Engine instance (with encrypted disks).
func startInstanceWithEncKey(w io.Writer, projectID, zone, instanceName, key string) error {
	// projectID := "your_project_id"
	// zone := "europe-central2-b"
	// instanceName := "your_instance_name"
	// key := "your_encryption_key"

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

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

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

	req := &computepb.StartWithEncryptionKeyInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
		InstancesStartWithEncryptionKeyRequestResource: &computepb.InstancesStartWithEncryptionKeyRequest{
			Disks: []*computepb.CustomerEncryptionKeyProtectedDisk{
				{
					Source: proto.String(instance.GetDisks()[0].GetSource()),
					DiskEncryptionKey: &computepb.CustomerEncryptionKey{
						RawKey: proto.String(key),
					},
				},
			},
		},
	}

	op, err := instancesClient.StartWithEncryptionKey(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to start instance with encryption key: %w", err)
	}

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

	fmt.Fprintf(w, "Instance with encryption key started\n")

	return nil
}

Java


import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.compute.v1.CustomerEncryptionKey;
import com.google.cloud.compute.v1.CustomerEncryptionKeyProtectedDisk;
import com.google.cloud.compute.v1.GetInstanceRequest;
import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.InstancesStartWithEncryptionKeyRequest;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.Operation.Status;
import com.google.cloud.compute.v1.StartWithEncryptionKeyInstanceRequest;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class StartEncryptedInstance {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    /* project: project ID or project number of the Cloud project your instance belongs to.
       zone: name of the zone your instance belongs to.
       instanceName: name of the instance your want to start.
       key: bytes object representing a raw base64 encoded key to your machines boot disk.
            For more information about disk encryption see:
            https://cloud.google.com/compute/docs/disks/customer-supplied-encryption#specifications
     */
    String project = "your-project-id";
    String zone = "zone-name";
    String instanceName = "instance-name";
    String key = "raw-key";

    startEncryptedInstance(project, zone, instanceName, key);
  }

  // Starts a stopped Google Compute Engine instance (with encrypted disks).
  public static void startEncryptedInstance(String project, String zone, String instanceName,
      String key)
      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()) {

      GetInstanceRequest getInstanceRequest = GetInstanceRequest.newBuilder()
          .setProject(project)
          .setZone(zone)
          .setInstance(instanceName).build();

      Instance instance = instancesClient.get(getInstanceRequest);

      // Prepare the information about disk encryption.
      CustomerEncryptionKeyProtectedDisk protectedDisk = CustomerEncryptionKeyProtectedDisk
          .newBuilder()
          /* Use raw_key to send over the key to unlock the disk
             To use a key stored in KMS, you need to provide:
             `kms_key_name` and `kms_key_service_account`
           */
          .setDiskEncryptionKey(CustomerEncryptionKey.newBuilder()
              .setRawKey(key).build())
          .setSource(instance.getDisks(0).getSource())
          .build();

      InstancesStartWithEncryptionKeyRequest startWithEncryptionKeyRequest =
          InstancesStartWithEncryptionKeyRequest.newBuilder()
              .addDisks(protectedDisk).build();

      StartWithEncryptionKeyInstanceRequest encryptionKeyInstanceRequest =
          StartWithEncryptionKeyInstanceRequest.newBuilder()
              .setProject(project)
              .setZone(zone)
              .setInstance(instanceName)
              .setInstancesStartWithEncryptionKeyRequestResource(startWithEncryptionKeyRequest)
              .build();

      OperationFuture<Operation, Operation> operation = instancesClient.startWithEncryptionKeyAsync(
          encryptionKeyInstanceRequest);
      Operation response = operation.get(3, TimeUnit.MINUTES);

      if (response.getStatus() == Status.DONE) {
        System.out.println("Encrypted instance started successfully ! ");
      }
    }
  }

}

Node.js

/**
 * 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 key = 'YOUR_KEY_STRING'

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

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

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

  const [response] = await instancesClient.startWithEncryptionKey({
    project: projectId,
    zone,
    instance: instanceName,
    instancesStartWithEncryptionKeyRequestResource: {
      disks: [
        {
          source: instance.disks[0].source,
          diskEncryptionKey: {
            rawKey: key,
          },
        },
      ],
    },
  });
  let operation = response.latestResponse;
  const operationsClient = new compute.ZoneOperationsClient();

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

  console.log('Instance with encryption key started.');
}

startInstanceWithEncryptionKey();

PHP

use Google\Cloud\Compute\V1\Client\InstancesClient;
use Google\Cloud\Compute\V1\CustomerEncryptionKey;
use Google\Cloud\Compute\V1\CustomerEncryptionKeyProtectedDisk;
use Google\Cloud\Compute\V1\GetInstanceRequest;
use Google\Cloud\Compute\V1\InstancesStartWithEncryptionKeyRequest;
use Google\Cloud\Compute\V1\StartWithEncryptionKeyInstanceRequest;

/**
 * Starts a stopped Google Compute Engine instance (with encrypted disks).
 *
 * @param string $projectId Project ID or project number of the Cloud project your instance belongs to.
 * @param string $zone Name of the zone your instance belongs to.
 * @param string $instanceName Name of the instance you want to stop.
 * @param string $key Bytes object representing a raw base64 encoded key to your instance's boot disk.
 *                    For more information about disk encryption see:
 *                    https://cloud.google.com/compute/docs/disks/customer-supplied-encryption#specifications
 *
 * @throws \Google\ApiCore\ApiException if the remote call fails.
 * @throws \Google\ApiCore\ValidationException if local error occurs before remote call.
 */
function start_instance_with_encryption_key(
    string $projectId,
    string $zone,
    string $instanceName,
    string $key
) {
    // Initiate the InstancesClient.
    $instancesClient = new InstancesClient();

    // Get data about the instance.
    $request = (new GetInstanceRequest())
        ->setInstance($instanceName)
        ->setProject($projectId)
        ->setZone($zone);
    $instanceData = $instancesClient->get($request);

    // Use `setRawKey` to send over the key to unlock the disk
    // To use a key stored in KMS, you need to use `setKmsKeyName` and `setKmsKeyServiceAccount`
    $customerEncryptionKey = (new CustomerEncryptionKey())
        ->setRawKey($key);

    /** @var \Google\Cloud\Compute\V1\AttachedDisk */
    $disk = $instanceData->getDisks()[0];

    // Prepare the information about disk encryption.
    $diskData = (new CustomerEncryptionKeyProtectedDisk())
        ->setSource($disk->getSource())
        ->setDiskEncryptionKey($customerEncryptionKey);

    // Set request with one disk.
    $instancesStartWithEncryptionKeyRequest = (new InstancesStartWithEncryptionKeyRequest())
        ->setDisks(array($diskData));

    // Start the instance with encrypted disk.
    $request2 = (new StartWithEncryptionKeyInstanceRequest())
        ->setInstance($instanceName)
        ->setInstancesStartWithEncryptionKeyRequestResource($instancesStartWithEncryptionKeyRequest)
        ->setProject($projectId)
        ->setZone($zone);
    $operation = $instancesClient->startWithEncryptionKey($request2);

    // Wait for the operation to complete.
    $operation->pollUntilComplete();
    if ($operation->operationSucceeded()) {
        printf('Instance %s started successfully' . PHP_EOL, $instanceName);
    } else {
        $error = $operation->getError();
        printf('Starting instance failed: %s' . PHP_EOL, $error?->getMessage());
    }
}

Python

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 start_instance_with_encryption_key(
    project_id: str, zone: str, instance_name: str, key: bytes
) -> None:
    """
    Starts a stopped Google Compute Engine instance (with encrypted disks).
    Args:
        project_id: project ID or project number of the Cloud project your instance belongs to.
        zone: name of the zone your instance belongs to.
        instance_name: name of the instance your want to start.
        key: bytes object representing a raw base64 encoded key to your machines boot disk.
            For more information about disk encryption see:
            https://cloud.google.com/compute/docs/disks/customer-supplied-encryption#specifications
    """
    instance_client = compute_v1.InstancesClient()

    instance_data = instance_client.get(
        project=project_id, zone=zone, instance=instance_name
    )

    # Prepare the information about disk encryption
    disk_data = compute_v1.CustomerEncryptionKeyProtectedDisk()
    disk_data.source = instance_data.disks[0].source
    disk_data.disk_encryption_key = compute_v1.CustomerEncryptionKey()
    # Use raw_key to send over the key to unlock the disk
    # To use a key stored in KMS, you need to provide `kms_key_name` and `kms_key_service_account`
    disk_data.disk_encryption_key.raw_key = key
    enc_data = compute_v1.InstancesStartWithEncryptionKeyRequest()
    enc_data.disks = [disk_data]

    operation = instance_client.start_with_encryption_key(
        project=project_id,
        zone=zone,
        instance=instance_name,
        instances_start_with_encryption_key_request_resource=enc_data,
    )

    wait_for_extended_operation(operation, "instance start (with encrypted disk)")

REST

Pour redémarrer une instance de calcul qui utilise des disques chiffrés, envoyez une requête POST à la méthode instances.startWithEncryptionKey :

POST  https://compute.s3nsapis.fr/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/startWithEncryptionKey

{
  "disks": [
    {
      "source": "DISK_URL",
      "diskEncryptionKey": {
        "ENCRYPTION_TYPE": "ENCRYPTION_KEY"
      }
    }
  ]
}

Remplacez les éléments suivants :

  • PROJECT_ID : ID du projet dans lequel l'instance de calcul existe.

  • ZONE : zone où se trouve l'instance de calcul.

  • INSTANCE_NAME : nom de l'instance de calcul.

  • DISK_URL : URL de la ressource correspondant au nom complet de la ressource du disque associé qui est chiffré avec une clé de chiffrement fournie par le client.

  • ENCRYPTION_TYPE : type de chiffrement de disque que vous utilisez, à savoir rawKey, kmsKeyName ou rsaEncryptedKey. Si vous utilisez le type rsaEncryptedKey, envoyez une requête POST à la méthode beta.instances.startWithEncryptionKey.

  • ENCRYPTION_KEY : clé de chiffrement utilisée pour chiffrer les disques persistants associés à l'instance de calcul. Les clés rawKey ou rsaEncryptedKey doivent être encodées en base64. En outre, pour préparer une clé rsaEncryptedKey, consultez la section Encapsuler une clé RSA.

Étapes suivantes