Borra una instancia de Compute Engine

En este documento, se explica cómo borrar de forma permanente una instancia de Compute Engine.

Si ya no necesitas una instancia de procesamiento, bórrala para dejar de generar cargos por ella y sus recursos adjuntos. No puedes recuperar la instancia de procesamiento borrada. Para obtener más información sobre los estados por los que pasa una instancia de procesamiento desde su creación hasta su eliminación, consulta Ciclo de vida de las instancias de Compute Engine.

Implicaciones de facturación para las instancias borradas

Después de borrar una instancia de procesamiento, dejarás de generar cargos por ella y sus recursos conectados, excepto en los siguientes casos:

  • Si borras una instancia de procesamiento alojada en un nodo de usuario único, se seguirán generando cargos por el nodo de usuario único.

  • Si borras una instancia de procesamiento que creaste con una reserva, seguirás pagando por los recursos reservados hasta que ocurra una de las siguientes situaciones:

    • Borras la reserva o Compute Engine lo hace para una operación automática.

    • Reduces la cantidad de instancias de procesamiento reservadas en la reserva.

  • Si tienes un descuento por compromiso de uso, seguirás pagando por los recursos comprometidos, sin importar si los usas o no.

  • Si conservas algún recurso conectado a la instancia de procesamiento, como discos o direcciones IP externas, seguirás pagando por esos recursos hasta que los borres.

Para obtener más información, consulta los precios de instancias de VM.

Antes de comenzar

Conserva los recursos adjuntos

Si deseas conservar un recurso que está conectado a una instancia de procesamiento antes de borrarlo, puedes realizar una o más de las siguientes acciones:

Roles obligatorios

Para obtener los permisos que necesitas para borrar una instancia de procesamiento, pídele a tu administrador que te otorgue el rol de IAM Administrador de instancias de Compute (v1) (roles/compute.instanceAdmin.v1) en el proyecto. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene los permisos necesarios para borrar una instancia de procesamiento. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para borrar una instancia de procesamiento:

  • compute.instances.delete en la instancia de procesamiento
  • Para forzar la eliminación de un disco conectado, usa el comando compute.disks.delete en el disco.

También puedes obtener estos permisos con roles personalizados o con otros roles predefinidos.

Borra instancias de procesamiento

Cuando borras una instancia de procesamiento, Compute Engine detiene la instancia de procesamiento antes de que se borre. Si borras una o más instancias de procesamiento de forma simultánea, debes decidir qué sucederá con los discos conectados:

  • Borrar discos: Puedes borrar los discos de arranque, los discos que no son de arranque o todos los discos conectados a tus instancias de procesamiento. Si configuraste los discos para que se conserven después de la eliminación, puedes anular esta configuración y forzar su eliminación.

    Para obtener instrucciones, consulta Borra instancias de procesamiento y todos los recursos adjuntos.

  • Conservar discos: Puedes conservar discos de arranque, discos que no son de arranque o todos los discos conectados a tus instancias de procesamiento.

    Para obtener instrucciones, consulta Borra instancias de procesamiento y conserva discos.

Borra las instancias de procesamiento y todos los recursos adjuntos

Para borrar instancias de procesamiento en situaciones específicas, como forzar la eliminación de discos conectados, omitir o finalizar un cierre ordenado, o borrar varias instancias al mismo tiempo, usa el método adecuado:

  • Forzar la eliminación de discos: Si configuraste un disco conectado para que se conserve cuando Compute Engine borra una instancia de procesamiento, puedes anular este parámetro de configuración y forzar su eliminación con Google Cloud CLI.

  • Omitir o finalizar un cierre ordenado: Si habilitaste el cierre ordenado en la instancia de procesamiento, puedes borrarla sin cerrarla de forma ordenada o finalizar un cierre ordenado en curso con la consola deGoogle Cloud , gcloud CLI o la API de REST.

  • Borra varias instancias de procesamiento: Si quieres borrar varias instancias de procesamiento de forma simultánea, usa la consola de Google Cloud o, para varias instancias de procesamiento que existen en la misma zona, gcloud CLI.

