VM löschen

Auf dieser Seite wird beschrieben, wie Sie eine Instanz löschen. Wenn Sie eine Instanz nicht löschen, jedoch vorübergehend stoppen möchten, lesen Sie Instanzen starten und beenden oder Instanzen anhalten und fortsetzen.

Löschen Sie eine Instanz, um die Instanz und die damit verbundenen Ressourcen aus Ihrem Projekt zu entfernen. Wenn die Instanz Teil einer Instanzgruppe ist, versucht die Gruppe möglicherweise, eine identische Instanz neu zu erstellen, um eine bestimmte Gruppengröße beizubehalten. In diesem Fall können Sie die Größe der Instanzgruppe anpassen oder das Autoscaling neu konfigurieren.

Hinweis

Instanz löschen

Das Löschen einer Instanz geschieht über die Cloud Console, das Google Cloud CLI oder die API.

Console

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

    Zur Seite "VM-Instanzen"

  2. Klicken Sie die Kästchen der Instanzen an, die Sie löschen möchten.
  3. Klicken Sie auf die Schaltfläche Löschen.

gcloud

Führen Sie den gcloud compute instances delete-Befehl aus. Wenn Sie eine Instanz auf diese Weise löschen, fährt die Instanz herunter und wird aus der Liste der Instanzen entfernt. Alle der Instanz angehängten Ressourcen, wie nichtflüchtige Speicher und alle statischen IP-Adressen, werden freigegeben.

Verwenden Sie folgenden Befehl, um eine Instanz zu löschen:

gcloud compute instances delete example-instance [example-instance-2 example-instance-3..]

API

Verwenden Sie die Methode delete:

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

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 "google.golang.org/genproto/googleapis/cloud/compute/v1"
)

// 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: %v", 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: %v", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %v", 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\InstancesClient;

/**
 * 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();
    $operation = $instancesClient->delete($instanceName, $projectId, $zone);

    // 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

import sys
import time
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:
    """
    This method will wait 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.")
    return

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.operation, project: project

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

Auswirkungen auf die Abrechnung

Nachdem Sie eine VM-Instanz gelöscht haben, wird Ihnen diese Instanz nicht mehr in Rechnung gestellt, sofern keine der folgenden Situationen zutrifft:

  • Wenn Sie eine VM löschen, die auf einem Knoten für einzelne Mandanten gehostet wird, zahlen Sie weiterhin für den Knoten für einzelne Mandanten selbst und nicht für die einzelnen VMs, die auf dem Knoten gehostet werden.
  • Wenn Sie einen Vertrag über zugesicherte Nutzung haben, zahlen Sie weiterhin für die Ressourcen, denen Sie zugesagt haben, unabhängig davon, ob Sie diese Ressourcen nutzen.
  • Wenn Sie Ressourcen behalten, die an die VM-Instanz angehängt wurden, werden Ihnen diese Ressourcen in Rechnung gestellt, bis Sie sie ebenfalls löschen. Wenn Sie beispielsweise die VM-Instanz löschen, aber den nichtflüchtigen Speicher behalten, wird Ihnen der nichtflüchtige Speicher weiterhin in Rechnung gestellt.

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

Shutdown-Zeitraum

Wenn Sie eine Instanz herunterfahren oder löschen, sendet Compute Engine das ACPI Power Off-Signal an die Instanz und wartet eine kurze Zeitspanne, damit die Instanz ordnungsgemäß herunterfahren kann. Wenn die Instanz nach dieser Frist noch läuft, wird eine Beendigung durch Compute Engine erzwungen, auch wenn Ihr Shutdown-Skript noch ausgeführt wird.

Die Länge des Shutdown-Zeitraums hängt von der Art Ihrer Instanz ab.

  • Normale Instanzen haben einen Shutdown-Zeitraum, der in der Regel mindestens 90 Sekunden lang ist, aber auch länger sein kann.
  • Instanzen auf Abruf haben einen Shutdown-Zeitraum von 30 Sekunden. Dies entspricht dem Zeitraum für das Herunterfahren während des Prozesses der vorzeitigen Beendigung.

Wenn Sie in diesem Zeitraum ein Shutdown-Skript ausführen, muss Ihr Shutdown-Skript innerhalb dieses Zeitraums beendet werden, damit das Betriebssystem ausreichend Zeit hat, den Vorgang des Herunterfahrens zu beenden und Zwischenspeicher auf der Festplatte zu leeren.

Weitere Informationen