Detener o reiniciar una instancia de Compute Engine


Este documento explica cómo detener o reiniciar una instancia de Compute Engine. Para obtener más información sobre cómo suspender, detener o restablecer una instancia, consulte Suspender, detener o restablecer instancias de Compute Engine .

Detener una instancia es útil cuando ya no la usa o para modificar sus propiedades (por ejemplo, para cambiar su tipo de máquina o eliminar cualquier disco conectado y montado). Después de detener la instancia, puede hacer lo siguiente:

  • Reinícielo para reanudar su carga de trabajo.

  • Bórralo si ya no lo necesitas.

Para automatizar la detención o el reinicio de una instancia, consulte lo siguiente:

Antes de comenzar

Roles requeridos

Para obtener los permisos que necesita para detener o reiniciar una instancia informática, solicite a su administrador que le otorgue el rol de IAM de Administrador de instancia informática (v1) ( roles/compute.instanceAdmin.v1 ) en el proyecto. Para obtener más información sobre cómo otorgar roles, consulte Administrar el acceso a proyectos, carpetas y organizaciones .

Esta función predefinida contiene los permisos necesarios para detener o reiniciar una instancia informática. Para ver los permisos exactos que se requieren, expanda la sección Permisos requeridos :

Permisos requeridos

Se requieren los siguientes permisos para detener o reiniciar una instancia informática:

  • Para detener una instancia: compute.instances.stop en la instancia
  • Para detener una instancia desde el sistema operativo invitado: compute.instances.setMetadata en la instancia si usa claves SSH públicas a nivel de instancia .
  • Para reiniciar una instancia: compute.instances.start en la instancia
  • Para reiniciar una instancia que usa claves de cifrado: compute.instances.startWithEncryptionKey en la instancia

Es posible que también pueda obtener estos permisos con roles personalizados u otros roles predefinidos .

Detener una instancia

Cuando detienes una instancia informática, o Compute Engine lo hace para una acción programada, la instancia conserva sus recursos adjuntos, ajustes de configuración, direcciones IP internas, direcciones MAC y metadatos. Sin embargo, la instancia pierde sus datos en memoria y el estado de la aplicación. Si necesita conservar estos estados, suspenda la instancia .

Puede detener una instancia utilizando los siguientes métodos, dependiendo de si la instancia tiene discos SSD locales conectados y de cómo desea manejar los scripts de apagado :

  • Detener una instancia sin discos SSD locales

    Puede detener una o más instancias simultáneamente que no tengan ningún disco SSD local conectado. Cualquier secuencia de comandos de apagado en una instancia debe terminar de ejecutarse dentro del período de apagado predeterminado.

  • Detener una instancia con discos SSD locales

    Al detener una o más instancias simultáneamente que tienen discos SSD locales conectados, puede optar por descartar o conservar ( Vista previa ) los datos de esos discos. Cualquier secuencia de comandos de apagado en la instancia debe terminar de ejecutarse dentro del período de apagado predeterminado.

  • Detener una instancia del sistema operativo invitado

    Este enfoque le permite detener una sola instancia solo después de que los scripts de apagado hayan terminado de ejecutarse o, si habilitó el cierre ordenado , detener la instancia sin cerrarla correctamente o finalizar un cierre ordenado en curso. A menos que haga una copia de seguridad manual de los datos de cualquier disco SSD local conectado a un volumen de almacenamiento duradero, al detener una instancia desde su sistema operativo invitado se descartan todos los datos de esos discos.

Detener una instancia sin discos SSD locales

Dependiendo de lo que desee hacer al detener una instancia, utilice las siguientes opciones:

  • Si habilitó el cierre ordenado en la instancia, puede detener la instancia sin cerrarla correctamente o finalizar un cierre ordenado en curso mediante la consola de Google Cloud, la CLI de gcloud o la API REST.

  • Para detener varias instancias simultáneamente, use la consola de Google Cloud o, para instancias ubicadas en la misma zona, la CLI de gcloud.

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

Consola

  1. En la consola de Google Cloud, vaya a la página de instancias de VM .

    Ir a instancias de VM

  2. Seleccione las instancias en ejecución para detener.

  3. Haga clic Detener .

  4. En el cuadro de diálogo, haga lo siguiente:

    1. Opcional: para detener las instancias sin cerrarlas correctamente, o finalizar un cierre ordenado en curso, seleccione la casilla de verificación Omitir cierre ordenado (si corresponde) .

    2. Para confirmar, haga clic en Detener .

nube de gcloud

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

gcloud compute instances stop INSTANCE_NAMES \
    --zone=ZONE

Reemplace lo siguiente:

  • INSTANCE_NAMES : una lista de nombres de instancias separados por espacios; por ejemplo, instance-01 instance-02 instance-03 .

  • ZONE : la zona donde se encuentran las instancias.

Opcionalmente, si ha habilitado el cierre ordenado en una o más instancias, puede detener las instancias sin cerrarlas correctamente o finalizar manualmente un cierre ordenado en curso. Para hacerlo, usa el comando gcloud beta compute instances stop con la marca --no-graceful-shutdown :

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

