VM anhalten und fortsetzen


In diesem Dokument wird beschrieben, wie Sie eine VM-Instanz anhalten bzw. fortsetzen. Informationen zum Beenden und Starten einer Instanz finden Sie unter Instanzen starten und beenden. Informationen zum Instanzlebenszyklus finden Sie in der Dokumentation zum Lebenszyklus von Instanzen.

Wenn Sie Ihre VM-Instanz behalten, aber nicht in Rechnung stellen möchten, wenn sie nicht verwendet wird, können Sie die VM anhalten. Wenn Sie eine VM anhalten, behält Google die VM in Ihrem Projekt bei und verschiebt den Inhalt des VM-Arbeitsspeichers in den Speicher. Während die VM gesperrt ist, berechnet Google nur den Speicher, der zum Schutz des VM-Arbeitsspeichers verwendet wird. Attribute wie statische IP-Adressen bleiben bestehen, sodass Netzwerkfunktionen wie erwartet funktionieren, wenn Sie die VM fortsetzen. Nach dem Fortsetzen verschiebt Google den VM-Arbeitsspeicher aus dem Speicher zurück zur Instanz und beginnt mit der Abrechnung der jetzt ausgeführten VM-Instanz.

Das Anhalten einer Instanz ist ideal für:

  • Entwicklungs- und Testumgebungen, die zu bestimmten Zeiten (z. B. abends oder am Wochenende) nicht vollständig genutzt werden. So lassen sich Kosten sparen und VM-Instanzen können schneller initialisiert werden, als die Erstellung neuer Instanzen dauern würde.
  • Anwendungen, die nach dem Starten der Instanz erst einmal lange initialisiert werden müssen, bevor die Anwendung zur Verarbeitung ihrer ersten Anfrage bereit ist. Beispiele für solche Anwendungen sind virtuelle Entwickler-Workstations oder komplexe Java-Anwendungen.

Funktionsweise der Sperrung

Beim Anhalten einer Instanz wird an das Betriebssystem der Instanz ein ACPI-S3-Suspend-Signal gesendet. Das Anhalten einer Instanz ähnelt dem Schließen eines Laptops. Die Instanz erhält dabei den Status SUSPENDED.

Das Anhalten einer Instanz unterscheidet sich so vom Beenden einer Instanz:

Alle an die Instanz angehängten Ressourcen bleiben an die Instanz angehängt und werden in Rechnung gestellt, einschließlich nichtflüchtiger Speicher und statischer oder reservierter externer IP-Adressen. All diese Ressourcen werden gemäß der Preisübersicht abgerechnet, auch wenn eine Instanz angehalten wurde.

Sie können eine Instanz nicht mithilfe der Standardprozesse anhalten, die in die Gastumgebung eingebunden sind. Befehle wie systemctl suspend in Ubuntu 16.04 und höher sind nicht verfügbar. Sie können eine Instanz nur mit der Google Cloud CLI oder REST anhalten.

Wenn Sie den Arbeitsspeicher- und Gerätestatus der Instanz beim Fortsetzen nicht wiederherstellen möchten, können Sie die Instanz beenden. Dabei werden Ihnen keine zusätzlichen Gebühren für das Speichern berechnet.