Para borrar una o más instancias de procesamiento y todos sus recursos adjuntos, elige una de las siguientes opciones:

Console

  1. En la consola de Google Cloud , ve a la página Instancias de VM.

    Ir a Instancias de VM

  2. Selecciona las instancias que quieres borrar.

  3. Haz clic en Borrar. Si no hay una opción Borrar, haz clic en Más acciones y, luego, selecciona Borrar.

  4. En el cuadro de diálogo que aparece, haz lo siguiente:

    1. Opcional: Para borrar las instancias de procesamiento sin cerrarlas de forma ordenada o para finalizar un cierre ordenado en curso, selecciona la casilla de verificación Omitir el cierre ordenado (si corresponde).

    2. Para confirmar la acción, haz clic en Borrar.

gcloud

Para borrar una o más instancias de procesamiento en la misma zona, usa el comando gcloud compute instances delete:

gcloud compute instances delete INSTANCE_NAMES \
    --zone=ZONE

Reemplaza lo siguiente:

  • INSTANCE_NAMES: Es una lista de nombres de instancias de procesamiento que deseas borrar, separados por espacios. Por ejemplo, especifica instance-01 instance-02 instance-03.

  • ZONE: Es la zona en la que existen las instancias de procesamiento.

De manera opcional, puedes incluir una o ambas de las siguientes marcas:

  • Para forzar la eliminación de los discos que están conectados a una o más instancias de procesamiento, incluye la marca --delete-disks:

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

    Reemplaza DELETE_DISK_TYPE por los tipos de almacenamiento que deseas borrar. Especifica uno de los siguientes valores:

    • Para borrar el almacenamiento persistente de arranque y que no es de arranque, haz lo siguiente: all

    • Para borrar solo el almacenamiento persistente de arranque, ejecuta el siguiente comando: boot

    • Para borrar solo el almacenamiento persistente que no es de arranque, haz lo siguiente: data

  • Para omitir o finalizar un cierre ordenado en curso, incluye la marca --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 borrar una instancia de procesamiento, realiza una solicitud DELETE al método instances delete:

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

Reemplaza lo siguiente:

  • PROJECT_ID: Es el ID del proyecto en el que existe la instancia de procesamiento.

  • ZONE: Es la zona en la que existe la instancia de procesamiento.

  • INSTANCE_NAME: Es el nombre de la instancia de procesamiento.

Si deseas omitir o finalizar un cierre ordenado en curso, incluye el parámetro de consulta noGracefulShutdown establecido en true en la URL de la solicitud:

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

Borra instancias de procesamiento y conserva discos

De forma predeterminada, cuando borras una instancia de procesamiento, se borran la instancia y sus recursos adjuntos. Sin embargo, cuando borras una instancia de procesamiento con la gcloud CLI, puedes especificar que se conserven los discos conectados, independientemente de su configuración de eliminación automática.

Para borrar una o más instancias de procesamiento en la misma zona y, al mismo tiempo, conservar sus discos conectados, usa el comando gcloud compute instances delete con la marca --keep-disks:

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

Reemplaza lo siguiente:

  • INSTANCE_NAMES: Es una lista de nombres de instancias de procesamiento que deseas borrar, separados por espacios. Por ejemplo, especifica instance-01 instance-02 instance-03.

  • KEEP_DISK_TYPE: los tipos de discos que deseas conservar. Especifica uno de los siguientes valores:

    • Para conservar el almacenamiento persistente de arranque y que no es de arranque conectado, haz lo siguiente: all

    • Para conservar solo el almacenamiento persistente de arranque conectado: boot

    • Para conservar solo el almacenamiento persistente que no es de arranque adjunto: data

  • ZONE: Es la zona en la que existen las instancias de procesamiento.

Si habilitaste el cierre ordenado en una o más instancias de procesamiento, puedes borrar las instancias de procesamiento sin cerrarlas de forma ordenada o finalizar de forma manual un cierre ordenado en curso para ahorrar costos. Para ello, incluye la marca --no-graceful-shutdown en el comando:

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

¿Qué sigue?