Menghapus instance Compute Engine

Dokumen ini menjelaskan cara menghapus instance Compute Engine secara permanen.

Jika Anda tidak lagi memerlukan instance komputasi, hapus instance tersebut untuk berhenti dikenai biaya untuk instance komputasi dan resource yang terpasang. Anda tidak dapat memulihkan instance komputasi yang dihapus. Untuk mempelajari lebih lanjut status yang dilalui instance komputasi dari pembuatan hingga penghapusannya, lihat Siklus proses instance Compute Engine.

Implikasi penagihan untuk instance yang dihapus

Setelah menghapus instance komputasi, Anda tidak akan lagi dikenai biaya untuk instance komputasi dan resource yang terpasang, kecuali dalam kasus berikut:

  • Jika Anda menghapus instance komputasi yang dihosting di sole-tenant node, Anda akan tetap dikenai biaya untuk sole-tenant node tersebut.

  • Jika Anda menghapus instance komputasi yang dibuat menggunakan pemesanan, Anda akan terus membayar resource yang dipesan hingga salah satu hal berikut terjadi:

    • Anda menghapus pemesanan, atau Compute Engine melakukannya untuk operasi otomatis.

    • Anda mengurangi jumlah instance komputasi yang dipesan dalam pemesanan.

  • Jika memiliki diskon abonemen, Anda akan terus membayar resource yang telah disepakati, terlepas dari apakah Anda menggunakannya atau tidak.

  • Jika Anda mempertahankan resource apa pun yang terpasang ke instance komputasi, seperti disk atau alamat IP eksternal, Anda akan terus membayar resource tersebut hingga Anda menghapusnya.

Untuk mengetahui informasi selengkapnya, lihat Harga instance VM.

Sebelum memulai

Mempertahankan resource yang terlampir

Jika ingin mempertahankan resource yang terpasang ke instance komputasi sebelum menghapusnya, Anda dapat melakukan satu atau beberapa hal berikut:

Peran yang diperlukan

Untuk mendapatkan izin yang diperlukan untuk menghapus instance komputasi, minta administrator untuk memberi Anda peran IAM Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) pada project. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

Peran bawaan ini berisi izin yang diperlukan untuk menghapus instance komputasi. Untuk melihat izin yang benar-benar diperlukan, perluas bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk menghapus instance komputasi:

  • compute.instances.delete pada instance komputasi
  • Untuk memaksa penghapusan disk yang terpasang: compute.disks.delete pada disk

Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.

Menghapus instance komputasi

Saat Anda menghapus instance komputasi, Compute Engine menghentikan instance komputasi sebelum dihapus. Jika Anda menghapus satu atau beberapa instance komputasi secara bersamaan, Anda harus memutuskan apa yang akan terjadi pada disk yang terpasang:

  • Menghapus disk: Anda dapat menghapus boot disk, non-boot disk, atau semua disk yang terpasang ke instance komputasi Anda. Jika Anda mengonfigurasi disk untuk dipertahankan setelah penghapusan, Anda dapat mengganti konfigurasi ini dan memaksa penghapusannya.

    Untuk mengetahui petunjuknya, lihat Menghapus instance komputasi dan semua resource yang terpasang.

  • Mempertahankan disk: Anda dapat mempertahankan boot disk, disk non-boot, atau semua disk yang terpasang ke instance komputasi Anda.

    Untuk mengetahui petunjuknya, lihat Menghapus instance komputasi dan mempertahankan disk.

Menghapus instance komputasi dan semua resource yang terpasang

Untuk menghapus instance komputasi dalam skenario tertentu—seperti memaksa penghapusan disk yang terpasang, melewati atau mengakhiri penghentian normal, atau menghapus beberapa instance secara bersamaan—gunakan metode yang sesuai:

  • Menghapus disk secara paksa: jika Anda telah mengonfigurasi disk yang terpasang untuk dipertahankan saat Compute Engine menghapus instance komputasi, Anda dapat mengganti setelan ini dan memaksa penghapusannya menggunakan Google Cloud CLI.

  • Melewati atau mengakhiri penghentian normal: jika Anda telah mengaktifkan penghentian normal di instance komputasi, Anda dapat menghapus instance komputasi tanpa menghentikannya secara normal atau mengakhiri penghentian normal yang sedang berlangsung menggunakan konsolGoogle Cloud , gcloud CLI, atau REST API.

  • Menghapus beberapa instance komputasi: jika Anda ingin menghapus beberapa instance komputasi secara bersamaan, gunakan konsol Google Cloud atau, untuk beberapa instance komputasi yang ada di zona yang sama, gcloud CLI.