Hinweise

  • Richten Sie die Authentifizierung ein, falls Sie dies noch nicht getan haben. Bei der Authentifizierung wird Ihre Identität für den Zugriff auf Google Cloud-Dienste und APIs überprüft. Zur Ausführung von Code oder Beispielen aus einer lokalen Entwicklungsumgebung können Sie sich wie folgt bei Compute Engine authentifizieren.

    Wählen Sie den Tab für die Verwendung der Beispiele auf dieser Seite aus:

    Console

    Wenn Sie über die Google Cloud Console auf Google Cloud-Dienste und -APIs zugreifen, müssen Sie die Authentifizierung nicht einrichten.

    gcloud

    1. Installieren Sie die Google Cloud CLI und initialisieren Sie sie mit folgendem Befehl:

      gcloud init
    2. Legen Sie eine Standardregion und -zone fest.

    Einfach loslegen (Go)

    Wenn Sie die Go-Beispiele auf dieser Seite aus einer lokalen Entwicklungsumgebung heraus verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

    1. Installieren Sie die Google Cloud CLI.
    2. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

      gcloud init
    3. Erstellen Sie lokale Anmeldedaten zur Authentifizierung für Ihr Google-Konto:

      gcloud auth application-default login

    Weitere Informationen: Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

    Java

    Wenn Sie die Java-Beispiele auf dieser Seite aus einer lokalen Entwicklungsumgebung heraus verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

    1. Installieren Sie die Google Cloud CLI.
    2. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

      gcloud init
    3. Erstellen Sie lokale Anmeldedaten zur Authentifizierung für Ihr Google-Konto:

      gcloud auth application-default login

    Weitere Informationen: Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

    Node.js

    Wenn Sie die Node.js-Beispiele auf dieser Seite aus einer lokalen Entwicklungsumgebung heraus verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

    1. Installieren Sie die Google Cloud CLI.
    2. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

      gcloud init
    3. Erstellen Sie lokale Anmeldedaten zur Authentifizierung für Ihr Google-Konto:

      gcloud auth application-default login

    Weitere Informationen: Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

    PHP

    Wenn Sie die PHP-Beispiele auf dieser Seite aus einer lokalen Entwicklungsumgebung heraus verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

    1. Installieren Sie die Google Cloud CLI.
    2. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

      gcloud init
    3. Erstellen Sie lokale Anmeldedaten zur Authentifizierung für Ihr Google-Konto:

      gcloud auth application-default login

    Weitere Informationen: Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

    Python

    Wenn Sie die Python-Beispiele auf dieser Seite aus einer lokalen Entwicklungsumgebung heraus verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

    1. Installieren Sie die Google Cloud CLI.
    2. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

      gcloud init
    3. Erstellen Sie lokale Anmeldedaten zur Authentifizierung für Ihr Google-Konto:

      gcloud auth application-default login

    Weitere Informationen: Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

    REST

    Verwenden Sie die von der gcloud CLI bereitgestellten Anmeldedaten, um die REST API-Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung zu verwenden.

      Installieren Sie die Google Cloud CLI und initialisieren Sie sie mit folgendem Befehl:

      gcloud init

Beschränkungen

Für dieses Feature gelten die folgenden Einschränkungen:

  • Sie können keine Instanzen anhalten, die eine GPU verwenden.
  • Sie können eine Instanz nicht mithilfe der Standardprozesse anhalten, die in die Gastumgebung eingebunden sind. Befehle wie systemctl suspend in Ubuntu 16.04 und höher sind nicht verfügbar. Das Gastsignal wird ignoriert.
  • Sie können eine Instanz nur bis zu 60 Tage lang anhalten, bevor die VM-Instanz automatisch beendet wird.
  • Sie können Instanzen mit mehr als 208 GB Arbeitsspeicher nicht anhalten.
  • Sie können Instanzen auf Abruf anhalten. Die Instanz auf Abruf wird jedoch möglicherweise beendet, bevor sie erfolgreich angehalten wird.
  • Sie können eine Confidential VM nicht sperren.
  • Sie können keine VM anhalten, an die CSEK-geschützte Laufwerke angehängt sind.

Lokale SSDs

Normalerweise werden alle Daten auf lokalen SSDs mit dem Anhalten einer VM-Instanz, die die lokale SSD verwendet, verworfen.

Weitere Informationen finden Sie in der Dokumentation zu lokalen SSDs.

VMs auf Abruf

Sie können eine VM auf Abruf anhalten. Wenn jedoch das vorzeitige Beenden (nicht die Vorabwarnung, die vor dem vorzeitigen Beenden angezeigt wird) vor Abschluss des Anhaltevorgangs ausgeführt wird, wird der Anhaltevorgang abgebrochen und die Instanz vorzeitig beendet.

Betriebssystemkompatibilität

