Detén o reinicia una instancia de Compute Engine

En este documento, se explica cómo detener o reiniciar de forma manual una instancia de Compute Engine. Como alternativa, para automatizar el momento en que se detiene o reinicia una instancia de procesamiento, consulta lo siguiente:

Es posible detener una instancia de procesamiento de forma manual. Después de que se completa una operación de detención y el estado de la instancia de procesamiento cambia a TERMINATED, puedes reiniciar la instancia de procesamiento para reanudar tu carga de trabajo o borrarla de forma permanente si ya no la necesitas. Detener una instancia de procesamiento de forma manual es útil cuando deseas hacer lo siguiente:

  • Ahorra costos mientras mantienes tus parámetros de configuración: ya no quieres ejecutar cargas de trabajo en la instancia de procesamiento. Sin embargo, quieres conservar la instancia de procesamiento y sus discos conectados, los parámetros de configuración, las direcciones IP, las direcciones MAC y los metadatos. Si también necesitas retener los datos en la memoria y el estado de la aplicación, suspende la instancia de procesamiento.

  • Actualizar propiedades: Deseas modificar una o más propiedades que requieren que detengas y reinicies la instancia de procesamiento antes de que los cambios puedan surtir efecto; por ejemplo, deseas cambiar el tipo de máquina o desconectar un disco. Para obtener más información, consulta Propiedades que puedes actualizar.

Limitaciones

Cuando detienes una instancia de procesamiento, se aplican las siguientes limitaciones:

  • Solo puedes detener o reiniciar una instancia de procesamiento si el estado de la instancia de procesamiento lo permite.

  • Solo puedes reiniciar una instancia de procesamiento si hay recursos suficientes en la zona en la que existe.

  • No puedes reiniciar las instancias de procesamiento de TPU. Después de detener las instancias de procesamiento de TPU, solo puedes borrarlas.

Antes de comenzar

Roles obligatorios

Para obtener los permisos que necesitas para detener o reiniciar una instancia de procesamiento, pídele a tu administrador que te otorgue el rol de IAM Administrador de instancias de Compute (v1) (roles/compute.instanceAdmin.v1) 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 los permisos necesarios para detener o reiniciar una instancia de procesamiento. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para detener o reiniciar una instancia de procesamiento:

  • Para detener una instancia de procesamiento, usa compute.instances.stop en la instancia de procesamiento.
  • Para detener una instancia de procesamiento desde el SO invitado: compute.instances.setMetadata en la instancia de procesamiento si usa claves SSH públicas a nivel de instancia.
  • Para reiniciar una instancia de procesamiento, usa compute.instances.start en la instancia de procesamiento.
  • Para reiniciar una instancia de procesamiento que usa claves de encriptación: compute.instances.startWithEncryptionKey en la instancia de procesamiento

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

Detén una instancia de procesamiento

Para detener tu instancia de procesamiento, usa uno de los siguientes métodos. El mejor enfoque para tu caso de uso depende de si tienes discos SSD locales conectados a tu instancia de procesamiento y de cómo deseas controlar las secuencias de comandos de cierre:

  • Detén una instancia de procesamiento desde Cloud de Confiance. Puedes detener una o más instancias de procesamiento de forma simultánea desde Cloud de Confiance. Si las instancias de procesamiento tienen discos SSD locales conectados, puedes elegir si deseas descartar o conservar (versión preliminar) los datos de las SSD locales. Cualquier secuencia de comandos de cierre en la instancia de procesamiento debe terminar de ejecutarse antes de que se detenga la instancia de procesamiento. Para obtener instrucciones, consulta uno de los siguientes vínculos:

  • Detén una instancia de procesamiento desde el SO invitado. Este enfoque garantiza que las secuencias de comandos de apagado terminen de ejecutarse antes de que se detenga la instancia de procesamiento. Si habilitaste el cierre ordenado, puedes omitirlo o finalizarlo. Sin embargo, si detienes una instancia de procesamiento desde el SO invitado, se descartan los datos de los discos SSD locales conectados, a menos que primero crees una copia de seguridad de los datos en un almacenamiento persistente. Para obtener instrucciones, consulta Detén una instancia de procesamiento desde el SO invitado.

Detén una instancia de procesamiento sin discos SSD locales