Ir

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 ! ");
      }
    }
  }
}

Nodo.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());
    }
}

Pitón

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")

DESCANSAR

Para detener una instancia, realice una solicitud POST al método instances.stop :

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

Reemplace lo siguiente:

  • INSTANCE_NAME : el nombre de la instancia.

  • PROJECT_ID : el ID del proyecto donde se encuentra la instancia.

  • ZONE : la zona donde se encuentra la instancia.

Opcionalmente, si ha habilitado el cierre ordenado en una instancia, puede detener la instancia sin cerrarla correctamente o finalizar manualmente un cierre ordenado en curso. Para hacerlo, realice una solicitud POST al método instances.stop . En la URL de solicitud, incluya el parámetro de consulta noGracefulShutdown=true :

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/stop?noGracefulShutdown=true

Detener una instancia con discos SSD locales

Dependiendo de lo que desee hacer al detener una instancia informática, utilice las siguientes opciones:

  • Si habilitó el cierre ordenado en la instancia, puede detener la instancia sin cerrarla correctamente o finalizar un cierre ordenado en curso mediante la consola de Google Cloud, la CLI de gcloud o la API REST.

  • Para conservar los datos de los discos SSD locales conectados a una instancia (excluidas las instancias Z3), detenga la instancia mediante la CLI de gcloud o la API REST.

  • Para detener varias instancias simultáneamente, use la consola de Google Cloud o, para instancias ubicadas en la misma zona, la CLI de gcloud.

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

Consola

  1. En la consola de Google Cloud, vaya a la página de instancias de VM .

    Ir a instancias de VM

  2. Seleccione las instancias en ejecución para detener.

  3. Haga clic Detener .

  4. En el cuadro de diálogo, haga lo siguiente:

    1. Opcional: para detener las instancias sin cerrarlas correctamente, o finalizar un cierre ordenado en curso, seleccione la casilla de verificación Omitir cierre ordenado (si corresponde) .

    2. Para confirmar, haga clic en Detener .

nube de gcloud

Al detener una o más instancias en la misma zona que tienen discos SSD locales conectados, especifique si desea descartar o conservar los datos del SSD local de la siguiente manera:

  • Para descartar datos de SSD locales, 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 del 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
    

Reemplace lo siguiente:

  • INSTANCE_NAMES : una lista de nombres de instancias separados por espacios; por ejemplo, instance-01 instance-02 instance-03 .

  • ZONE : la zona donde se encuentran las instancias.

Opcionalmente, si ha habilitado el cierre ordenado en una o más instancias, puede detener las instancias sin cerrarlas correctamente o finalizar un cierre ordenado en curso. Para hacerlo, usa el comando gcloud beta compute instances stop con la marca --no-graceful-shutdown :

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

Reemplace DISCARD_LOCAL_SSD con true para descartar los datos en los discos SSD locales o false para conservar los datos.

DESCANSAR

Al detener una instancia que tiene discos SSD locales conectados, especifique si desea descartar o conservar los datos del SSD local de la siguiente manera:

  • Para descartar datos de SSD local, realice una solicitud POST al método instances.stop . En la URL de solicitud, incluya el parámetro de consulta discardLocalSsd establecido en true :

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/stop?discardLocalSsd=true
    
  • Para conservar los datos del SSD local, realice una solicitud POST al método beta.instances.stop . En la URL de solicitud, incluya el parámetro de consulta discardLocalSsd establecido en false :

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

Reemplace lo siguiente:

  • PROJECT_ID : el ID del proyecto donde se encuentra la instancia.

  • ZONE : la zona donde se encuentra la instancia.

  • INSTANCE_NAME : el nombre de la instancia.

Opcionalmente, si ha habilitado el cierre ordenado en una instancia, puede detener la instancia sin cerrarla correctamente o finalizar manualmente un cierre ordenado en curso. Para hacerlo, realice una solicitud POST al método instances.stop . En la URL de solicitud, incluya el parámetro de consulta noGracefulShutdown=true :

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/stop?discardLocalSsd=DISCARD_LOCAL_SSD&noGracefulShutdown=true

Reemplace DISCARD_LOCAL_SSD con true para descartar los datos en los discos SSD locales o false para conservar los datos.

Detener una instancia del sistema operativo invitado

Si una instancia informática tiene discos SSD locales conectados, al apagar el sistema operativo invitado se descartan automáticamente los datos del SSD local. Para conservar estos datos, cópielos manualmente en una opción de almacenamiento persistente antes de detener la instancia.

Para detener una instancia desde el sistema operativo invitado, seleccione una de las siguientes opciones:

linux

  1. Si aún no lo has hecho, conéctate a la instancia .

  2. Para detener la instancia, seleccione uno de los siguientes métodos:

    • Para un apagado limpio que permita a la instancia ejecutar scripts de apagado antes de apagar el sistema operativo invitado, ejecute el siguiente comando:

      sudo shutdown -h now
      
    • De lo contrario, para forzar un apagado, ejecute el siguiente comando:

      sudo poweroff
      