Die meisten in Compute Engine angebotenen Betriebssysteme unterstützen die Funktionen zum Anhalten und Fortsetzen, einige Betriebssysteme jedoch nicht. Eine vollständige Liste finden Sie auf der Seite Betriebssystemdetails.

Preise

Wenn Sie eine Instanz anhalten, wird Ihnen Folgendes in Rechnung gestellt:

  • Instanzarbeitsspeicher (siehe Preise für angehaltene VM-Instanzen)
  • Jede Nutzung des nichtflüchtigen Speichers für das Bootlaufwerk und alle zusätzlichen Laufwerke, die mit der Instanz verbunden sind (siehe Preise für nichtflüchtigen Speicher)
  • Alle statischen IP-Adressen, die mit der Instanz verbunden sind
  • Durch das Anhalten von VMs können Sie Ihre Softwarelizenzgebühren sparen. Wenn Sie beispielsweise Windows-VMs sperren, fallen keine Windows-Lizenzgebühren an. Lizenzgebühren für andere Images können unterschiedliche Nutzungsbedingungen haben und können zu Gebühren führen, auch wenn sie gesperrt werden.

Instanz anhalten

Verwenden Sie zum Anhalten einer Instanz die Cloud Console, die gcloud CLI, die API oder die Cloud-Clientbibliotheken.

Sie können eine Instanz nicht mithilfe der Standardprozesse anhalten, die in die Gastumgebung eingebunden sind. Sie können eine Instanz mit der Cloud Console, der Google Cloud CLI oder der API anhalten.

Der Anhalten-Vorgang kann fehlschlagen, wenn er zu kurz nach dem Start der Instanz ausgelöst wird. Die Instanz muss vollständig gestartet werden (einschließlich Prozessen wie Gast-Agent), damit der Sperrvorgang erfolgreich ist.

Console

  1. Rufen Sie in der Google Cloud Console die Seite VM-Instanzen auf.

    Zur Seite "VM-Instanzen"

  2. Wählen Sie eine oder mehrere Instanzen aus, die angehalten werden sollen.

  3. Klicken Sie auf Sperren.

  4. Wenn Sie lokale SSD-Daten verwerfen möchten, wählen Sie SSD-Inhalt verwerfen aus, wenn Sie dazu aufgefordert werden. Wenn die Instanz fortgesetzt wird, sind die Daten auf der mit der Instanz verbundenen lokalen SSD nicht mehr verfügbar.

gcloud

So halten Sie eine Instanz in der Google Cloud CLI an:

 gcloud compute instances suspend VM_NAME

Nachdem Sie eine Anfrage zum Anhalten einer Instanz gestellt haben, kann es einige Zeit dauern, bis Compute Engine alle für die Instanz notwendigen Daten für den Erhalt vorbereitet hat. Während dieser Zeit wird Ihnen die Instanz weiterhin in Rechnung gestellt, solange sie noch ausgeführt wird.

Eine angehaltene Instanz hat den Status SUSPENDED. Mit einer describe-Anfrage können Sie den Status einer Instanz prüfen:

gcloud compute instances describe VM_NAME

Wenn Sie eine Instanz mit lokalen SSD-Daten anhalten möchten, müssen Sie das Flag --discard-local-ssd angeben:

gcloud compute instances suspend VM_NAME --discard-local-ssd

Wenn Sie --discard-local-ssd oder --discard-local-ssd=True verwenden, wird der Inhalt der lokalen SSD verworfen. Compute Engine --discard-local-ssd=False ist derzeit in der öffentlichen Vorschau verfügbar. Mit diesem Flag wird der Inhalt von bis zu 16 lokalen SSD-Laufwerken während des Anhaltens gespeichert. Weitere Informationen finden Sie in der Dokumentation zu lokalen SSDs.

Einfach loslegen (Go)

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "google.golang.org/genproto/googleapis/cloud/compute/v1"
)

// 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);
    }
  }
}