Para detener una instancia de procesamiento que no tiene discos SSD locales conectados, revisa las siguientes opciones:

  • Si habilitaste el cierre ordenado en la instancia de procesamiento, puedes omitir o finalizar un cierre ordenado en curso para ahorrar costos. Para ello, usa la consola de Cloud de Confiance , gcloud CLI o la API de REST.

  • Para detener varias instancias de procesamiento de forma simultánea, usa la consola deCloud de Confiance o, para las instancias de procesamiento que existen en la misma zona, gcloud CLI.

Para detener una o más instancias de procesamiento, selecciona una de las siguientes opciones:

Console

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

    Ir a Instancias de VM

  2. Selecciona las instancias de procesamiento en ejecución que deseas detener.

  3. Haz clic en Detener. Si no hay una opción Detener, haz clic en Más acciones y, luego, selecciona Detener.

  4. En el cuadro de diálogo que aparece, haz lo siguiente:

    1. Opcional: Para detener las instancias de procesamiento sin cerrarlas de forma ordenada o para finalizar un cierre ordenado en curso, selecciona la casilla de verificación Omitir el cierre ordenado (si corresponde).

    2. Para confirmar la acción, haz clic en Detener.

gcloud

Para detener una o más instancias de procesamiento que existen en la misma zona, usa el comando gcloud compute instances stop:

gcloud compute instances stop INSTANCE_NAMES \
    --zone=ZONE

Reemplaza lo siguiente:

  • INSTANCE_NAMES: Es una lista de nombres de instancias de procesamiento que deseas detener, separados por espacios. Por ejemplo, especifica instance-01 instance-02 instance-03.

  • ZONE: Es la zona en la que existen las instancias de procesamiento.

Si quieres omitir o finalizar un cierre ordenado en curso, usa el mismo comando con la marca --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

Para detener una instancia de procesamiento, realiza una solicitud POST al método instances.stop:

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

Reemplaza lo siguiente:

  • INSTANCE_NAME: Es el nombre de la instancia de procesamiento.

  • PROJECT_ID: Es el ID del proyecto en el que existe la instancia de procesamiento.

  • ZONE: Es la zona en la que existe la instancia de procesamiento.

Si deseas omitir o finalizar un cierre ordenado en curso, incluye el parámetro de consulta noGracefulShutdown=true en la URL de la solicitud:

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

Detén una instancia de procesamiento con discos SSD locales

El mejor método para detener una instancia de procesamiento que tiene discos SSD locales conectados depende de tu caso de uso. Usa una de las siguientes opciones:

  • Si habilitaste el cierre ordenado en una instancia de procesamiento, puedes omitir o finalizar un cierre ordenado en curso para ahorrar costos. Para ello, usa la consola de Cloud de Confiance , gcloud CLI o la API de REST.

  • Para conservar los datos de SSD locales (excepto los tipos de máquinas que usan Titanium SSD), usa gcloud CLI o la API de REST.

  • Para detener varias instancias de procesamiento de forma simultánea, usa la consola deCloud de Confiance o, para las instancias de procesamiento que existen en la misma zona, gcloud CLI.

Para detener una o más instancias de procesamiento que tienen discos SSD locales conectados, selecciona una de las siguientes opciones:

Console

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

    Ir a Instancias de VM

  2. Selecciona las instancias de procesamiento en ejecución que deseas detener.

  3. Haz clic en Detener. Si no hay una opción Detener, haz clic en Más acciones y, luego, selecciona Detener.

  4. En el cuadro de diálogo que aparece, haz lo siguiente:

    1. Opcional: Para detener las instancias de procesamiento sin cerrarlas de forma ordenada o finalizar un cierre ordenado en curso, selecciona la casilla de verificación Omitir el cierre ordenado (si corresponde).

    2. Para confirmar la acción, haz clic en Detener.

gcloud

Cuando detengas una o más instancias de procesamiento en la misma zona que tengan discos SSD locales conectados, especifica si deseas descartar o conservar los datos de SSD locales de la siguiente manera:

  • Para descartar los datos de SSD local, usa el comando gcloud compute instances stop con la marca --discard-local-ssd=true:

    gcloud compute instances stop INSTANCE_NAMES \
        --discard-local-ssd=true \
        --zone=ZONE
    
  • Para conservar los datos de SSD local, usa el comando gcloud beta compute instances stop con la marca --discard-local-ssd=false:

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

