Menghapus VM


Dokumen ini menjelaskan cara menghapus instance virtual machine (VM).

Jika Anda tidak lagi memerlukan VM, hapus VM tersebut untuk berhenti dikenai biaya VM dan resource yang terpasang. Jika Anda ingin mempertahankan resource yang terlampir, lakukan satu atau beberapa hal berikut sebelum menghapus VM:

Sebelum memulai

  • Jika Anda belum melakukannya, siapkan autentikasi. Autentikasi adalah proses verifikasi identitas Anda untuk mengakses layanan dan API Google Cloud. Untuk menjalankan kode atau contoh dari lingkungan pengembangan lokal, Anda dapat mengautentikasi ke Compute Engine dengan memilih salah satu opsi berikut:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. C#

      Untuk menggunakan contoh .NET di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. Buat kredensial autentikasi lokal untuk Akun Google Anda:

        gcloud auth application-default login

      Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

      Go

      Untuk menggunakan contoh Go di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. Buat kredensial autentikasi lokal untuk Akun Google Anda:

        gcloud auth application-default login

      Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

      Java

      Untuk menggunakan contoh Java di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. Buat kredensial autentikasi lokal untuk Akun Google Anda:

        gcloud auth application-default login

      Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

      Node.js

      Untuk menggunakan contoh Node.js di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. Buat kredensial autentikasi lokal untuk Akun Google Anda:

        gcloud auth application-default login

      Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

      PHP

      Untuk menggunakan contoh PHP di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. Buat kredensial autentikasi lokal untuk Akun Google Anda:

        gcloud auth application-default login

      Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

      Python

      Untuk menggunakan contoh Python di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. Buat kredensial autentikasi lokal untuk Akun Google Anda:

        gcloud auth application-default login

      Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

      Ruby

      Untuk menggunakan contoh Ruby di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. Buat kredensial autentikasi lokal untuk Akun Google Anda:

        gcloud auth application-default login

      Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

      REST

      Untuk menggunakan contoh REST API di halaman ini dalam lingkungan pengembangan lokal, gunakan kredensial yang Anda berikan ke gcloud CLI.

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      Untuk informasi selengkapnya, lihat Melakukan autentikasi untuk menggunakan REST dalam dokumentasi autentikasi Google Cloud.

Peran yang diperlukan

Untuk mendapatkan izin yang diperlukan untuk menghapus VM, 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 VM. Untuk melihat izin yang benar-benar diperlukan, luaskan bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk menghapus VM:

  • compute.instances.delete di VM
  • Untuk memaksa penghapusan Persistent Disk yang terpasang: compute.disks.delete di disk

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

Implikasi penagihan

Setelah Anda menghapus VM, Google Cloud tidak lagi menagih Anda untuk VM dan resource yang terpasang, kecuali jika salah satu situasi berikut berlaku:

  • Jika menghapus VM yang dihosting di node tenant tunggal, Anda akan terus mengeluarkan biaya untuk node tenant tunggal itu sendiri, bukan VM individual yang dihosting di node tersebut.

  • Jika memiliki diskon abonemen, Anda akan terus membayar resource yang sudah disepakati, terlepas dari apakah resource tersebut Anda gunakan atau tidak.

  • Jika Anda mempertahankan semua resource yang telah terpasang ke VM, Anda akan terus dikenai biaya untuk resource tersebut sampai Anda menghapusnya. Misalnya, jika Anda menghapus VM, tetapi mempertahankan volume Persistent Disk yang terpasang padanya, Anda akan terus dikenai biaya untuk disk tersebut.

Untuk mengetahui informasi selengkapnya, lihat Harga instance VM.

Proses untuk menghapus VM