ventanas

  1. Si aún no lo ha hecho, conéctese a la instancia utilizando uno de los siguientes métodos:

  2. Para detener la instancia, seleccione uno de los siguientes métodos:

    • Para detener limpiamente la instancia y permitir que ejecute scripts de apagado antes de apagar el sistema operativo invitado, ejecute el siguiente comando:

      shutdown /s
      
    • Para forzar un apagado, ejecute el siguiente comando:

      shutdown /f
      

Reiniciar una instancia

Puede reiniciar una instancia informática que se haya detenido por completo, que es cuando el estado de la instancia es TERMINATED .

Si elige conservar los datos de sus discos SSD locales al detener la instancia, es posible que deba volver a montar los discos SSD locales después de reiniciarla. Para obtener más información sobre cómo montar discos SSD locales, consulte Formatear y montar un dispositivo SSD local .

Para reiniciar una instancia, utilice uno de los siguientes métodos según si la instancia tiene discos cifrados conectados:

Reiniciar una instancia sin discos cifrados

Puede reiniciar varias instancias informáticas simultáneamente o instancias individuales. Para instancias múltiples, use la consola de Google Cloud o, para instancias ubicadas en la misma zona, la CLI de gcloud. Para instancias individuales, seleccione cualquiera de las siguientes opciones:

Consola

  1. En la consola de Google Cloud, vaya a la página de instancias de VM .

    Ir a instancias de VM

  2. Seleccione una o más instancias.

  3. Haga clic en Inicio/Reanudar .

nube de gcloud

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

gcloud compute instances start INSTANCE_NAMES \
    --zone=ZONE

Reemplace lo siguiente:

  • INSTANCE_NAMES : una lista de nombres de instancias separados por espacios; por ejemplo, instance-01 instance-02 instance-03 .

  • ZONE : la zona donde se encuentran las instancias.

Ir

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 ! ");
      }
    }
  }
}

Nodo.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());
    }
}

Pitón

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")

DESCANSAR

Para reiniciar una instancia, realice una solicitud POST al método instances.start :

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

Reemplace lo siguiente:

  • INSTANCE_NAME : el nombre de la instancia a reiniciar.

  • PROJECT_ID : el ID del proyecto donde se encuentra la instancia.

  • ZONE : la zona donde se encuentra la instancia.

Reiniciar una instancia con discos cifrados

Cuando reinicia una instancia informática detenida que tiene discos adjuntos que se cifraron utilizando claves de cifrado proporcionadas por el cliente , debe proporcionar la información de la clave de cifrado.

Puede reiniciar varias instancias simultáneamente o instancias individuales. Para instancias múltiples, use la consola de Google Cloud o, para instancias ubicadas en la misma zona, la CLI de gcloud. Para instancias individuales, seleccione cualquiera de las siguientes opciones:

Consola

  1. En la consola de Google Cloud, vaya a la página de instancias de VM .

    Ir a instancias de VM

  2. Seleccione las instancias para reiniciar.

  3. Haga clic en Inicio/Reanudar .

  4. Especifique las claves de cifrado para cada uno de los discos cifrados que están conectados a las instancias y luego haga clic en Iniciar .

nube de gcloud

Para reiniciar una o más instancias que usan discos cifrados en la misma zona, usa el comando gcloud compute instances start con la marca --csek-key-file . Si estás usando una clave envuelta en RSA, usa el comando gcloud beta compute instances start con la marca --csek-key-file :

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

Reemplace lo siguiente:

  • INSTANCE_NAMES : una lista de nombres de instancias separados por espacios; por ejemplo, instance-01 instance-02 instance-03 .

  • ENCRYPTION_KEY_FILE : la ruta relativa al archivo JSON que contiene la clave de cifrado proporcionada por el cliente. Solo puede reiniciar varias instancias simultáneamente si las instancias utilizan la misma clave de cifrado proporcionada por el cliente.

  • ZONE : la zona donde se encuentran las instancias.

Ir

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 ! ");
      }
    }
  }

}

Nodo.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());
    }
}

Pitón

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)")

DESCANSAR

Para reiniciar una instancia que utiliza discos cifrados, realice una solicitud POST al método instances.startWithEncryptionKey :

POST  https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/startWithEncryptionKey

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

Reemplace lo siguiente:

  • PROJECT_ID : el ID del proyecto donde se encuentra la instancia.

  • ZONE : la zona donde se encuentra la instancia.

  • INSTANCE_NAME : el nombre de la instancia.

  • DISK_URL : la URL del recurso correspondiente al nombre completo del recurso del disco adjunto que está cifrado con una clave de cifrado proporcionada por el cliente.

  • ENCRYPTION_TYPE : el tipo de cifrado de disco que estás usando, que puede ser uno de los siguientes: rawKey , kmsKeyName o rsaEncryptedKey . Si utiliza el tipo rsaEncryptedKey , realice una solicitud POST al método beta.instances.startWithEncryptionKey .

  • ENCRYPTION_KEY : la clave de cifrado utilizada para cifrar los discos persistentes conectados a la instancia. Las claves rawKey o rsaEncryptedKey deben estar codificadas en base64 . Además, para preparar una clave rsaEncryptedKey , consulte Ajuste de claves RSA .

¿Qué sigue?