Excluir uma instância do Compute Engine

Neste documento, explicamos como excluir permanentemente uma instância do Compute Engine.

Se você não precisar mais de uma instância de computação, exclua-a para interromper as cobranças pela instância e pelos recursos anexados. Não é possível recuperar a instância de computação excluída. Para saber mais sobre os estados pelos quais uma instância de computação passa desde a criação até a exclusão, consulte Ciclo de vida da instância do Compute Engine.

Implicações de faturamento para instâncias excluídas

Depois de excluir uma instância de computação, você deixa de receber cobranças por ela e pelos recursos anexados, exceto nos seguintes casos:

  • Se você excluir uma instância de computação hospedada em um nó de locatário individual, ainda haverá cobranças pelo nó de locatário individual.

  • Se você excluir uma instância de computação criada usando uma reserva, vai continuar pagando pelos recursos reservados até que uma das seguintes situações ocorra:

    • Você exclui a reserva ou o Compute Engine faz isso para uma operação automática.

    • Você reduz o número de instâncias de computação reservadas na reserva.

  • Se você tiver um desconto por compromisso de uso, continuará pagando pelos recursos com que se comprometeu, independentemente de usá-los ou não.

  • Se você preservar recursos anexados à instância de computação, como discos ou endereços IP externo, continuará pagando por eles até que sejam excluídos.

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

Antes de começar

Preservar recursos anexados

Se você quiser preservar um recurso anexado a uma instância de computação antes de excluí-lo, siga um ou mais destes procedimentos:

Funções exigidas

Para receber as permissões necessárias para excluir uma instância de computação, peça ao administrador para conceder a você o papel do IAM de Administrador da instância do Compute (v1) (roles/compute.instanceAdmin.v1) no projeto. Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Esse papel predefinido contém as permissões necessárias para excluir uma instância de computação. Para acessar as permissões exatas necessárias, expanda a seção Permissões necessárias:

Permissões necessárias

As seguintes permissões são necessárias para excluir uma instância de computação:

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

Essas permissões também podem ser concedidas com funções personalizadas ou outros papéis predefinidos.

Excluir instâncias de computação

Quando você exclui uma instância de computação, o Compute Engine interrompe a instância antes que ela seja excluída. Se você excluir uma ou mais instâncias de computação simultaneamente, será preciso decidir o que acontece com os discos anexados:

  • Excluir discos: é possível excluir os discos de inicialização, os discos que não são de inicialização ou todos os discos anexados às instâncias de computação. Se você configurou os discos para serem preservados após a exclusão, é possível substituir essa configuração e forçar a exclusão deles.

    Para instruções, consulte Excluir instâncias de computação e todos os recursos anexados.

  • Preservar discos: é possível preservar discos de inicialização, discos que não são de inicialização ou todos os discos anexados às instâncias de computação.

    Para instruções, consulte Excluir instâncias de computação e preservar discos.

Excluir instâncias de computação e todos os recursos anexados

Para excluir instâncias de computação em cenários específicos, como forçar a exclusão de discos anexados, pular ou encerrar um encerramento completo ou excluir várias instâncias ao mesmo tempo, use o método apropriado:

  • Forçar a exclusão de discos: se você configurou um disco anexado para ser preservado quando o Compute Engine exclui uma instância de computação, é possível substituir essa configuração e forçar a exclusão usando a Google Cloud CLI.

  • Pular ou encerrar um encerramento completo: se você tiver ativado o encerramento completo na instância de computação, poderá excluí-la sem encerrá-la completamente ou encerrar um encerramento completo em andamento usando o Cloud de Confiance console, a CLI gcloud ou a API REST.

  • Excluir várias instâncias de computação: se você quiser excluir várias instâncias de computação simultaneamente, use o Cloud de Confiance console ou, para várias instâncias de computação que existem na mesma zona, a CLI gcloud.

Para excluir uma ou mais instâncias de computação e todos os recursos anexados, selecione uma das seguintes opções:

Console

  1. No console do Cloud de Confiance , acesse a página Instâncias de VM.

    Acessar instâncias de VM

  2. Selecione as instâncias que você quer excluir.

  3. Clique em Excluir. Se não houver a opção Excluir, clique em Mais ações e selecione Excluir.

  4. Na caixa de diálogo exibida, execute as ações a seguir:

    1. Opcional: para excluir as instâncias de computação sem fazer o encerramento completo ou para encerrar um encerramento completo em andamento, marque a caixa de seleção Ignorar encerramento completo (se aplicável).

    2. Para confirmar, clique em Excluir.

gcloud

Para excluir uma ou mais instâncias de computação na mesma zona, use o comando gcloud compute instances delete:

gcloud compute instances delete INSTANCE_NAMES \
    --zone=ZONE

Substitua:

  • INSTANCE_NAMES: uma lista de nomes de instâncias de computação que você quer excluir, separados por espaços. Por exemplo, especifique instance-01 instance-02 instance-03.

  • ZONE: a zona em que as instâncias de computação estão.

Se quiser, inclua uma ou ambas as flags a seguir:

  • Para forçar a exclusão dos discos anexados a uma ou mais instâncias de computação, inclua a flag --delete-disks:

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

    Substitua DELETE_DISK_TYPE pelos tipos de armazenamento que você quer excluir. Especifique um dos seguintes valores:

    • Para excluir o armazenamento permanente de inicialização e sem inicialização: all

    • Para excluir apenas o armazenamento permanente de inicialização: boot

    • Para excluir apenas o armazenamento permanente que não é de inicialização: data

  • Para pular ou encerrar um encerramento completo em andamento, inclua a 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();
    }
}

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

Para excluir uma instância de computação, faça uma solicitação DELETE ao método instances delete:

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

Substitua:

  • PROJECT_ID: o ID do projeto em que a instância de computação está.

  • ZONE: a zona em que a instância de computação está.

  • INSTANCE_NAME: o nome da instância de computação.

Se você quiser pular ou encerrar um encerramento completo em andamento, inclua o parâmetro de consulta noGracefulShutdown definido como true no URL da solicitação:

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

Excluir instâncias de computação e preservar discos

Por padrão, excluir uma instância de computação exclui a instância e os recursos anexados. No entanto, ao excluir uma instância de computação usando a CLI gcloud, é possível especificar a preservação dos discos anexados, independentemente das configurações de exclusão automática.

Para excluir uma ou mais instâncias de computação na mesma zona e, ao mesmo tempo, preservar os 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:

  • INSTANCE_NAMES: uma lista de nomes de instâncias de computação que você quer excluir, separados por espaços. Por exemplo, especifique instance-01 instance-02 instance-03.

  • KEEP_DISK_TYPE: os tipos de discos que você quer preservar. Especifique um dos seguintes valores:

    • Para preservar o armazenamento permanente anexado de inicialização e não inicialização: all

    • Para preservar apenas o armazenamento permanente de inicialização anexado: boot

    • Para preservar apenas o armazenamento permanente anexado que não é de inicialização: data

  • ZONE: a zona em que as instâncias de computação estão.

Se você tiver ativado o encerramento completo em uma ou mais instâncias de computação, poderá economizar custos excluindo as instâncias de computação sem encerrá-las de forma completa ou encerrando manualmente um encerramento completo em andamento. Para isso, inclua a flag --no-graceful-shutdown no comando:

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

A seguir