Compute Engine-Instanz löschen

In diesem Dokument wird beschrieben, wie Sie eine Compute Engine-Instanz endgültig löschen.

Wenn Sie eine Compute-Instanz nicht mehr benötigen, löschen Sie sie, damit keine Gebühren mehr für die Compute-Instanz und die angehängten Ressourcen anfallen. Die gelöschte Compute-Instanz kann nicht wiederhergestellt werden. Weitere Informationen zu den Status, die eine Compute-Instanz von der Erstellung bis zum Löschen durchläuft, finden Sie unter Lebenszyklus von Compute Engine-Instanzen.

Auswirkungen auf die Abrechnung bei gelöschten Instanzen

Nachdem Sie eine Compute-Instanz gelöscht haben, fallen keine Gebühren mehr für die Compute-Instanz und die angehängten Ressourcen an, außer in den folgenden Fällen:

  • Wenn Sie eine Compute-Instanz löschen, die auf einem Knoten für einzelne Mandanten gehostet wird, fallen weiterhin Gebühren für den Knoten für einzelne Mandanten an.

  • Wenn Sie eine Compute-Instanz löschen, die Sie mit einer Reservierung erstellt haben, bezahlen Sie weiterhin für die reservierten Ressourcen, bis eine der folgenden Bedingungen erfüllt ist:

    • Sie löschen die Reservierung oder Compute Engine löscht sie im Rahmen eines automatischen Vorgangs.

    • Sie reduzieren die Anzahl der reservierten Compute-Instanzen in der Reservierung.

  • Wenn Sie einen Rabatt für zugesicherte Nutzung haben, zahlen Sie weiterhin für die zugesicherten Ressourcen, unabhängig davon, ob Sie sie verwenden oder nicht.

  • Wenn Sie Ressourcen beibehalten, die an die Compute-Instanz angehängt sind, z. B. Laufwerke oder externe IP-Adressen, zahlen Sie weiterhin für diese Ressourcen, bis Sie sie löschen.

Weitere Informationen finden Sie unter Preise für VM-Instanzen.

Hinweis

Angehängte Ressourcen beibehalten

Wenn Sie eine Ressource, die an eine Compute-Instanz angehängt ist, vor dem Löschen beibehalten möchten, haben Sie folgende Möglichkeiten:

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die IAM-Rolle Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) für das Projekt zu gewähren, um die Berechtigungen zu erhalten, die Sie zum Löschen einer Compute-Instanz benötigen. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Diese vordefinierte Rolle enthält die Berechtigungen, die zum Löschen einer Compute-Instanz erforderlich sind. Maximieren Sie den Abschnitt Erforderliche Berechtigungen, um die notwendigen Berechtigungen anzuzeigen:

Erforderliche Berechtigungen

Die folgenden Berechtigungen sind zum Löschen einer Compute-Instanz erforderlich:

  • compute.instances.delete für die Compute-Instanz
  • So erzwingen Sie das Löschen eines angehängten Laufwerks: compute.disks.delete auf dem Laufwerk

Sie können diese Berechtigungen auch mit benutzerdefinierten Rollen oder anderen vordefinierten Rollen erhalten.

Compute-Instanzen löschen

Wenn Sie eine Compute-Instanz löschen, beendet Compute Engine die Compute-Instanz, bevor sie gelöscht wird. Wenn Sie eine oder mehrere Compute-Instanzen gleichzeitig löschen, müssen Sie entscheiden, was mit den angehängten Laufwerken geschehen soll:

  • Laufwerke löschen: Sie können die Bootlaufwerke, Nicht-Bootlaufwerke oder alle angehängten Laufwerke Ihrer Compute-Instanzen löschen. Wenn Sie Ihre Laufwerke so konfiguriert haben, dass sie beim Löschen beibehalten werden, können Sie diese Konfiguration optional überschreiben und das Löschen erzwingen.

    Eine Anleitung finden Sie unter Compute-Instanzen und alle angehängten Ressourcen löschen.

  • Laufwerke beibehalten: Sie können Bootlaufwerke, Nicht-Bootlaufwerke oder alle angehängten Laufwerke Ihrer Compute-Instanzen beibehalten.

    Eine Anleitung finden Sie unter Compute-Instanzen löschen und Laufwerke beibehalten.

