Elimine uma instância do Compute Engine

Este documento explica como eliminar uma instância do Compute Engine. Para saber mais acerca do ciclo de vida de uma instância, consulte Ciclo de vida da instância do Compute Engine.

Se já não precisar de uma instância, elimine-a para deixar de incorrer em custos pela instância e pelos respetivos recursos anexados.

Antes de começar

Funções necessárias

Para receber as autorizações de que precisa para eliminar uma instância de computação, peça ao seu administrador para lhe conceder a função IAM Administrador de instâncias do Compute (v1) (roles/compute.instanceAdmin.v1) no projeto. Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Esta função predefinida contém as autorizações necessárias para eliminar uma instância de computação. Para ver as autorizações exatas que são necessárias, expanda a secção Autorizações necessárias:

Autorizações necessárias

São necessárias as seguintes autorizações para eliminar uma instância de computação:

  • compute.instances.delete na instância
  • Para forçar a eliminação de um disco anexado: compute.disks.delete no disco

Também pode conseguir estas autorizações com funções personalizadas ou outras funções predefinidas.

Implicações de faturação

Depois de eliminar uma instância de computação, deixa de incorrer em custos pela instância e pelos respetivos recursos anexados, exceto nos seguintes casos:

  • Se eliminar uma instância alojada num nó de inquilino único, continua a incorrer em custos pelo nó de inquilino único.

  • Se eliminar uma instância que esteja a usar uma reserva, continua a pagar os recursos reservados até que ocorra uma das seguintes situações:

    • O Compute Engine elimina automaticamente a reserva na data e hora escolhidas.

    • Elimina a reserva.

    • Reduzir o número de instâncias reservadas na reserva.

  • Se tiver um desconto por utilização garantida, continua a pagar os recursos garantidos, quer os use ou não.

  • Se preservar quaisquer recursos anexados à instância, como discos, continua a pagar esses recursos até os eliminar.

Para mais informações, consulte os preços das instâncias de VM.

Preserve os recursos anexados

Em alguns casos, antes de eliminar uma instância de computação, pode querer preservar um dos recursos anexados. Pode preservar os recursos anexados da seguinte forma:

Elimine instâncias

Quando elimina uma instância de computação, o Compute Engine para a instância antes de a eliminar.

Se eliminar uma ou mais instâncias em simultâneo, tem de decidir o que acontece aos discos anexados:

Elimine instâncias e todos os recursos anexados

Consoante o que quer fazer quando elimina uma instância de computação, use as seguintes opções:

  • Se configurou um disco anexado para ser preservado após a eliminação da instância, pode substituir esta definição e forçar a respetiva eliminação através da CLI do Google Cloud.

  • Se tiver ativado o encerramento normal na instância, pode eliminá-la sem a encerrar normalmente ou terminar um encerramento normal em curso através da Trusted Cloud consola, CLI gcloud ou API REST.

  • Para eliminar várias instâncias em simultâneo, use a Trusted Cloud consola ou, para instâncias localizadas na mesma zona, a CLI gcloud.

Para eliminar uma ou mais instâncias e todos os recursos anexados, selecione uma das seguintes opções:

Consola

  1. Na Trusted Cloud consola, aceda à página Instâncias de VM.

    Aceder às instâncias de VM

  2. Selecione as instâncias que quer eliminar.

  3. Clique em Eliminar.

  4. Na caixa de diálogo, faça o seguinte:

    1. Opcional: para eliminar as instâncias sem as encerrar corretamente ou terminar um encerramento correto em curso, selecione a caixa de verificação Ignorar encerramento correto (se aplicável).

    2. Para confirmar, clique em Eliminar.

gcloud

Para eliminar uma ou mais instâncias na mesma zona, use o comando gcloud compute instances delete:

gcloud compute instances delete INSTANCE_NAMES \
    --zone=ZONE

Substitua o seguinte:

  • INSTANCE_NAMES: uma lista de nomes de instâncias separados por espaços, por exemplo, instance-01 instance-02 instance-03.

  • ZONE: a zona onde as instâncias estão localizadas.

Opcionalmente, pode fazer uma ou ambas as seguintes ações:

  • Para forçar a eliminação dos discos associados a uma ou mais instâncias, inclua a flag --delete-disks:

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

    Substitua DELETE_DISK_TYPE por um dos seguintes valores:

    • Para eliminar o armazenamento persistente de arranque e sem arranque anexado: all

    • Para eliminar apenas o armazenamento persistente de arranque anexado: boot

    • Para eliminar apenas o armazenamento persistente não inicializável: data

  • Se ativou o encerramento gradual em uma ou mais instâncias, pode eliminar as instâncias sem as encerrar gradualmente ou terminar manualmente um encerramento gradual em curso. Para tal, use o comando gcloud beta compute instances delete com a flag --no-graceful-shutdown:

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

Ir

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

    if operation.error?
      warn "Error during deletion:", operation.error
    else
      compute_operation = operation.operation
      warn "Warning during creation:", 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

Para eliminar uma instância, faça um pedido ao método instances delete:DELETE

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

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto onde a instância se encontra.

  • ZONE: a zona da instância.

  • INSTANCE_NAME: o nome da instância.

Opcionalmente, se tiver ativado o encerramento elegante na instância, pode eliminar as instâncias sem o encerrar elegantemente ou terminar manualmente um encerramento elegante em curso. Para o fazer, envie um pedido através do DELETEmétodo betainstances.delete. No URL do pedido, inclua o parâmetro de consulta noGracefulShutdown definido como true:

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

Elimine instâncias e preserve discos

Por predefinição, a eliminação de uma instância de computação elimina a instância e os respetivos recursos anexados. No entanto, quando elimina uma instância através da CLI gcloud, pode especificar que os discos anexados sejam preservados, independentemente das respetivas definições de eliminação automática.

Para eliminar uma ou mais instâncias na mesma zona, preservando os respetivos discos anexados, use o comando gcloud compute instances delete com a flag --keep-disks:

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

Substitua o seguinte:

  • INSTANCE_NAMES: uma lista de nomes de instâncias separados por espaços, por exemplo, instance-01 instance-02 instance-03.

  • KEEP_DISK_TYPE: especifique um dos seguintes valores:

    • Para preservar o armazenamento persistente associado de arranque e não de arranque: all

    • Para preservar apenas o armazenamento persistente de arranque associado: boot

    • Para preservar apenas o armazenamento persistente não inicializável anexado: data

  • ZONE: a zona onde as instâncias estão localizadas.

Opcionalmente, se tiver ativado o encerramento controlado numa ou mais instâncias, pode eliminar as instâncias sem as encerrar de forma controlada ou terminar manualmente um encerramento controlado em curso. Para tal, use o comando gcloud beta compute instances delete com a flag --no-graceful-shutdown:

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

O que se segue?