Reemplaza lo siguiente:

  • INSTANCE_NAMES: Es una lista de nombres de instancias de procesamiento que deseas detener, separados por espacios. Por ejemplo, especifica instance-01 instance-02 instance-03.

  • ZONE: Es la zona en la que existen las instancias de procesamiento.

Si deseas omitir o finalizar un cierre ordenado en curso, incluye la marca --no-graceful-shutdown en el comando:

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

Reemplaza DISCARD_LOCAL_SSD por true para descartar los datos en los discos SSD locales o false para conservarlos. Si especificas false, debes usar el comando gcloud beta compute instances stop.

REST

Cuando detengas una o más instancias de procesamiento en la misma zona que tengan discos SSD locales conectados, especifica si deseas descartar o conservar los datos de SSD locales de la siguiente manera:

  • Para descartar los datos de SSD local, realiza una solicitud POST al método instances.stop. En la URL de la solicitud, incluye el parámetro de consulta discardLocalSsd configurado como true:

    POST https://compute.s3nsapis.fr/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/stop?discardLocalSsd=true
    
  • Para conservar los datos de SSD locales, realiza una solicitud POST al método beta.instances.stop. En la URL de la solicitud, incluye el parámetro de consulta discardLocalSsd configurado como false:

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

Reemplaza lo siguiente:

  • PROJECT_ID: Es el ID del proyecto en el que existe la instancia de procesamiento.

  • ZONE: Es la zona en la que existe la instancia de procesamiento.

  • INSTANCE_NAME: Es el nombre de la instancia de procesamiento.

Si deseas omitir o finalizar un cierre ordenado en curso, incluye el parámetro de consulta noGracefulShutdown=true en la URL de la solicitud:

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

Reemplaza DISCARD_LOCAL_SSD por true para descartar los datos en los discos SSD locales o false para conservarlos. Si especificas false, debes realizar una solicitud POST al método beta.instances.stop.

Detén una instancia de procesamiento desde el SO invitado

Si una instancia de procesamiento tiene discos SSD locales conectados, el cierre del SO invitado descarta automáticamente los datos de la SSD local. Para conservar estos datos, cópialos manualmente en una opción de almacenamiento persistente antes de detener la instancia de procesamiento.

Para detener una instancia de procesamiento desde el SO invitado, selecciona una de las siguientes opciones:

Linux

  1. Si aún no lo hiciste, conéctate a la instancia de procesamiento.

  2. Para detener la instancia de procesamiento desde su SO invitado, selecciona uno de los siguientes métodos:

    • Para cerrar de forma ordenada el SO invitado solo después de que se hayan ejecutado todas las secuencias de comandos de cierre, ejecuta el siguiente comando:

      sudo shutdown -h now
      
    • Para forzar el apagado del SO invitado, ejecuta el siguiente comando:

      sudo poweroff
      

Windows

  1. Si aún no lo hiciste, conéctate a la instancia de procesamiento con uno de los siguientes métodos:

  2. Para detener la instancia de procesamiento desde su SO invitado, selecciona uno de los siguientes métodos:

    • Para cerrar de forma ordenada el SO invitado solo después de que se hayan ejecutado todas las secuencias de comandos de cierre, ejecuta el siguiente comando:

      shutdown /s
      
    • Para forzar el apagado del SO invitado, ejecuta el siguiente comando:

      shutdown /f
      

Reinicia una instancia de procesamiento

Puedes reiniciar una instancia de procesamiento que se detuvo por completo, es decir, cuando el estado de la instancia de procesamiento es TERMINATED. Si elegiste conservar los datos de las SSD locales cuando detuviste la instancia de procesamiento, es posible que debas volver a activar los discos SSD locales después de reiniciar la instancia de procesamiento. Para obtener más información, consulta Da formato a un dispositivo SSD local y actívalo.

Para reiniciar una instancia de procesamiento, usa uno de los siguientes métodos. El mejor método para tu caso de uso depende de si la instancia de procesamiento tiene discos que se encriptaron con claves de encriptación proporcionadas por el cliente (CSEK):

Reinicia una instancia de procesamiento que no tenga discos encriptados con CSEK

Para reiniciar varias instancias de procesamiento de forma simultánea en diferentes zonas, usa la consola de Cloud de Confiance . Para las instancias de procesamiento que existen en la misma zona, puedes usar gcloud CLI. De lo contrario, para otras situaciones de reinicio, selecciona una de las siguientes opciones:

Console

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

    Ir a Instancias de VM

  2. Selecciona las instancias de procesamiento que quieres reiniciar.

  3. Haz clic en Iniciar/Reanudar.

gcloud

Para reiniciar una o más instancias de procesamiento que existen en la misma zona, usa el comando gcloud compute instances start:

gcloud compute instances start INSTANCE_NAMES \
    --zone=ZONE

Reemplaza lo siguiente:

  • INSTANCE_NAMES: Es una lista de nombres de instancias de procesamiento que deseas reiniciar, separados por espacios. Por ejemplo, especifica instance-01 instance-02 instance-03.

  • ZONE: Es la zona en la que existen las instancias de procesamiento.

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

Para reiniciar una instancia de procesamiento, realiza una solicitud POST al método instances.start:

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

Reemplaza lo siguiente:

  • INSTANCE_NAME: Es el nombre de la instancia de procesamiento.

  • PROJECT_ID: Es el ID del proyecto en el que existe la instancia de procesamiento.

  • ZONE: Es la zona en la que existe la instancia de procesamiento.

Reinicia una instancia de procesamiento con discos encriptados con CSEK

Cuando reinicias una instancia de procesamiento detenida que tiene discos conectados que se encriptaron con claves de encriptación proporcionadas por el cliente, debes proporcionar la información de la clave de encriptación.

Para reiniciar varias instancias de procesamiento de forma simultánea en diferentes zonas, usa la consola de Cloud de Confiance . Para las instancias de procesamiento que existen en la misma zona, puedes usar gcloud CLI. De lo contrario, para otras situaciones de reinicio, selecciona una de las siguientes opciones:

Console

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

    Ir a Instancias de VM

  2. Selecciona las instancias de procesamiento que quieres reiniciar.

  3. Haz clic en Iniciar/Reanudar.

  4. En el cuadro de diálogo que aparece, haz lo siguiente:

    1. Especifica las claves de encriptación para cada uno de los discos encriptados que están conectados a las instancias de procesamiento.

    2. Haz clic en Iniciar.

gcloud

Para reiniciar una o más instancias de procesamiento que usan discos encriptados que existen en la misma zona, usa el comando gcloud compute instances start con la marca --csek-key-file. Si usas una clave unida con RSA, usa el comando gcloud beta compute instances start con la marca --csek-key-file en su lugar:

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

Reemplaza lo siguiente:

  • INSTANCE_NAMES: Es una lista de nombres de instancias de procesamiento que deseas reiniciar, separados por espacios. Por ejemplo, especifica instance-01 instance-02 instance-03.

  • ENCRYPTION_KEY_FILE: Es la ruta de acceso relativa al archivo JSON que contiene la clave de encriptación proporcionada por el cliente. Solo puedes reiniciar varias instancias de procesamiento de forma simultánea si estas usan la misma clave de encriptación proporcionada por el cliente. El formato del archivo se describe en Formato del archivo de claves.

  • ZONE: Es la zona en la que existen las instancias de procesamiento.

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

Para reiniciar una instancia de procesamiento que usa discos encriptados, realiza una solicitud POST al método 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"
      }
    }
  ]
}

Reemplaza lo siguiente:

  • PROJECT_ID: Es el ID del proyecto en el que existe la instancia de procesamiento.

  • ZONE: Es la zona en la que existe la instancia de procesamiento.

  • INSTANCE_NAME: Es el nombre de la instancia de procesamiento.

  • DISK_URL: Es la URL del recurso que corresponde al nombre del recurso completo del disco adjunto que se encripta con una clave de encriptación proporcionada por el cliente.

  • ENCRYPTION_TYPE: el tipo de encriptación del disco que usas, que puede ser una de las siguientes opciones: rawKey, kmsKeyName o rsaEncryptedKey. Si usas el tipo rsaEncryptedKey, realiza una solicitud POST al método beta.instances.startWithEncryptionKey.

  • ENCRYPTION_KEY: Es la clave de encriptación que se usa para encriptar los discos persistentes conectados a la instancia de procesamiento. Las claves rawKey o rsaEncryptedKey deben estar codificadas en base64. Además, para preparar una clave rsaEncryptedKey, consulta Unión de clave RSA.

¿Qué sigue?