Descontinue uma imagem personalizada


O Compute Engine permite-lhe descontinuar uma imagem personalizada que lhe pertence definindo o estado de descontinuação na imagem. Cada estado de descontinuação provoca uma resposta diferente do servidor, o que ajuda a afastar os utilizadores das imagens não suportadas de uma forma gerível. Use a Google Cloud consola, a CLI Google Cloud ou o método da API Compute Engine para descontinuar uma imagem.

Estados de descontinuação

São suportados os seguintes estados de descontinuação:

  • ACTIVE: a imagem está ativa e pode ser usada normalmente. As famílias de imagens apontam para a imagem mais recente e ativa numa família.
  • DEPRECATED: a imagem está marcada como descontinuada, mas ainda pode ser usada para criar uma VM. São permitidos novos links para esta imagem. As famílias de imagens já não apontam para esta imagem, mesmo que seja a imagem mais recente da família.

    Se criar uma VM com uma imagem descontinuada através da Google Cloud CLI, o pedido é bem-sucedido com um aviso.

  • OBSOLETE: a imagem está marcada como obsoleta e já não está disponível para utilização. É devolvida uma mensagem de erro se tentar usar esta imagem num pedido. Os links existentes para esta imagem continuam a ser permitidos.

  • DELETED: esta imagem é eliminada. É devolvida uma mensagem de erro se tentar usar uma imagem eliminada.

Pode reverter uma descontinuação (tornar uma imagem novamente ativa) alterando o estado de descontinuação para ACTIVE.

Antes de começar

  • Leia o documento Imagens.
  • Se ainda não o tiver feito, configure a autenticação. A autenticação valida a sua identidade para aceder a Google Cloud serviços e APIs. Para executar código ou exemplos a partir de um ambiente de desenvolvimento local, pode autenticar-se no Compute Engine selecionando uma das seguintes opções:

    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. Instale a CLI Google Cloud. Após a instalação, inicialize a CLI gcloud executando o seguinte comando:

      gcloud init

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

    2. Set a default region and zone.

    REST

    Para usar os exemplos da API REST nesta página num ambiente de desenvolvimento local, usa as credenciais que fornece à CLI gcloud.

      Instale a CLI Google Cloud. Após a instalação, inicialize a CLI gcloud executando o seguinte comando:

      gcloud init

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

    Para mais informações, consulte o artigo Autenticar para usar REST na Google Cloud documentação de autenticação.

Descontinue uma imagem personalizada

Consola

  1. Na Google Cloud consola, aceda à página Imagens.

    Aceder a Imagens

  2. Para a imagem que quer descontinuar, clique em Ações.

  3. Selecione Descontinuar.

  4. Para o estado, selecione Obsoleto ou Descontinuado. Para mais informações sobre os estados, consulte o artigo Estados de descontinuação.

  5. Opcional: especifique uma imagem de substituição.

  6. Clique em Descontinuar imagem.

gcloud

Use o comando gcloud compute images deprecate para definir o estado de descontinuação de uma imagem.

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

Substitua o seguinte:

  • IMAGE_NAME: o nome da imagem a descontinuar
  • STATE: o estado de descontinuação
  • REPLACEMENT: a imagem para substituir a imagem obsoleta

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

Faça um pedido POST ao método images().deprecate. Especifique o nome da imagem que quer descontinuar.

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

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

Substitua o seguinte:

  • PROJECT_ID: o projeto ao qual a imagem pertence.
  • RESOURCE_ID: o nome da imagem que está a descontinuar.
  • STATE: o estado de descontinuação deste recurso.
  • REPLACEMENT: a imagem para substituir a imagem obsoleta.