Elimina un'istanza Compute Engine

Questo documento spiega come eliminare definitivamente un'istanza Compute Engine.

Se un'istanza di computing non è più necessaria, eliminala per interrompere gli addebiti per l'istanza di computing e le risorse collegate. Non puoi recuperare l'istanza di computing eliminata. Per scoprire di più sugli stati che un'istanza di computing attraversa dalla creazione all'eliminazione, consulta Ciclo di vita delle istanze di Compute Engine.

Implicazioni per la fatturazione per le istanze eliminate

Dopo aver eliminato un'istanza di computing, non dovrai più sostenere gli addebiti per l'istanza di computing e le relative risorse collegate, tranne nei seguenti casi:

  • Se elimini un'istanza di computing ospitata su un nodo single-tenant, gli addebiti per il nodo single-tenant continueranno a essere applicati.

  • Se elimini un'istanza di computing creata utilizzando una prenotazione, continuerai a pagare le risorse prenotate finché non si verifica una delle seguenti condizioni:

    • Elimini la prenotazione o Compute Engine lo fa per un'operazione automatica.

    • Riduci il numero di istanze di computing dedicate nella prenotazione.

  • Se hai uno sconto per impegno di utilizzo, continuerai a pagare le risorse impegnate, indipendentemente dal fatto che le utilizzi o meno.

  • Se mantieni risorse collegate all'istanza di computing, ad esempio i dischi o gli indirizzi IP esterni, continuerai a pagarle finché non le elimini.

Per ulteriori informazioni, vedi Prezzi delle istanze VM.

Prima di iniziare

Conserva le risorse collegate

Se vuoi conservare una risorsa collegata a un'istanza di computing prima di eliminarla, puoi eseguire una o più delle seguenti operazioni:

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per eliminare un'istanza di computing, chiedi all'amministratore di concederti il ruolo IAM Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) nel progetto. Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Questo ruolo predefinito contiene le autorizzazioni necessarie per eliminare un'istanza di computing. Per vedere quali sono esattamente le autorizzazioni richieste, espandi la sezione Autorizzazioni obbligatorie:

Autorizzazioni obbligatorie

Per eliminare un'istanza di computing sono necessarie le seguenti autorizzazioni:

  • compute.instances.delete sull'istanza di computing
  • Per forzare l'eliminazione di un disco collegato: compute.disks.delete sul disco

Potresti anche ottenere queste autorizzazioni con ruoli personalizzati o altri ruoli predefiniti.

Elimina istanze di computing

Quando elimini un'istanza di computing, Compute Engine la arresta prima di eliminarla. Se elimini una o più istanze di computing contemporaneamente, devi decidere che cosa accade ai dischi collegati:

  • Elimina i dischi: puoi eliminare i dischi di avvio, i dischi non di avvio o tutti i dischi collegati alle istanze di computing. Se hai configurato i dischi in modo che vengano conservati al momento dell'eliminazione, puoi facoltativamente eseguire l'override di questa configurazione e forzarne l'eliminazione.

    Per istruzioni, consulta Elimina le istanze di computing e tutte le risorse collegate.

  • Conserva i dischi: puoi conservare i dischi di avvio, i dischi non di avvio o tutti i dischi collegati alle istanze di computing.

    Per istruzioni, consulta Elimina le istanze di computing e conserva i dischi.

Elimina le istanze di computing e tutte le risorse collegate

Per eliminare le istanze di computing in scenari specifici, ad esempio forzando l'eliminazione dei dischi collegati, saltando o terminando un arresto normale o eliminando più istanze contemporaneamente, utilizza il metodo appropriato:

  • Forza l'eliminazione dei dischi: se hai configurato un disco collegato da conservare quando Compute Engine elimina un'istanza di computing, puoi eseguire l'override di questa impostazione e forzare l'eliminazione utilizzando Google Cloud CLI.

  • Salta o termina un arresto normale: se hai attivato l'arresto normale nell'istanza di computing, puoi eliminarla senza arrestarla in modo normale o terminare un arresto normale in corso utilizzando la consoleCloud de Confiance , gcloud CLI o l'API REST.

  • Elimina più istanze di computing: se vuoi eliminare più istanze di computing contemporaneamente, utilizza la console Cloud de Confiance o, per più istanze di computing che si trovano nella stessa zona, gcloud CLI.

