커스텀 이미지 지원 중단


Compute Engine을 사용하면 이미지를 지원 중단 상태로 설정하여 소유하고 있는 커스텀 이미지의 지원을 중단할 수 있습니다. 각 지원 중단 상태에 따라 서버에서 다른 응답이 반환되므로 지원되지 않는 이미지로부터의 사용자 전환을 점차적으로 유도할 수 있습니다. Google Cloud Console, Google Cloud CLI 또는 Compute Engine API 메서드를 사용하여 이미지의 지원을 중단합니다.

지원 중단 상태

다음과 같은 지원 중단 상태가 지원됩니다.

  • ACTIVE: 이미지가 활성 상태이며 정상적으로 사용할 수 있습니다. 이미지 계열은 계열의 가장 최근의 활성 이미지를 가리킵니다.
  • DEPRECATED: 이미지는 지원 중단으로 표시되지만 아직 VM을 생성하는 데 사용될 수 있습니다. 이 이미지에 대한 새 링크가 허용됩니다. 이미지 계열에 있는 최신 이미지인 경우에도 이미지 계열에서 이 이미지를 더 이상 가리키지 않습니다.

    Google Cloud CLI를 사용하여 지원 중단된 이미지로 VM을 만들면 요청이 경고와 함께 성공합니다.

  • OBSOLETE: 이미지가 사용되지 않음으로 표시되고 더 이상 사용할 수 없습니다. 요청에 이 이미지를 사용하려고 하면 오류 메시지가 반환됩니다. 이 이미지의 기존 링크는 계속 허용됩니다.

  • DELETED: 이 이미지는 삭제되었습니다. 삭제된 이미지를 사용하려고 하면 오류 메시지가 반환됩니다.

지원 중단 상태를 ACTIVE로 변경하여 지원 중단을 되돌릴 수 있습니다(이미지를 다시 활성화).

시작하기 전에

  • 이미지 문서를 읽습니다.
  • 아직 인증을 설정하지 않았다면 설정합니다. 인증은 Google Cloud 서비스 및 API에 액세스하기 위해 ID를 확인하는 프로세스입니다. 로컬 개발 환경에서 코드 또는 샘플을 실행하려면 다음 옵션 중 하나를 선택하여 Compute Engine에 인증하면 됩니다.

    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. REST

      로컬 개발 환경에서 이 페이지의 REST API 샘플을 사용하려면 gcloud CLI에 제공한 사용자 인증 정보를 사용합니다.

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

        gcloud init

      자세한 내용은 Google Cloud 인증 문서의 REST 사용을 위한 인증을 참고하세요.

커스텀 이미지 지원 중단

Console

  1. Google Cloud 콘솔에서 이미지 페이지로 이동합니다.

    이미지로 이동

  2. 지원 중단할 이미지에서 작업을 클릭합니다.

  3. 지원 중단을 선택합니다.

  4. 상태에서 지원 중단됨 또는 사용되지 않음을 선택합니다. 상태에 대한 자세한 내용은 지원 중단 상태를 참조하세요.

  5. 선택사항: 대체 이미지를 지정합니다.

  6. 이미지 지원 중단을 클릭합니다.

gcloud

gcloud compute images deprecate 명령어를 사용하여 이미지의 지원 중단 상태를 설정합니다.

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

다음을 바꿉니다.

  • IMAGE_NAME: 지원 중단할 이미지의 이름입니다.
  • STATE: 지원 중단 상태입니다.
  • REPLACEMENT: 지원 중단된 이미지를 대체할 이미지입니다.

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
}

자바


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

images().deprecate 메서드에 대해 POST 요청을 실행합니다. 지원 중단할 이미지의 이름을 지정합니다.

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

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

다음을 바꿉니다.

  • PROJECT_ID: 이미지가 속한 프로젝트입니다.
  • RESOURCE_ID: 지원 중단할 이미지의 이름입니다.
  • STATE: 이 리소스의 지원 중단 상태입니다.
  • REPLACEMENT는 지원 중단된 이미지를 대체할 이미지입니다.