Untuk menghapus satu atau beberapa instance komputasi dan semua resource yang terpasang, pilih salah satu opsi berikut:

Konsol

  1. Di konsol Google Cloud , buka halaman VM instances.

    Buka instance VM

  2. Pilih instance yang ingin Anda hapus.

  3. Klik Delete. Jika tidak ada opsi Delete, klik More actions, lalu pilih Delete.

  4. Pada dialog yang muncul, lakukan hal berikut:

    1. Opsional: Untuk menghapus instance komputasi tanpa penghentian normal, atau untuk mengakhiri penghentian normal yang sedang berlangsung, centang kotak Skip graceful shutdown (if applicable).

    2. Untuk mengonfirmasi, klik Hapus.

gcloud

Untuk menghapus satu atau beberapa instance komputasi di zona yang sama, gunakan perintah gcloud compute instances delete:

gcloud compute instances delete INSTANCE_NAMES \
    --zone=ZONE

Ganti kode berikut:

  • INSTANCE_NAMES: daftar nama instance komputasi yang ingin Anda hapus, dipisahkan dengan spasi. Misalnya, tentukan instance-01 instance-02 instance-03.

  • ZONE: zona tempat instance komputasi berada.

Secara opsional, Anda dapat menyertakan salah satu atau kedua flag berikut:

  • Untuk memaksa penghapusan disk yang terpasang ke satu atau beberapa instance komputasi, sertakan flag --delete-disks:

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

    Ganti DELETE_DISK_TYPE dengan jenis penyimpanan yang ingin Anda hapus. Tentukan salah satu nilai berikut:

    • Untuk menghapus penyimpanan persisten booting dan non-booting: all

    • Untuk hanya menghapus penyimpanan persisten booting: boot

    • Untuk menghapus hanya penyimpanan persisten non-boot: data

  • Untuk melewati atau mengakhiri penghentian normal yang sedang berlangsung, sertakan 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 = 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.")

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

Untuk menghapus instance komputasi, buat permintaan DELETE ke metode instances delete:

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

Ganti kode berikut:

  • PROJECT_ID: ID project tempat instance komputasi berada.

  • ZONE: zona tempat instance komputasi berada.

  • INSTANCE_NAME: nama instance komputasi.

Jika Anda ingin melewati atau mengakhiri penghentian normal yang sedang berlangsung, sertakan parameter kueri noGracefulShutdown yang ditetapkan ke true di URL permintaan:

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

Menghapus instance komputasi dan mempertahankan disk

Secara default, menghapus instance komputasi akan menghapus instance komputasi dan resource yang terpasang. Namun, saat menghapus instance komputasi menggunakan gcloud CLI, Anda dapat menentukan untuk mempertahankan disk yang terpasang, terlepas dari setelan hapus otomatisnya.

Untuk menghapus satu atau beberapa instance komputasi di zona yang sama sambil mempertahankan disk yang terpasang, gunakan perintah gcloud compute instances delete dengan flag --keep-disks:

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

Ganti kode berikut:

  • INSTANCE_NAMES: daftar nama instance komputasi yang ingin Anda hapus, dipisahkan dengan spasi. Misalnya, tentukan instance-01 instance-02 instance-03.

  • KEEP_DISK_TYPE: jenis disk yang ingin Anda pertahankan. Tentukan salah satu nilai berikut:

    • Untuk mempertahankan penyimpanan persisten booting dan non-booting yang terpasang: all

    • Untuk hanya mempertahankan penyimpanan persisten booting yang terpasang: boot

    • Untuk hanya mempertahankan penyimpanan persisten non-boot yang terpasang: data

  • ZONE: zona tempat instance komputasi berada.

Jika Anda telah mengaktifkan penghentian normal di satu atau beberapa instance komputasi, Anda dapat menghemat biaya dengan menghapus instance komputasi tanpa menghentikannya secara normal, atau dengan mengakhiri penghentian normal yang sedang berlangsung secara manual. Untuk melakukannya, sertakan flag --no-graceful-shutdown dalam perintah:

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

Langkah berikutnya