Per eliminare una o più istanze di computing e tutte le risorse collegate, seleziona una delle seguenti opzioni:

Console

  1. Nella console Cloud de Confiance , vai alla pagina Istanze VM.

    Vai a Istanze VM

  2. Seleziona le istanze da eliminare.

  3. Fai clic su Elimina. Se non è presente l'opzione Elimina, fai clic su Altre azioni e seleziona Elimina.

  4. Nella finestra di dialogo visualizzata, procedi nel seguente modo:

    1. (Facoltativo) Per eliminare le istanze di computing senza arrestarle in modo normale o per terminare un arresto normale in corso, seleziona la casella di controllo Salta arresto normale (se applicabile).

    2. Per confermare, fai clic su Elimina.

gcloud

Per eliminare una o più istanze di computing nella stessa zona, utilizza il comando gcloud compute instances delete:

gcloud compute instances delete INSTANCE_NAMES \
    --zone=ZONE

Sostituisci quanto segue:

  • INSTANCE_NAMES: un elenco di nomi di istanze di computing che vuoi eliminare, separati da spazi. Ad esempio, specifica instance-01 instance-02 instance-03.

  • ZONE: la zona in cui si trovano le istanze di computing.

Se vuoi, puoi includere uno o entrambi i seguenti flag:

  • Per forzare l'eliminazione dei dischi collegati a una o più istanze di computing, includi il flag --delete-disks:

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

    Sostituisci DELETE_DISK_TYPE con i tipi di spazio di archiviazione che vuoi eliminare. Specifica uno dei seguenti valori:

    • Per eliminare l'archiviazione permanente di avvio e non di avvio: all

    • Per eliminare solo l'archiviazione permanente di avvio: boot

    • Per eliminare solo l'archiviazione permanenteo non di avvio: data

  • Per saltare o terminare un arresto normale in corso, includi il flag --no-graceful-shutdown:

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

Vai

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 = compcompute_v1tInstancesClient    print(f"Deleting {machine_name} from {zone}...")
    operation = instinstance_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

Per eliminare un'istanza di computing, invia una richiesta DELETE al metodo instances delete:

DELETE https://compute.s3nsapis.fr/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto in cui si trova l'istanza di computing.

  • ZONE: la zona in cui si trova l'istanza di computing.

  • INSTANCE_NAME: il nome dell'istanza di computing.

Se vuoi saltare o terminare un arresto normale in corso, includi il parametro di query noGracefulShutdown impostato su true nell'URL della richiesta:

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

Elimina le istanze di computing e conserva i dischi

Per impostazione predefinita, l'eliminazione di un'istanza di computing comporta l'eliminazione dell'istanza di computing e delle risorse collegate. Tuttavia, quando elimini un'istanza di computing utilizzando gcloud CLI, puoi specificare di conservare i dischi collegati, indipendentemente dalle relative impostazioni di eliminazione automatica.

Per eliminare una o più istanze di computing nella stessa zona mantenendo i dischi collegati, utilizza il comando gcloud compute instances delete con il flag --keep-disks:

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

Sostituisci quanto segue:

  • INSTANCE_NAMES: un elenco di nomi di istanze di computing che vuoi eliminare, separati da spazi. Ad esempio, specifica instance-01 instance-02 instance-03.

  • KEEP_DISK_TYPE: i tipi di dischi che vuoi conservare. Specifica uno dei seguenti valori:

    • Per conservare l'archiviazione permanente di avvio e non di avvio collegata: all

    • Per conservare solo l'archiviazione permanente di avvio collegata: boot

    • Per conservare solo l'archiviazione permanente non di avvio collegata: data

  • ZONE: la zona in cui si trovano le istanze di computing.

Se hai attivato l'arresto normale in una o più istanze di computing, puoi risparmiare sui costi eliminando le istanze di computing senza arrestarle in modo normale o terminando manualmente un arresto normale in corso. Per farlo, includi il flag --no-graceful-shutdown nel comando:

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

Passaggi successivi