Migra del servicio de App Engine Images a Cloud Run

ID de región

REGION_ID es un código abreviado que Google asigna en función de la región que eliges cuando creas la app. El código no corresponde a un país ni a una provincia, aunque algunos ID de región puedan parecer similares a los códigos de país y provincia que se suelen usar. En el caso de las apps creadas después de febrero de 2020, REGION_ID.r se incluye en las URL de App Engine. En el caso de las apps existentes creadas antes de esta fecha, el ID de región es opcional en la URL.

Obtén más información acerca de los ID de región.

Para modernizar el procesamiento de imágenes en tus aplicaciones existentes de App Engine, puedes implementar un servicio de transformación de imágenes alojado en contenedores en Cloud Run y enrutar las llamadas al servicio de imágenes de App Engine.

Esta migración no requiere que vuelvas a escribir el código de procesamiento de imágenes ni que alojes tu aplicación de App Engine en Cloud Run. En cambio, cuando configuras tu aplicación, el SDK de servicios de App Engine intercepta las llamadas al servicio de imágenes de App Engine y las enruta al servicio de Cloud Run. El servicio procesa las imágenes con un motor Pillow de código abierto a través de gRPC y muestra los resultados en tu aplicación de App Engine. Esta configuración reemplaza el backend heredado del servicio de imágenes de App Engine por una solución moderna y nativa de la nube.

Limitaciones

  • Cuando usas el servicio de procesamiento de imágenes personalizado, no puedes generar URLs de entrega. App Engine arroja una excepción de tiempo de ejecución cuando invocas el método getServingUrl(). Esta restricción evita la dependencia del backend heredado para almacenar y entregar imágenes.

    Para entregar imágenes, te recomendamos que las entregues directamente desde una URL de Cloud Storage o que uses un bucket de Cloud Storage respaldado por Cloud CDN, según los requisitos de tu aplicación.

    Las URLs existentes que creaste con llamadas heredadas al método getServingUrl() siguen entregando imágenes.

  • Cuando actualizas la versión del SDK de servicios de App Engine, App Engine no enruta automáticamente las llamadas de App Engine al servicio de Cloud Run. Tu aplicación solo aplica el comportamiento nuevo después de configurar las variables de entorno de migración APPENGINE_USE_CUSTOM_IMAGES_GRPC_SERVICE y APPENGINE_IMAGES_SERVICE_ENDPOINT.

Antes de comenzar

  1. Asegúrate de tener acceso al código fuente de App Engine.

  2. Habilita la API de Cloud Run Admin y la API de Artifact Registry:

    Habilita las API

Roles obligatorios

Puedes elegir crear una cuenta de servicio nueva o usar la misma cuenta de servicio administrada por el usuario en Cloud Run que usas en App Engine. Tú o tu administrador deben otorgar los siguientes roles de IAM a la cuenta del implementador y a la cuenta de servicio de Cloud Build.

Haz clic para ver los roles necesarios para la cuenta del implementador

Para obtener los permisos que necesitas para compilar e implementar desde la fuente, pídele a tu administrador que te otorgue los siguientes roles de IAM roles:

Haz clic para ver los roles necesarios para la cuenta de servicio de Cloud Build

Cloud Build uses automáticamente la cuenta de servicio predeterminada de Compute Engine como la cuenta de servicio predeterminada de Cloud Build para compilar tu código fuente y el recurso de Cloud Run, a menos que anules este comportamiento. Para que Cloud Build compile tus fuentes, pídele a tu administrador que otorgue el rol de compilador de Cloud Run (roles/run.builder) a la cuenta de servicio predeterminada de Compute Engine en tu proyecto:

  gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.builder
  

Reemplaza PROJECT_NUMBER por el número de tu Google Cloud proyecto y PROJECT_ID por el ID de tu Google Cloud proyecto. Para obtener instrucciones detalladas sobre cómo encontrar el ID y el número de tu proyecto, consulta Crea y administra proyectos.

El otorgamiento del rol de compilador de Cloud Run a la cuenta de servicio predeterminada de Compute Engine tarda un par de minutos en propagarse.

Para obtener una lista de los roles y los permisos de IAM asociados con Cloud Run, consulta los roles de IAM de Cloud Run y los permisos de IAM de Cloud Run. Si tu servicio de Cloud Run interactúa con Google Cloud las APIs, como las bibliotecas cliente de Cloud, consulta la guía de configuración de identidades del servicio. Para obtener más información sobre cómo otorgar roles, consulta permisos de implementación y administra el acceso.

Proceso de migración

Esta migración incluye los siguientes pasos:

  1. Implementa el servicio de transformación de imágenes en Cloud Run para obtener la URL del servicio.
  2. Configura tus archivos fuente de App Engine con la URL del servicio de Cloud Run y las marcas de enrutamiento. Luego, implementa o vuelve a implementar tu aplicación de App Engine.
  3. Prueba tu aplicación para verificar la funcionalidad de procesamiento de imágenes.