Node.js

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const zone = 'europe-central2-b';
// const instanceName = 'YOUR_INSTANCE_NAME';

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

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

Python

from __future__ import annotations

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1

def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result

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

REST

Senden Sie mithilfe der Methode instances.suspend eine Anfrage in der API:

https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/suspend

Ersetzen Sie dabei Folgendes:

  • PROJECT_ID: die Projekt-ID
  • ZONE: die Zone der VM
  • VM_NAME: die Instanz, die Sie anhalten möchten

Nachdem Sie eine Anfrage zum Anhalten einer Instanz gestellt haben, kann es einige Zeit dauern, bis Compute Engine alle für die Instanz notwendigen Daten für den Erhalt vorbereitet hat. Während dieser Zeit wird Ihnen die Instanz in Rechnung gestellt, solange sie noch ausgeführt wird.

Compute Engine kennzeichnet angehaltene Instanzen mit dem Status SUSPENDED. Mit einer GET-Anfrage können Sie den Status einer Instanz prüfen:

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

Der Status der Instanz lässt sich am Statusfeld ablesen. Beispiel:

...
"zone": "https://content.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a",
"status": "SUSPENDED",
"name": "example-vm",
...

Zum Anhalten einer Instanz mit mehr als {maximum_local_ssd_disks_for_suspend}}lokalen SSD-Laufwerken müssen Sie die lokalen SSD-Daten verwerfen, indem Sie den Abfrageparameter discardLocalSsd angeben:

https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/suspend?discardLocalSsd=true

Eine angehaltene Instanz fortsetzen

Sie können eine Instanz nur dann fortsetzen, wenn in der Zone, in der sich die VM befindet, genügend Kapazität vorhanden ist. In den meisten Fällen ist dies kein Problem, aber wenn Probleme mit der Kapazität auftreten, wiederholen Sie die Fortsetzungsanfrage zu einem späteren Zeitpunkt.

Wenn Sie eine angehaltene Instanz fortsetzen möchten, verwenden Sie die Cloud Console die gcloud CLI ,API oderCloud-Clientbibliotheken.

Console

  1. Rufen Sie in der Google Cloud Console die Seite VM-Instanzen auf.

    Zur Seite "VM-Instanzen"

  2. Wählen Sie eine oder mehrere Instanzen aus, die fortgesetzt werden sollen.

  3. Klicken Sie auf Starten/Fortsetzen.

gcloud

So setzen Sie eine Instanz in der Google Cloud CLI fort:

 gcloud compute instances resume VM_NAME

Nach einer Anfrage zum Fortsetzen einer Instanz kann es einige Zeit dauern, bis Compute Engine alle für die Instanz erforderlichen Daten wiederhergestellt hat. Während dieser Zeit wird Ihnen die Instanz in Rechnung gestellt, solange sie fortgesetzt wird.

Eine Instanz wird fortgesetzt, wenn sie als RUNNING markiert ist. Über eine Anfrage "describe" prüfen Sie den Status einer Instanz:

gcloud compute instances describe VM_NAME

Einfach loslegen (Go)

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "google.golang.org/genproto/googleapis/cloud/compute/v1"
)

// 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);
    }
  }
}

Node.js

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const zone = 'europe-central2-b';
// const instanceName = 'YOUR_INSTANCE_NAME';

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

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

Python

from __future__ import annotations

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1

def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result

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

REST

Stellen Sie eine Anfrage an die Methode instances.resume:

https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/resume

Ersetzen Sie dabei Folgendes:

  • PROJECT_ID: die Projekt-ID für diese Anfrage
  • ZONE: die Zone der VM
  • VM_NAME: die Instanz, die fortgesetzt werden soll

Nach einer Anfrage zum Fortsetzen einer Instanz kann es einige Zeit dauern, bis Compute Engine alle für die Instanz erforderlichen Daten wiederhergestellt hat. Während dieser Zeit wird Ihnen die Instanz in Rechnung gestellt, solange sie fortgesetzt wird.

