Suspender o reanudar una instancia de Compute Engine,Suspender o reanudar una instancia de Compute Engine


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

Si deseas mantener tu instancia de Compute Engine, pero no quieres incurrir en cargos por ella cuando no esté en uso, entonces puedes suspenderla. La suspensión de una instancia preserva la instancia y migra el contenido de la memoria de la instancia al almacenamiento. Después de reanudar la instancia, Compute Engine migra la memoria de la instancia desde el almacenamiento a la instancia y la instancia comienza a ejecutarse nuevamente.

Suspender una instancia de Compute Engine es útil para lo siguiente:

  • Entornos de desarrollo y prueba que no se utilizan por completo durante los períodos de inactividad, como durante las tardes o los fines de semana, y que desea mantener para ahorrar costos o una inicialización más rápida que la creación de nuevas instancias.

  • Aplicaciones que requieren un largo período de inicialización después de que la instancia haya terminado de iniciarse, pero antes de que la aplicación esté lista para atender su primera solicitud, como estaciones de trabajo virtuales para desarrolladores o aplicaciones Java complejas.

Antes de comenzar

Roles requeridos

Para obtener los permisos que necesita para suspender o reanudar 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 la instancia. 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 suspender o reanudar 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 suspender o reanudar una instancia informática:

  • Para suspender una instancia: compute.instances.suspend
  • Para reanudar una instancia: compute.instances.resume

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

Limitaciones

Al suspender una instancia informática, se aplican las siguientes limitaciones:

  • Solo puedes suspender una instancia si el sistema operativo invitado la admite. Para obtener más información, consulte Detalles del sistema operativo .

  • Solo puede suspender una instancia que utiliza Debian 8 o 9 como sistema operativo invitado si configura el sistema operativo antes de suspender la instancia.

  • Solo puedes suspender una instancia por hasta 60 días antes de que Compute Engine cambie automáticamente su estado a TERMINATED .

  • Puedes suspender máquinas virtuales puntuales o instancias interrumpibles; sin embargo, si Compute Engine se adelanta a la instancia antes de que se complete la operación de suspensión, Compute Engine finaliza la operación de suspensión y se adelanta a las instancias.

  • No puedes suspender instancias con GPU conectadas.

  • No se pueden suspender instancias bare metal.

  • No puede suspender máquinas virtuales confidenciales.

  • No puede suspender instancias mediante el uso de procesos estándar integrados en su entorno invitado. Comandos como systemctl suspend en Ubuntu 16.04 o posterior no son compatibles. Si se llama, Compute Engine ignora la señal del invitado.

  • No puedes suspender instancias con más de 208 GB de memoria.

  • No puede suspender instancias que tengan discos protegidos por CSEK adjuntos.

Habilitar operaciones de suspensión en Debian 8 o 9

Si una instancia informática ejecuta Debian 8 y 9 como sistema operativo invitado, antes de suspender la instancia, debe habilitar la suspensión y reanudación de las operaciones realizando una de las siguientes acciones:

Configurar el ACPID

Para habilitar la suspensión y reanudación de la operación en Debian 8 o 9, puede configurar el demonio de eventos de configuración avanzada y de interfaz de energía (ACPID) para manejar el evento del botón de suspensión. Después de habilitar el evento del botón de suspensión profunda, puede agregar un script de shell para manejar el evento de suspensión como se describe en esta sección.

Para configurar ACPID para admitir operaciones de suspensión y reanudación, haga lo siguiente:

  1. Si aún no lo ha hecho, conéctese a su instancia de Linux .

  2. Cree la carpeta events en la carpeta acpi :

    sudo mkdir -p /etc/acpi/events/
    
  3. Configure el ACPID para manejar el evento del botón de suspensión:

    cat <<EOF | sudo tee /etc/acpi/events/sleepbtn-acpi-support
    event=button[ /]sleep
    action=/etc/acpi/sleepbtn-acpi-support.sh
    EOF
    
  4. Cree el script de manejo de eventos de suspensión:

    cat <<EOF | sudo tee /etc/acpi/sleepbtn-acpi-support.sh
    #!/bin/sh
    echo mem > /sys/power/state
    EOF
    
  5. Configure los permisos para el script:

    sudo chmod 755 /etc/acpi/sleepbtn-acpi-support.sh
    
  6. Para que los cambios sean efectivos, reinicie el ACPID:

    sudo systemctl restart acpid.service
    