Compute-Instanzen und alle angehängten Ressourcen löschen

Wenn Sie Compute-Instanzen in bestimmten Szenarien löschen möchten, z. B. um das Löschen angehängter Laufwerke zu erzwingen, ein ordnungsgemäßes Herunterfahren zu überspringen oder zu beenden oder mehrere Instanzen gleichzeitig zu löschen, verwenden Sie die entsprechende Methode:

  • Löschen von Laufwerken erzwingen: Wenn Sie ein angehängtes Laufwerk so konfiguriert haben, dass es erhalten bleibt, wenn Compute Engine eine Compute-Instanz löscht, können Sie diese Einstellung überschreiben und das Löschen mit der Google Cloud CLI erzwingen.

  • Ordnungsgemäßes Herunterfahren überspringen oder beenden: Wenn Sie das ordnungsgemäße Herunterfahren in der Compute-Instanz aktiviert haben, können Sie die Compute-Instanz löschen, ohne sie ordnungsgemäß herunterzufahren, oder ein laufendes ordnungsgemäßes Herunterfahren über dieGoogle Cloud Console, die gcloud CLI oder die REST API beenden.

  • Mehrere Compute-Instanzen löschen: Wenn Sie mehrere Compute-Instanzen gleichzeitig löschen möchten, verwenden Sie die Google Cloud Console oder, für mehrere Compute-Instanzen in derselben Zone, die gcloud CLI.

Wählen Sie eine der folgenden Optionen aus, um eine oder mehrere Compute-Instanzen und alle zugehörigen Ressourcen zu löschen:

Console

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

    Zur Seite „VM-Instanzen“

  2. Wählen Sie die Instanzen aus, die Sie löschen möchten.

  3. Klicken Sie auf  Löschen. Wenn die Option Löschen nicht angezeigt wird, klicken Sie auf Weitere Aktionen und wählen Sie dann Löschen aus.

  4. Führen Sie im angezeigten Dialogfeld die folgenden Schritte aus:

    1. Optional: Wenn Sie die Compute-Instanzen löschen möchten, ohne sie ordnungsgemäß herunterzufahren, oder wenn Sie ein laufendes ordnungsgemäßes Herunterfahren beenden möchten, wählen Sie das Kästchen Ordnungsgemäßes Herunterfahren überspringen (falls zutreffend) aus.

    2. Klicken Sie zur Bestätigung auf Löschen.

gcloud

Verwenden Sie den Befehl gcloud compute instances delete, um eine oder mehrere Compute-Instanzen in derselben Zone zu löschen:

gcloud compute instances delete INSTANCE_NAMES \
    --zone=ZONE

Ersetzen Sie Folgendes:

  • INSTANCE_NAMES: eine durch Leerzeichen getrennte Liste der Namen von Compute-Instanzen, die Sie löschen möchten. Geben Sie beispielsweise instance-01 instance-02 instance-03 an.

  • ZONE: die Zone, in der sich die Compute-Instanzen befinden.

Optional können Sie eines oder beide der folgenden Flags angeben:

  • Wenn Sie das Löschen der Laufwerke erzwingen möchten, die an eine oder mehrere Compute-Instanzen angehängt sind, fügen Sie das Flag --delete-disks hinzu:

    gcloud compute instances delete INSTANCE_NAMES \
        --delete-disks=DELETE_DISK_TYPE \
        --zone=ZONE
    

    Ersetzen Sie DELETE_DISK_TYPE durch die Speichertypen, die Sie löschen möchten. Geben Sie einen der folgenden Werte an:

    • So löschen Sie nichtflüchtigen Boot- und Nicht-Boot-Speicher: all

    • So löschen Sie nur den nichtflüchtigen Boot-Speicher: boot

    • So löschen Sie nur nichtflüchtigen Speicher, der kein Bootlaufwerk ist: data

  • Wenn Sie ein laufendes ordnungsgemäßes Herunterfahren überspringen oder beenden möchten, fügen Sie das Flag --no-graceful-shutdown ein:

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

C#


using Google.Cloud.Compute.V1;
using System.Threading.Tasks;