In Compute Engine werden angehaltene Instanzen mit dem Status RUNNING gekennzeichnet. Mit einer GET-Anfrage können Sie den Status einer Instanz prüfen:

GET https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/instances/example-instance

Der Status der Instanz lässt sich am Statusfeld ablesen. Beispiel:

...
"zone": "https://content.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a",
"status": "RUNNING",
"name": "example-instance",
...

Anhaltevorgang

Wenn Sie eine Anfrage zum Anhalten stellen, senden Sie ein ACPI-Suspend-Signal an die VM-Instanz. Wenn die VM nicht innerhalb von wenigen Minuten auf das ACPI-S3-Suspend-Signal reagiert, bricht Compute Engine den Anhalteversuch ab und setzt die VM in den Status RUNNING zurück.

In der folgenden Tabelle wird beschrieben, wie sich das Anhalten einer VM-Instanz auf ihre zugehörigen Ressourcen auswirkt:

Ressource Unterstützung
Arbeitsspeicher Nur VMs mit höchstens 208 GB Arbeitsspeicher können angehalten werden.
Lokale SSD Lokale SSD-Daten werden verworfen.
Nichtflüchtiger Speicher Nichtflüchtige HDDs und SSDs bleiben erhalten.
IP-Adressen Sitzungsspezifische IP-Adressen werden während des Anhaltens freigegeben. Statische IP-Adressen bleiben jedoch mit den VM-Instanzen verbunden. Wenn Sie Ihre sitzungsspezifische IP behalten möchten, können Sie sie hochstufen.
VM-Konfiguration (z. B. Maschinentyp, Metadaten, Labels usw.) Alle VM-Konfigurationen (mit Ausnahme sitzungsspezifischer IP-Adressen) bleiben erhalten und werden wiederhergestellt, wenn die Instanz fortgesetzt wird.

Debian-VM zur Unterstützung von Anhalten und Fortsetzen konfigurieren

VMs, auf denen Debian 8 und 9 ausgeführt wird, können angehalten und fortgesetzt werden. Allerdings müssen sie zuvor entsprechend konfiguriert werden. Führen Sie zum Konfigurieren der Debian-Instanz eine der Anleitungen unter Option A oder Option B aus. Wir empfehlen, nach Möglichkeit ACPID zu konfigurieren (Option A).

Option A

Mit dieser Option wird ACPID so konfiguriert, dass das Schaltflächenereignis für den Ruhemodus verarbeitet wird. Darüber hinaus wird ein Shell-Skript für die Verarbeitung des Ruhemodusereignisses hinzugefügt.

  1. Stellen Sie eine SSH-Verbindung zur VM-Instanz her:

    gcloud compute ssh VM_NAME
    
  2. Erstellen Sie auf der VM-Instanz ein Verzeichnis im Ordner acpi:

    sudo mkdir -p /etc/acpi/events/
    
  3. Konfigurieren Sie ACPID so, dass das Schaltflächenereignis für den Ruhemodus verarbeitet wird:

    cat <<EOF | sudo tee /etc/acpi/events/sleepbtn-acpi-support
    event=button[ /]sleep
    action=/etc/acpi/sleepbtn-acpi-support.sh
    EOF
    
  4. Erstellen Sie das Skript zur Verarbeitung von Ruhemodusereignissen:

    cat <<EOF | sudo tee /etc/acpi/sleepbtn-acpi-support.sh
    #!/bin/sh
    echo mem > /sys/power/state
    EOF
    
  5. Legen Sie die Berechtigungen für das Skript fest:

    sudo chmod 755 /etc/acpi/sleepbtn-acpi-support.sh
    
  6. Starten Sie ACPID neu:

    sudo systemctl restart acpid.service
    

Option B

  1. Stellen Sie eine SSH-Verbindung zur VM-Instanz her:

    gcloud compute ssh VM_NAME
    
  2. Installieren Sie dbus auf der VM-Instanz:

    sudo apt-get install dbus
    
  3. Starten Sie logind neu:

    sudo systemctl restart systemd-logind.service
    

Nächste Schritte