Menghentikan penggunaan image kustom

Compute Engine memungkinkan Anda menghentikan penggunaan image kustom milik Anda dengan menetapkan status penghentian penggunaan pada image. Setiap status penghentian penggunaan menyebabkan respons yang berbeda dari server, sehingga membantu Anda memindahkan pengguna dari image yang tidak didukung dengan cara yang mudah dikelola. Gunakankonsol, Google Cloud CLI, atau metode Compute Engine API untuk menghentikan penggunaan image. Google Cloud

Status penghentian penggunaan

Status penghentian penggunaan berikut didukung:

  • ACTIVE: image aktif dan dapat digunakan seperti biasa. Kelompok image mengarah ke image terbaru dan aktif dalam sebuah kelompok.
  • DEPRECATED: image ditandai tidak digunakan lagi, tetapi masih dapat digunakan untuk membuat VM. Link baru ke image ini diizinkan. Kelompok image tidak lagi mengarah ke image ini meskipun merupakan image terbaru dalam kelompok tersebut. Jika Anda membuat VM dengan image yang tidak digunakan lagi menggunakan Google Cloud CLI, permintaan akan berhasil dengan peringatan.

  • OBSOLETE: image ditandai tidak digunakan lagi dan tidak lagi tersedia untuk digunakan. Pesan error akan ditampilkan jika Anda mencoba menggunakan image ini dalam permintaan. Link yang ada ke image ini masih diizinkan.

  • DELETED: image ini dihapus. Pesan error akan ditampilkan jika Anda mencoba menggunakan image yang dihapus.

Sebelum memulai

  • Baca dokumen Image.
  • Siapkan autentikasi jika Anda belum melakukannya. Autentikasi memverifikasi identitas Anda untuk mengakses Google Cloud layanan dan API. Untuk menjalankan kode atau contoh dari lingkungan pengembangan lokal, Anda dapat melakukan autentikasi ke Compute Engine dengan memilih salah satu opsi berikut:

    Pilih tab untuk melihat bagaimana Anda berencana menggunakan contoh di halaman ini:

    Konsol

    Saat menggunakan Google Cloud konsol untuk mengakses Google Cloud layanan dan API, Anda tidak perlu menyiapkan autentikasi.

    gcloud

    1. Instal Google Cloud CLI. Setelah penginstalan, inisialisasi Google Cloud CLI dengan menjalankan perintah berikut:

      gcloud init

      Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu .

  • Tetapkan region dan zona default.
  • REST

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

      Instal Google Cloud CLI.

      Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu .

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

Menghentikan penggunaan image kustom

Konsol

  1. Di Google Cloud konsol, buka halaman Images.

    Buka Images

  2. Untuk image yang ingin Anda hentikan penggunaannya, klik Actions.

  3. Pilih Deprecate.

  4. Untuk status, pilih Deprecated atau Obsolete. Untuk mengetahui informasi selengkapnya tentang status, lihat Status penghentian penggunaan.

  5. Opsional: Tentukan image pengganti.

  6. Klik Deprecate Image.

gcloud

Gunakan gcloud compute images deprecate perintah untuk menetapkan status penghentian penggunaan image.

gcloud compute images deprecate IMAGE_NAME \
    --state STATE \
    --replacement REPLACEMENT

Ganti kode berikut:

  • IMAGE_NAME: nama image yang akan dihentikan penggunaannya
  • STATE: status penghentian penggunaan
  • REPLACEMENT: image yang akan menggantikan image yang tidak digunakan lagi

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
	"google.golang.org/protobuf/proto"
)

// Geg a disk image from the given project
func deprecateDiskImage(
	w io.Writer,
	projectID, imageName string,
) error {
	// projectID := "your_project_id"
	// imageName := "my_image"

	deprecationStatus := &computepb.DeprecationStatus{
		State: proto.String(computepb.DeprecationStatus_DEPRECATED.String()),
	}

	ctx := context.Background()
	imagesClient, err := compute.NewImagesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewImagesRESTClient: %w", err)
	}
	defer imagesClient.Close()

	source_req := &computepb.DeprecateImageRequest{
		Project:                   projectID,
		Image:                     imageName,
		DeprecationStatusResource: deprecationStatus,
	}

	op, err := imagesClient.Deprecate(ctx, source_req)
	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Disk image %s deprecated\n", imageName)

	return nil
}

Java


import com.google.cloud.compute.v1.DeprecateImageRequest;
import com.google.cloud.compute.v1.DeprecationStatus;
import com.google.cloud.compute.v1.Image;
import com.google.cloud.compute.v1.ImagesClient;
import java.io.IOException;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class SetImageDeprecationStatus {
  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "your-project-id";
    // Name of the image you want to update.
    String imageName = "your-image-name";
    // The status you want to set for the image. Available values are available in
    // `compute_v1.DeprecationStatus.State` enum. Learn more about image deprecation statuses:
    // https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images#deprecation-states
    DeprecationStatus.State status = DeprecationStatus.State.DEPRECATED;

    setDeprecationStatus(projectId, imageName, status);
  }

  // Modify the deprecation status of an image.
  public static Image setDeprecationStatus(String projectId, String imageName,
                                           DeprecationStatus.State status)
          throws IOException, ExecutionException, InterruptedException, 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.
    try (ImagesClient client = ImagesClient.create()) {
      DeprecationStatus deprecationStatusResource = DeprecationStatus.newBuilder()
              .setState(status.name())
              .build();
      DeprecateImageRequest request = DeprecateImageRequest.newBuilder()
              .setProject(projectId)
              .setImage(imageName)
              .setDeprecationStatusResource(deprecationStatusResource)
              .setRequestId(UUID.randomUUID().toString())
              .build();

      client.deprecateCallable().futureCall(request).get(60, TimeUnit.SECONDS);

      Image image = client.get(projectId, imageName);

      System.out.printf("Status '%s' has been updated successfully",
              image.getDeprecated().getState());

      return image;
    }
  }
}

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 set_deprecation_status(
    project_id: str, image_name: str, status: compute_v1.DeprecationStatus.State
) -> None:
    """
    Modify the deprecation status of an image.

    Note: Image objects by default don't have the `deprecated` attribute at all unless it's set.

    Args:
        project_id: project ID or project number of the Cloud project that hosts the image.
        image_name: name of the image you want to modify
        status: the status you want to set for the image. Available values are available in
            `compute_v1.DeprecationStatus.State` enum. Learn more about image deprecation statuses:
            https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images#deprecation-states
    """
    image_client = compute_v1.ImagesClient()
    deprecation_status = compute_v1.DeprecationStatus()
    deprecation_status.state = status.name
    operation = image_client.deprecate(
        project=project_id,
        image=image_name,
        deprecation_status_resource=deprecation_status,
    )

    wait_for_extended_operation(operation, "changing deprecation state of an image")

REST

Buat permintaan POST ke metode images().deprecate. Tentukan nama image yang ingin Anda hentikan penggunaannya.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/RESOURCE_ID/deprecate

{
  "state": "STATE",
  "replacement": "REPLACEMENT"
}

Ganti kode berikut:

  • PROJECT_ID: project tempat image berada.
  • RESOURCE_ID: nama image yang Anda hentikan penggunaannya.
  • STATE: status penghentian penggunaan resource ini.
  • REPLACEMENT: image yang akan menggantikan image yang tidak digunakan lagi.