Implementa el servicio de transformación de imágenes en Cloud Run

Para implementar el servicio de transformación de imágenes y configurar su acceso a Cloud Storage, sigue estos pasos:

  1. Implementa el contenedor de servicio de transformación de imágenes compilado previamente en el servicio de Cloud Run. Asegúrate de realizar la implementación con la autenticación aplicada (--no-allow-unauthenticated). El SDK de servicios de App Engine controla la autenticación cuando realiza llamadas a este servicio:

    gcloud run deploy image-processing-service \
        --image=us-central1-docker.pkg.dev/gae-bundled-services-images/image-processing-service-staging/image-processing-service:public-image-d476f7ef9d1b \
        --no-allow-unauthenticated \
        --region=REGION
    

    Reemplaza REGION por la región en la que implementas el servicio de Cloud Run. Te recomendamos que implementes el servicio en la misma región que tu servicio de App Engine.

    Anota la URL del servicio de tu servicio de Cloud Run implementado, por ejemplo, https://image-processing-service-xyz-uc.a.run.app.

  2. Otorga el rol de Invocador de Cloud Run (roles/run.invoker) a la cuenta de servicio predeterminada de App Engine. Esto permite que tu aplicación de App Engine autorice y enrute llamadas al servicio privado de Cloud Run:

    gcloud run services add-iam-policy-binding image-processing-service \
        --member="serviceAccount:PROJECT_ID@appspot.gserviceaccount.com" \
        --role="roles/run.invoker" \
        --region=REGION
    
  3. Otorga el rol de visualizador de objetos de Cloud Storage (roles/storage.objectViewer) a la cuenta de servicio predeterminada de Compute Engine. Esto permite que el servicio de transformación de imágenes lea las imágenes almacenadas en Cloud Storage:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --role="roles/storage.objectViewer"
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID del proyecto en el que implementas el servicio de Cloud Run.
    • PROJECT_NUMBER: Es el número del proyecto en el que implementas el servicio de Cloud Run.

Configura tus archivos fuente

Para configurar tu aplicación de Java para que use el servicio de transformación de imágenes en Cloud Run, sigue estos pasos:

  1. Actualiza el archivo pom.xml para que incluya las siguientes dependencias:

    • Agrega o actualiza la dependencia appengine-api-1.0-sdk:

      <dependency>
        <groupId>com.google.appengine</groupId>
        <artifactId>appengine-api-1.0-sdk</artifactId>
        <version>5.0.5-beta.1</version>
      </dependency>
      
    • Agrega la dependencia google-auth-library-oauth2-http para la comunicación segura con Cloud Run:

      <dependency>
        <groupId>com.google.auth</groupId>
        <artifactId>google-auth-library-oauth2-http</artifactId>
        <version>1.20.0</version>
      </dependency>
      
  2. Actualiza el archivo appengine-web.xml para configurar las variables de entorno necesarias:

    <?xml version="1.0" encoding="utf-8"?>
    <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
        <runtime>RUNTIME</runtime> <!-- a supported Java runtime version -->
        <threadsafe>true</threadsafe>
    
        <!-- List the Images service -->
        <app-engine-bundled-services>
            <api>images</api>
        </app-engine-bundled-services>
    
        <env-variables>
            <!-- Enable the custom gRPC Images service -->
            <env-var name="APPENGINE_USE_CUSTOM_IMAGES_GRPC_SERVICE" value="true" />
    
            <!-- The URL of the Cloud Run service you deployed -->
            <env-var name="APPENGINE_IMAGES_SERVICE_ENDPOINT" value="RUN_SERVICE_URL" />
        </env-variables>
    </appengine-web-app>
    

    Reemplaza lo siguiente:

    • RUNTIME: Es una versión compatible del entorno de ejecución de Java.
    • RUN_SERVICE_URL: Es la URL de tu servicio de Cloud Run implementado.
  3. Implementa tu aplicación en App Engine:

    mvn clean package appengine:deploy clean
    
  4. Inicia el navegador y accede a tu servicio web ejecutando el siguiente comando:

    gcloud app browse
    

Prueba tu aplicación

Para verificar que tu aplicación use correctamente el servicio de transformación de imágenes de Cloud Run, haz lo siguiente:

  1. Activa la funcionalidad de procesamiento de imágenes en tu aplicación de App Engine implementada.
  2. Consulta el Visor de registros de tu aplicación de App Engine. Asegúrate de que no haya errores relacionados con las llamadas a com.google.appengine.api.images.
  3. Verifica los registros de tu Cloud Run image-processing-service para comprobar que Cloud Run recibió y procesó las solicitudes.

¿Qué sigue?