public class DeleteInstanceAsyncSample
{
    public async Task DeleteInstanceAsync(
        // TODO(developer): Set your own default values for these parameters or pass different values when calling this method.
        string projectId = "your-project-id",
        string zone = "us-central1-a",
        string machineName = "test-machine")
    {

        // Initialize client that will be used to send requests. This client only needs to be created
        // once, and can be reused for multiple requests.
        InstancesClient client = await InstancesClient.CreateAsync();

        // Make the request to delete a VM instance.
        var instanceDeletion = await client.DeleteAsync(projectId, zone, machineName);

        // Wait for the operation to complete using client-side polling.
        await instanceDeletion.PollUntilCompletedAsync();
    }
}

Go

import (
	"context"
	"fmt"
	"io"

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

// deleteInstance sends a delete request to the Compute Engine API and waits for it to complete.
func deleteInstance(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.DeleteInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
	}

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

	return nil
}

Java


import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.compute.v1.DeleteInstanceRequest;
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 DeleteInstance {

  public static void main(String[] args)
      throws IOException, InterruptedException, ExecutionException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "your-project-id";
    String zone = "zone-name";
    String instanceName = "instance-name";
    deleteInstance(project, zone, instanceName);
  }

  // Delete the instance specified by `instanceName`
  // if it's present in the given project and zone.
  public static void deleteInstance(String project, String zone, String instanceName)
      throws IOException, InterruptedException, ExecutionException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `instancesClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (InstancesClient instancesClient = InstancesClient.create()) {

      System.out.printf("Deleting instance: %s ", instanceName);

      // Describe which instance is to be deleted.
      DeleteInstanceRequest deleteInstanceRequest = DeleteInstanceRequest.newBuilder()
          .setProject(project)
          .setZone(zone)
          .setInstance(instanceName).build();

      OperationFuture<Operation, Operation> operation = instancesClient.deleteAsync(
          deleteInstanceRequest);
      // Wait for the operation to complete.
      Operation response = operation.get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        System.out.println("Instance deletion failed ! ! " + response);
        return;
      }
      System.out.println("Operation Status: " + response.getStatus());
    }
  }
}

Node.js

/**
 * TODO(developer): Uncomment 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');

// Delete the instance specified by `instanceName` if it's present in the given project and zone.
async function deleteInstance() {
  const instancesClient = new compute.InstancesClient();

  console.log(`Deleting ${instanceName} from ${zone}...`);

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

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

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

deleteInstance();

PHP

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

/**
 * Delete an instance.
 *
 * @param string $projectId Your Google Cloud project ID.
 * @param string $zone Zone where the instance you want to delete is (like "us-central1-a").
 * @param string $instanceName Unique name for the Compute instance to delete.
 *
 * @throws \Google\ApiCore\ApiException if the remote call fails.
 * @throws \Google\ApiCore\ValidationException if local error occurs before remote call.
 */
function delete_instance(
    string $projectId,
    string $zone,
    string $instanceName
) {
    // Delete the Compute Engine instance using InstancesClient.
    $instancesClient = new InstancesClient();
    $request = (new DeleteInstanceRequest())
        ->setInstance($instanceName)
        ->setProject($projectId)
        ->setZone($zone);
    $operation = $instancesClient->delete($request);

    // Wait for the operation to complete.
    $operation->pollUntilComplete();
    if ($operation->operationSucceeded()) {
        printf('Deleted instance %s' . PHP_EOL, $instanceName);
    } else {
        $error = $operation->getError();
        printf('Failed to delete 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 delete_instance(project_id: str, zone: str, machine_name: str) -> None:
    """
    Send an instance deletion request to the Compute Engine API and wait for it to complete.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone you want to use. For example: “us-west3-b”
        machine_name: name of the machine you want to delete.
    """
    instance_client = compute_v1.InstancesClient()

    print(f"Deleting {machine_name} from {zone}...")
    operation = instance_client.delete(
        project=project_id, zone=zone, instance=machine_name
    )
    wait_for_extended_operation(operation, "instance deletion")
    print(f"Instance {machine_name} deleted.")

Ruby


require "google/cloud/compute/v1"

# Sends an instance deletion request to the Compute Engine API and waits for it to complete.
#
# @param [String] project project ID or project number of the Cloud project you want to use.
# @param [String] zone name of the zone you want to use. For example: "us-west3-b"
# @param [String] instance_name name of the instance you want to delete.
def delete_instance project:, zone:, instance_name:
  # Initialize client that will be used to send requests. This client only needs to be created
  # once, and can be reused for multiple requests.
  client = ::Google::Cloud::Compute::V1::Instances::Rest::Client.new

  puts "Deleting #{instance_name} from #{zone}..."
  begin
    # Make the request to delete a VM instance.
    operation = client.delete project: project, zone: zone, instance: instance_name
    # Wait for the delete operation to complete.
    operation = wait_until_done operation: operation

    compute_operation = operation.operation
    if operation.error?
      warn "Error during deletion:", compute_operation.error.errors.map { |e| "#{e.code}: #{e.message}" }
    else
      warn "Warning during deletion:", compute_operation.warnings unless compute_operation.warnings.empty?
      puts "Instance #{instance_name} deleted."
    end
  rescue ::Google::Cloud::Error => e
    warn "Exception during deletion:", e
  end
end

REST

Senden Sie zum Löschen einer Compute-Instanz eine DELETE-Anfrage an die Methode instances delete:

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

Ersetzen Sie Folgendes:

  • PROJECT_ID: die ID des Projekts, in dem sich die Compute-Instanz befindet.

  • ZONE: die Zone, in der sich die Compute-Instanz befindet.

  • INSTANCE_NAME: Der Name der Compute-Instanz.

Wenn Sie ein laufendes ordnungsgemäßes Herunterfahren überspringen oder beenden möchten, fügen Sie den Abfrageparameter noGracefulShutdown, der auf true gesetzt ist, in die Anfrage-URL ein:

DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME?noGracefulShutdown=true

Compute-Instanzen löschen und Laufwerke beibehalten

Wenn Sie eine Compute-Instanz löschen, werden standardmäßig die Compute-Instanz und die angehängten Ressourcen gelöscht. Wenn Sie jedoch eine Compute-Instanz mithilfe der gcloud CLI löschen, können Sie angeben, dass die angehängten Laufwerke unabhängig von ihren Einstellungen für das automatische Löschen beibehalten werden sollen.

Wenn Sie eine oder mehrere Compute-Instanzen in derselben Zone löschen und die angehängten Laufwerke beibehalten möchten, verwenden Sie den Befehl gcloud compute instances delete mit dem Flag --keep-disks:

gcloud compute instances delete INSTANCE_NAMES \
    --keep-disks=KEEP_DISK_TYPE \
    --zone=ZONE

Ersetzen Sie Folgendes:

  • INSTANCE_NAMES: eine Liste der Namen von Compute-Instanzen, die Sie löschen möchten, durch Leerzeichen getrennt. Geben Sie beispielsweise instance-01 instance-02 instance-03 an.

  • KEEP_DISK_TYPE: die Typen von Laufwerken, die Sie beibehalten möchten. Geben Sie einen der folgenden Werte an:

    • So behalten Sie angehängte nichtflüchtige Speicher mit und ohne Startfunktion bei: all

    • So behalten Sie nur den angehängten nichtflüchtigen Boot-Speicher bei: boot

    • So bewahren Sie nur angehängten nichtflüchtigen Speicher auf, der kein Bootlaufwerk ist: data

  • ZONE: die Zone, in der sich die Compute-Instanzen befinden.

Wenn Sie das ordnungsgemäße Herunterfahren in einer oder mehreren Compute-Instanzen aktiviert haben, können Sie Kosten sparen, indem Sie die Compute-Instanzen löschen, ohne sie ordnungsgemäß herunterzufahren, oder indem Sie ein laufendes ordnungsgemäßes Herunterfahren manuell beenden. Fügen Sie dazu das Flag --no-graceful-shutdown in den Befehl ein:

gcloud compute instances delete VM_NAMES \
    --keep-disks=KEEP_DISK_TYPE \
    --no-graceful-shutdown \
    --zone=ZONE

Nächste Schritte