Instalar D-Bus

Para habilitar la operación de suspensión y reanudación en Debian 8 o 9, puede instalar D-Bus .

Para instalar D-Bus en el sistema operativo invitado de su instancia informática cuando el sistema operativo utiliza Debian 8 o 9, haga lo siguiente:

  1. Si aún no lo ha hecho, conéctese a su instancia de Linux .

  2. Instalar D-Bus:

    sudo apt-get install dbus
    
  3. Para que los cambios sean efectivos, reinicie logind :

    sudo systemctl restart systemd-logind.service
    

Suspender una instancia

Si el sistema operativo invitado de su instancia informática utiliza Debian 8 o 9, antes de suspender la instancia, debe configurar el sistema operativo invitado para admitir operaciones de suspensión y reanudación como se describe en este documento.

Para suspender una instancia, utilice los siguientes métodos según si la instancia tiene discos SSD locales conectados:

Suspender una instancia sin discos SSD locales

Puede suspender 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 Google Cloud. 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 para suspender.

  3. Haga clic en Suspender y luego haga clic en Suspender para confirmar.

nube de gcloud

Para suspender una o más instancias en una sola zona, usa el comando gcloud compute instances suspend :

gcloud compute instances suspend INSTANCE_NAMES \
    --zone=ZONE

Reemplace lo siguiente:

  • INSTANCE_NAMES : una lista de nombres de instancias separados por espacios en blanco; 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"
)

// suspendInstance suspends a running Google Compute Engine instance.
func suspendInstance(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.SuspendInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
	}

	op, err := instancesClient.Suspend(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to suspend 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 suspended\n")

	return nil
}

Java


import com.google.cloud.compute.v1.Instance.Status;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.Operation;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class SuspendInstance {

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

    String project = "your-project-id";
    String zone = "zone-name";
    String instanceName = "instance-name";

    suspendInstance(project, zone, instanceName);
  }

  // Suspend a running Google Compute Engine instance.
  // For limitations and compatibility on which instances can be suspended,
  // see: https://cloud.google.com/compute/docs/instances/suspend-resume-instance#limitations
  public static void suspendInstance(String project, String zone, String instanceName)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Instantiates a client.
    try (InstancesClient instancesClient = InstancesClient.create()) {

      Operation operation = instancesClient.suspendAsync(project, zone, instanceName)
          .get(300, TimeUnit.SECONDS);

      if (operation.hasError() || !instancesClient.get(project, zone, instanceName).getStatus()
          .equalsIgnoreCase(Status.SUSPENDED.toString())) {
        System.out.println("Cannot suspend instance. Try again!");
        return;
      }

      System.out.printf("Instance suspended successfully ! %s", instanceName);
    }
  }
}

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');