Saat menghapus VM, Compute Engine akan melakukan hal berikut:

  1. Compute Engine mengirimkan sinyal penonaktifan ACPI ke VM, lalu menetapkan status VM ke STOPPING dalam beberapa detik.

  2. Compute Engine memulai penonaktifan bersih sistem operasi (OS) dalam VM. Periode penonaktifan berlangsung sebagai berikut berdasarkan jenis VM:

    • Preemptible VM: Preemptible VM memiliki periode penonaktifan selama 30 detik, yang sama panjangnya dengan proses preemption.

    • Jenis VM lainnya: Jenis VM lainnya memiliki periode penonaktifan setidaknya 90 detik.

  3. Di akhir periode penonaktifan, Compute Engine akan menghapus VM dan resource yang terpasang secara permanen. Jika Anda mengonfigurasi Persistent Disk untuk dipertahankan saat menghapus VM tempat disk tersebut terpasang, Compute Engine akan mempertahankan disk setelah penghapusan VM.

Menghapus VM

Untuk menghapus satu atau beberapa VM, lihat salah satu bagian berikut dari dokumen ini:

Menghapus VM dan semua resource yang terpasang

Saat Anda menghapus VM, Compute Engine akan menghapus VM dan semua resource yang terpasang secara default. Namun, jika Anda mengonfigurasi Persistent Disk untuk dipertahankan setelah penghapusan VM, Anda dapat mengganti setelan ini dan menghapus VM serta disk menggunakan gcloud CLI.

Untuk menghapus beberapa VM secara bersamaan, gunakan konsol Google Cloud atau, untuk VM yang berada di zona yang sama, gcloud CLI. Jika tidak, untuk menghapus satu VM, gunakan metode apa pun yang dijelaskan di bagian ini.

Konsol

Untuk menghapus satu atau beberapa VM, lakukan langkah-langkah berikut:

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

    Buka instance VM

  2. Pilih VM yang ingin Anda hapus.

  3. Klik Hapus, lalu klik Hapus lagi untuk mengonfirmasi.

gcloud

Untuk menghapus satu atau beberapa VM, gunakan perintah gcloud compute instances delete.

gcloud compute instances delete VM_NAMES \
    --zone=ZONE

Ganti kode berikut:

  • VM_NAMES: daftar nama VM yang dipisahkan spasi kosong yang berada di zona yang sama; misalnya, vm-01 vm-02 vm-03.

  • ZONE: zona VM.

Secara opsional, untuk memaksa penghapusan volume Persistent Disk yang terpasang ke satu atau beberapa VM, sertakan tanda --delete-disks.

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

Ganti DELETE_DISK_TYPE dengan jenis volume Persistent Disk yang terpasang dan akan dihapus. Tentukan salah satu nilai berikut:

  • Untuk menghapus semua jenis disk: all.

  • Untuk hanya menghapus disk booting: boot.

  • Untuk menghapus hanya disk non-boot: data.

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

    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

Untuk menghapus VM, buat permintaan DELETE ke metode instances delete.

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

Ganti kode berikut:

  • PROJECT_ID: ID project tempat VM berada.

  • ZONE: zona VM.

  • VM_NAME: nama VM.

Menghapus VM dan mempertahankan volume Persistent Disk

Secara default, menghapus VM akan menghapus VM dan resource yang terpasang. Namun, saat menghapus VM menggunakan gcloud CLI, Anda dapat menentukan untuk mempertahankan boot disk, disk non-boot, atau keduanya yang terpasang, terlepas dari setelan hapus otomatis disk.

Untuk menghapus satu atau beberapa VM yang berada di zona yang sama sekaligus mempertahankan volume Persistent Disk yang terpasang, gunakan perintah gcloud compute instances delete dengan flag --keep-disks.

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

Ganti kode berikut:

  • VM_NAMES: daftar nama VM yang dipisahkan spasi kosong yang berada di zona yang sama; misalnya, vm-01 vm-02 vm-03.

  • KEEP_DISK_TYPE: jenis volume Persistent Disk yang terpasang untuk dipertahankan. Tentukan salah satu nilai berikut:

    • Untuk mempertahankan semua jenis disk: all.

    • Untuk hanya mempertahankan disk booting: boot.

    • Untuk hanya mempertahankan disk non-boot: data.

  • ZONE: zona tempat VM berada.

Langkah selanjutnya