// Suspends a running Google Compute Engine instance.
async function suspendInstance() {
  const instancesClient = new compute.InstancesClient();

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

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

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

suspendInstance();

PHP

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

/**
 * Suspend 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 suspend.
  *
 * @throws \Google\ApiCore\ApiException if the remote call fails.
 * @throws \Google\ApiCore\ValidationException if local error occurs before remote call.
 */
function suspend_instance(
    string $projectId,
    string $zone,
    string $instanceName
) {
    // Suspend the running Compute Engine instance using InstancesClient.
    $instancesClient = new InstancesClient();
    $request = (new SuspendInstanceRequest())
        ->setInstance($instanceName)
        ->setProject($projectId)
        ->setZone($zone);
    $operation = $instancesClient->suspend($request);

    // Wait for the operation to complete.
    $operation->pollUntilComplete();
    if ($operation->operationSucceeded()) {
        printf('Instance %s suspended successfully' . PHP_EOL, $instanceName);
    } else {
        $error = $operation->getError();
        printf('Failed to suspend 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 suspend_instance(project_id: str, zone: str, instance_name: str) -> None:
    """
    Suspend 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 you want to suspend.
    """
    instance_client = compute_v1.InstancesClient()

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

    wait_for_extended_operation(operation, "suspend instance")

DESCANSAR

Para suspender una instancia, realice una solicitud POST al método instances.suspend :

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

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.

Suspender una instancia con discos SSD locales

Según cuántas instancias informáticas desea suspender simultáneamente y si necesita conservar los datos de sus discos SSD locales conectados, haga lo siguiente:

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

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

Para suspender 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 una o más instancias para suspender.

  3. Haga clic en Suspender y luego haga clic en Suspender para confirmar.

nube de gcloud

Al suspender una o más instancias en una sola zona que tenga 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 suspend con la marca --discard-local-ssd=true :

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

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

Reemplace lo siguiente:

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

  • ZONE : la zona donde se encuentran las instancias.

DESCANSAR

Al suspender 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.suspend . 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/suspend?discardLocalSsd=true
    
  • Para conservar los datos del SSD local, realice una solicitud POST al método beta.instances.suspend . 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/suspend?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.

Reanudar una instancia suspendida

Antes de reanudar una instancia informática suspendida, considere lo siguiente:

  • Puede reanudar una instancia solo si hay suficiente capacidad en la zona donde se encuentra la instancia. Esto no suele ser un problema. Si tiene problemas para reanudar una instancia, vuelva a intentarlo más tarde.

  • Si adjuntó discos SSD locales a la instancia y eligió conservar los datos del SSD local al suspenderla, es posible que deba volver a montar los discos SSD locales después de reanudarla. Para obtener más información, consulte cómo volver a montar discos que no son de arranque en instancias de Linux o instancias de Windows .

Puede reanudar 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 una o más instancias suspendidas para reanudarlas.

  3. Haga clic en Inicio/Reanudar y luego haga clic en Inicio .

nube de gcloud

Para reanudar una o más instancias suspendidas en una sola zona, usa el comando gcloud compute instances resume :

gcloud compute instances resume INSTANCE_NAMES \
    --zone=ZONE

Reemplace lo siguiente:

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

  • ZONE : la zona donde se encuentran las instancias suspendidas.

Ir

import (
	"context"
	"fmt"
	"io"

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

// resumeInstance resumes a suspended Google Compute Engine instance
// (with unencrypted disks).
func resumeInstance(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()

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

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

	if instance.GetStatus() != "SUSPENDED" {
		return fmt.Errorf(
			"only suspended instances can be resumed, instance %s is in %s state",
			instanceName,
			instance.GetStatus(),
		)
	}

	resumeInstanceReq := &computepb.ResumeInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
	}

	op, err := instancesClient.Resume(ctx, resumeInstanceReq)
	if err != nil {
		return fmt.Errorf("unable to resume 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 resumed\n")

	return nil
}

Java


import com.google.cloud.compute.v1.Instance.Status;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.Operation;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ResumeInstance {

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

    String project = "your-project-id";
    String zone = "zone-name";
    String instanceName = "instance-name";

    resumeInstance(project, zone, instanceName);
  }

  // Resume a suspended Google Compute Engine instance (with unencrypted disks).
  // Instance state changes to RUNNING, if successfully resumed.
  public static void resumeInstance(String project, String zone, String instanceName)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Instantiates a client.
    try (InstancesClient instancesClient = InstancesClient.create()) {

      String currentInstanceState = instancesClient.get(project, zone, instanceName).getStatus();

      // Check if the instance is currently suspended.
      if (!currentInstanceState.equalsIgnoreCase(Status.SUSPENDED.toString())) {
        throw new RuntimeException(
            String.format("Only suspended instances can be resumed. Instance %s is in %s state.",
                instanceName, currentInstanceState));
      }

      Operation operation = instancesClient.resumeAsync(project, zone, instanceName)
          .get(300, TimeUnit.SECONDS);

      if (operation.hasError() || !instancesClient.get(project, zone, instanceName).getStatus()
          .equalsIgnoreCase(
              Status.RUNNING.toString())) {
        System.out.println("Cannot resume instance. Try again!");
        return;
      }

      System.out.printf("Instance resumed successfully ! %s", instanceName);
    }
  }
}

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');

// Resumes a suspended Google Compute Engine instance (with unencrypted disks).
async function resumeInstance() {
  const instancesClient = new compute.InstancesClient();

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

  if (instance.status !== 'SUSPENDED') {
    throw new Error(
      'Only suspended instances can be resumed.' +
        `Instance ${instanceName} is in ${instance.status} state.`
    );
  }

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

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

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

resumeInstance();

PHP

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

/**
 * Resume a suspended 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 resume.
  *
 * @throws \Google\ApiCore\ApiException if the remote call fails.
 * @throws \Google\ApiCore\ValidationException if local error occurs before remote call.
 */
function resume_instance(
    string $projectId,
    string $zone,
    string $instanceName
) {
    // Resume the suspended Compute Engine instance using InstancesClient.
    $instancesClient = new InstancesClient();
    $request = (new ResumeInstanceRequest())
        ->setInstance($instanceName)
        ->setProject($projectId)
        ->setZone($zone);
    $operation = $instancesClient->resume($request);

    // Wait for the operation to complete.
    $operation->pollUntilComplete();
    if ($operation->operationSucceeded()) {
        printf('Instance %s resumed successfully' . PHP_EOL, $instanceName);
    } else {
        $error = $operation->getError();
        printf('Failed to resume 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 resume_instance(project_id: str, zone: str, instance_name: str) -> None:
    """
    Resume a suspended 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 you want to resume.
    """
    instance_client = compute_v1.InstancesClient()

    instance = instance_client.get(
        project=project_id, zone=zone, instance=instance_name
    )
    if instance.status != compute_v1.Instance.Status.SUSPENDED.name:
        raise RuntimeError(
            f"Only suspended instances can be resumed. "
            f"Instance {instance_name} is in {instance.status} state."
        )

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

    wait_for_extended_operation(operation, "instance resumption")

DESCANSAR

Para reanudar una instancia suspendida, realice una solicitud POST al método instances.resume :

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

Reemplace lo siguiente:

  • INSTANCE_NAME : el nombre de la instancia suspendida que se reanudará.

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

  • ZONE : la zona donde se encuentra la instancia suspendida.

¿Qué sigue?

,

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

Si deseas mantener tu instancia de Compute Engine, pero no quieres incurrir en cargos por ella cuando no esté en uso, entonces puedes suspenderla. La suspensión de una instancia preserva la instancia y migra el contenido de la memoria de la instancia al almacenamiento. Después de reanudar la instancia, Compute Engine migra la memoria de la instancia desde el almacenamiento a la instancia y la instancia comienza a ejecutarse nuevamente.

Suspender una instancia de Compute Engine es útil para lo siguiente:

  • Entornos de desarrollo y prueba que no se utilizan por completo durante los períodos de inactividad, como durante las tardes o los fines de semana, y que desea mantener para ahorrar costos o una inicialización más rápida que la creación de nuevas instancias.

  • Aplicaciones que requieren un largo período de inicialización después de que la instancia haya terminado de iniciarse, pero antes de que la aplicación esté lista para atender su primera solicitud, como estaciones de trabajo virtuales para desarrolladores o aplicaciones Java complejas.

Antes de comenzar

Roles requeridos

Para obtener los permisos que necesita para suspender o reanudar 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 la instancia. 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 suspender o reanudar 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 suspender o reanudar una instancia informática:

  • Para suspender una instancia: compute.instances.suspend
  • Para reanudar una instancia: compute.instances.resume

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

Limitaciones

Al suspender una instancia informática, se aplican las siguientes limitaciones:

  • Solo puedes suspender una instancia si el sistema operativo invitado la admite. Para obtener más información, consulte Detalles del sistema operativo .

  • Solo puede suspender una instancia que utiliza Debian 8 o 9 como sistema operativo invitado si configura el sistema operativo antes de suspender la instancia.

  • Solo puedes suspender una instancia por hasta 60 días antes de que Compute Engine cambie automáticamente su estado a TERMINATED .

  • Puedes suspender máquinas virtuales puntuales o instancias interrumpibles; sin embargo, si Compute Engine se adelanta a la instancia antes de que se complete la operación de suspensión, Compute Engine finaliza la operación de suspensión y se adelanta a las instancias.

  • No puedes suspender instancias con GPU conectadas.

  • No se pueden suspender instancias bare metal.

  • No puede suspender máquinas virtuales confidenciales.

  • No puede suspender instancias mediante el uso de procesos estándar integrados en su entorno invitado. Comandos como systemctl suspend en Ubuntu 16.04 o posterior no son compatibles. Si se llama, Compute Engine ignora la señal del invitado.

  • No puedes suspender instancias con más de 208 GB de memoria.

  • No puede suspender instancias que tengan discos protegidos por CSEK adjuntos.

Habilitar operaciones de suspensión en Debian 8 o 9

Si una instancia informática ejecuta Debian 8 y 9 como sistema operativo invitado, antes de suspender la instancia, debe habilitar la suspensión y reanudación de las operaciones realizando una de las siguientes acciones:

Configurar el ACPID

Para habilitar la suspensión y reanudación de la operación en Debian 8 o 9, puede configurar el demonio de eventos de configuración avanzada y de interfaz de energía (ACPID) para manejar el evento del botón de suspensión. Después de habilitar el evento del botón de suspensión profunda, puede agregar un script de shell para manejar el evento de suspensión como se describe en esta sección.

Para configurar ACPID para admitir operaciones de suspensión y reanudación, haga lo siguiente:

  1. Si aún no lo ha hecho, conéctese a su instancia de Linux .

  2. Cree la carpeta events en la carpeta acpi :

    sudo mkdir -p /etc/acpi/events/
    
  3. Configure el ACPID para manejar el evento del botón de suspensión:

    cat <<EOF | sudo tee /etc/acpi/events/sleepbtn-acpi-support
    event=button[ /]sleep
    action=/etc/acpi/sleepbtn-acpi-support.sh
    EOF
    
  4. Cree el script de manejo de eventos de suspensión:

    cat <<EOF | sudo tee /etc/acpi/sleepbtn-acpi-support.sh
    #!/bin/sh
    echo mem > /sys/power/state
    EOF
    
  5. Configure los permisos para el script:

    sudo chmod 755 /etc/acpi/sleepbtn-acpi-support.sh
    
  6. Para que los cambios sean efectivos, reinicie el ACPID:

    sudo systemctl restart acpid.service
    

Instalar D-Bus

Para habilitar la operación de suspensión y reanudación en Debian 8 o 9, puede instalar D-Bus .

Para instalar D-Bus en el sistema operativo invitado de su instancia informática cuando el sistema operativo utiliza Debian 8 o 9, haga lo siguiente:

  1. Si aún no lo ha hecho, conéctese a su instancia de Linux .

  2. Instalar D-Bus:

    sudo apt-get install dbus
    
  3. Para que los cambios sean efectivos, reinicie logind :

    sudo systemctl restart systemd-logind.service
    

Suspender una instancia

Si el sistema operativo invitado de su instancia informática utiliza Debian 8 o 9, antes de suspender la instancia, debe configurar el sistema operativo invitado para admitir operaciones de suspensión y reanudación como se describe en este documento.

Para suspender una instancia, utilice los siguientes métodos según si la instancia tiene discos SSD locales conectados:

Suspender una instancia sin discos SSD locales

Puede suspender 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 Google Cloud. 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 para suspender.

  3. Haga clic en Suspender y luego haga clic en Suspender para confirmar.

nube de gcloud

Para suspender una o más instancias en una sola zona, usa el comando gcloud compute instances suspend :

gcloud compute instances suspend INSTANCE_NAMES \
    --zone=ZONE

Reemplace lo siguiente:

  • INSTANCE_NAMES : una lista de nombres de instancias separados por espacios en blanco; 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"
)

// suspendInstance suspends a running Google Compute Engine instance.
func suspendInstance(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.SuspendInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
	}

	op, err := instancesClient.Suspend(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to suspend 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 suspended\n")

	return nil
}

Java


import com.google.cloud.compute.v1.Instance.Status;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.Operation;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class SuspendInstance {

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

    String project = "your-project-id";
    String zone = "zone-name";
    String instanceName = "instance-name";

    suspendInstance(project, zone, instanceName);
  }

  // Suspend a running Google Compute Engine instance.
  // For limitations and compatibility on which instances can be suspended,
  // see: https://cloud.google.com/compute/docs/instances/suspend-resume-instance#limitations
  public static void suspendInstance(String project, String zone, String instanceName)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Instantiates a client.
    try (InstancesClient instancesClient = InstancesClient.create()) {

      Operation operation = instancesClient.suspendAsync(project, zone, instanceName)
          .get(300, TimeUnit.SECONDS);

      if (operation.hasError() || !instancesClient.get(project, zone, instanceName).getStatus()
          .equalsIgnoreCase(Status.SUSPENDED.toString())) {
        System.out.println("Cannot suspend instance. Try again!");
        return;
      }

      System.out.printf("Instance suspended successfully ! %s", instanceName);
    }
  }
}

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');

// Suspends a running Google Compute Engine instance.
async function suspendInstance() {
  const instancesClient = new compute.InstancesClient();

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

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

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

suspendInstance();

PHP

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

/**
 * Suspend 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 suspend.
  *
 * @throws \Google\ApiCore\ApiException if the remote call fails.
 * @throws \Google\ApiCore\ValidationException if local error occurs before remote call.
 */
function suspend_instance(
    string $projectId,
    string $zone,
    string $instanceName
) {
    // Suspend the running Compute Engine instance using InstancesClient.
    $instancesClient = new InstancesClient();
    $request = (new SuspendInstanceRequest())
        ->setInstance($instanceName)
        ->setProject($projectId)
        ->setZone($zone);
    $operation = $instancesClient->suspend($request);

    // Wait for the operation to complete.
    $operation->pollUntilComplete();
    if ($operation->operationSucceeded()) {
        printf('Instance %s suspended successfully' . PHP_EOL, $instanceName);
    } else {
        $error = $operation->getError();
        printf('Failed to suspend 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 suspend_instance(project_id: str, zone: str, instance_name: str) -> None:
    """
    Suspend 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 you want to suspend.
    """
    instance_client = compute_v1.InstancesClient()

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

    wait_for_extended_operation(operation, "suspend instance")

DESCANSAR

Para suspender una instancia, realice una solicitud POST al método instances.suspend :

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

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.

Suspender una instancia con discos SSD locales

Según cuántas instancias informáticas desea suspender simultáneamente y si necesita conservar los datos de sus discos SSD locales conectados, haga lo siguiente:

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

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

Para suspender 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 una o más instancias para suspender.

  3. Haga clic en Suspender y luego haga clic en Suspender para confirmar.

nube de gcloud

Al suspender una o más instancias en una sola zona que tenga 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 suspend con la marca --discard-local-ssd=true :

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

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

Reemplace lo siguiente:

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

  • ZONE : la zona donde se encuentran las instancias.

DESCANSAR

Al suspender 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.suspend . 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/suspend?discardLocalSsd=true
    
  • Para conservar los datos del SSD local, realice una solicitud POST al método beta.instances.suspend . 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/suspend?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.

Reanudar una instancia suspendida

Antes de reanudar una instancia informática suspendida, considere lo siguiente:

  • Puede reanudar una instancia solo si hay suficiente capacidad en la zona donde se encuentra la instancia. Esto no suele ser un problema. Si tiene problemas para reanudar una instancia, vuelva a intentarlo más tarde.

  • Si adjuntó discos SSD locales a la instancia y eligió conservar los datos del SSD local al suspenderla, es posible que deba volver a montar los discos SSD locales después de reanudarla. Para obtener más información, consulte cómo volver a montar discos que no son de arranque en instancias de Linux o instancias de Windows .

Puede reanudar 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 una o más instancias suspendidas para reanudarlas.

  3. Haga clic en Inicio/Reanudar y luego haga clic en Inicio .

nube de gcloud

Para reanudar una o más instancias suspendidas en una sola zona, usa el comando gcloud compute instances resume :

gcloud compute instances resume INSTANCE_NAMES \
    --zone=ZONE

Reemplace lo siguiente:

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

  • ZONE : la zona donde se encuentran las instancias suspendidas.

Ir

import (
	"context"
	"fmt"
	"io"

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

// resumeInstance resumes a suspended Google Compute Engine instance
// (with unencrypted disks).
func resumeInstance(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()

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

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

	if instance.GetStatus() != "SUSPENDED" {
		return fmt.Errorf(
			"only suspended instances can be resumed, instance %s is in %s state",
			instanceName,
			instance.GetStatus(),
		)
	}

	resumeInstanceReq := &computepb.ResumeInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
	}

	op, err := instancesClient.Resume(ctx, resumeInstanceReq)
	if err != nil {
		return fmt.Errorf("unable to resume 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 resumed\n")

	return nil
}

Java


import com.google.cloud.compute.v1.Instance.Status;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.Operation;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ResumeInstance {

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

    String project = "your-project-id";
    String zone = "zone-name";
    String instanceName = "instance-name";

    resumeInstance(project, zone, instanceName);
  }

  // Resume a suspended Google Compute Engine instance (with unencrypted disks).
  // Instance state changes to RUNNING, if successfully resumed.
  public static void resumeInstance(String project, String zone, String instanceName)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Instantiates a client.
    try (InstancesClient instancesClient = InstancesClient.create()) {

      String currentInstanceState = instancesClient.get(project, zone, instanceName).getStatus();

      // Check if the instance is currently suspended.
      if (!currentInstanceState.equalsIgnoreCase(Status.SUSPENDED.toString())) {
        throw new RuntimeException(
            String.format("Only suspended instances can be resumed. Instance %s is in %s state.",
                instanceName, currentInstanceState));
      }

      Operation operation = instancesClient.resumeAsync(project, zone, instanceName)
          .get(300, TimeUnit.SECONDS);

      if (operation.hasError() || !instancesClient.get(project, zone, instanceName).getStatus()
          .equalsIgnoreCase(
              Status.RUNNING.toString())) {
        System.out.println("Cannot resume instance. Try again!");
        return;
      }

      System.out.printf("Instance resumed successfully ! %s", instanceName);
    }
  }
}

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');

// Resumes a suspended Google Compute Engine instance (with unencrypted disks).
async function resumeInstance() {
  const instancesClient = new compute.InstancesClient();

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

  if (instance.status !== 'SUSPENDED') {
    throw new Error(
      'Only suspended instances can be resumed.' +
        `Instance ${instanceName} is in ${instance.status} state.`
    );
  }

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

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

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

resumeInstance();

PHP

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

/**
 * Resume a suspended 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 resume.
  *
 * @throws \Google\ApiCore\ApiException if the remote call fails.
 * @throws \Google\ApiCore\ValidationException if local error occurs before remote call.
 */
function resume_instance(
    string $projectId,
    string $zone,
    string $instanceName
) {
    // Resume the suspended Compute Engine instance using InstancesClient.
    $instancesClient = new InstancesClient();
    $request = (new ResumeInstanceRequest())
        ->setInstance($instanceName)
        ->setProject($projectId)
        ->setZone($zone);
    $operation = $instancesClient->resume($request);

    // Wait for the operation to complete.
    $operation->pollUntilComplete();
    if ($operation->operationSucceeded()) {
        printf('Instance %s resumed successfully' . PHP_EOL, $instanceName);
    } else {
        $error = $operation->getError();
        printf('Failed to resume 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 resume_instance(project_id: str, zone: str, instance_name: str) -> None:
    """
    Resume a suspended 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 you want to resume.
    """
    instance_client = compute_v1.InstancesClient()

    instance = instance_client.get(
        project=project_id, zone=zone, instance=instance_name
    )
    if instance.status != compute_v1.Instance.Status.SUSPENDED.name:
        raise RuntimeError(
            f"Only suspended instances can be resumed. "
            f"Instance {instance_name} is in {instance.status} state."
        )

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

    wait_for_extended_operation(operation, "instance resumption")

DESCANSAR

Para reanudar una instancia suspendida, realice una solicitud POST al método instances.resume :

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

Reemplace lo siguiente:

  • INSTANCE_NAME : el nombre de la instancia suspendida que se reanudará.

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

  • ZONE : la zona donde se encuentra la instancia suspendida.

¿Qué sigue?