Compila entornos de ejecución personalizados

Un entorno de ejecución personalizado te permite usar una implementación alternativa de cualquier lenguaje de entorno flexible compatible o personalizar un lenguaje proporcionado por Google. También te permite escribir código en cualquier otro lenguaje que pueda controlar solicitudes HTTP entrantes (ejemplo). Con un entorno de ejecución personalizado, el entorno flexible te proporciona y administra la infraestructura de escalamiento, supervisión y balanceo de cargas para que puedas enfocarte en compilar tu aplicación.

Para crear un entorno de ejecución personalizado, debes hacer lo siguiente:

Proporciona un archivo app.yaml

Tu archivo de configuración app.yaml debe contener, al menos, la siguiente configuración:

runtime: custom
env: flex

Para obtener más información sobre qué más puedes configurar para tu app, consulta Configura tu app con app.yaml.

Crea un Dockerfile

La documentación completa sobre cómo crear Dockerfiles está disponible en el sitio web de Docker. Si usas un entorno de ejecución personalizado, debes proporcionar un Dockerfile, ya sea que uses tu propia imagen base o una de las de Google.

Especifica una imagen base

El primer comando de un Dockerfile suele ser un comando FROM que especifica una imagen base. Se usa una imagen base para crear el contenedor y compilar la aplicación. Puedes crear tu propia imagen base o seleccionar una de registros de contenedores como DockerHub.

Ubica el Dockerfile

En general, el Dockerfile siempre se llama Dockerfile y se ubica en el mismo directorio que el archivo app.yaml correspondiente. Sin embargo, en algunos casos, el entorno de herramientas puede tener requisitos diferentes. Por ejemplo, las herramientas de Java basadas en el SDK de Cloud, como los complementos de Maven, Gradle, IntelliJ y Eclipse, requieren que el archivo Dockerfile esté en src/main/docker/Dockerfile y el archivo app.yaml esté en src/main/appengine/app.yaml. Consulta la documentación de tu entorno de herramientas para obtener más información.

Estructura del código

En esta sección, se describe el comportamiento que debe implementar tu código, ya sea que uses una imagen base tuya o una proporcionada por Google.

Escucha en el puerto 8080

El frontend de App Engine enrutará las solicitudes entrantes al módulo apropiado en el puerto 8080. Debes asegurarte de que el código de tu aplicación escuche en 8080.

Controla eventos de ciclo de vida

El entorno flexible envía de forma periódica a la aplicación ciertos eventos del ciclo de vida.

Cierre de la aplicación

Cuando una instancia se debe cerrar, las nuevas solicitudes entrantes se enrutan a otras instancias (si las hubiera) y se concede tiempo a las solicitudes que se están procesando para completarse. Cuando se cierra una instancia, el entorno flexible envía normalmente una señal STOP (SIGTERM) al contenedor de la app. No es necesario que tu app responda a este evento, pero puede usarlo para realizar las acciones de limpieza necesarias antes de que el contenedor se cierre. En condiciones normales, el sistema espera hasta 30 segundos para que la app se detenga y, luego, envía una señal KILL (SIGKILL), que cierra la instancia de inmediato.

En casos excepcionales, las interrupciones pueden evitar que App Engine proporcione 30 segundos de tiempo de cierre, lo que significa que las señales STOP y KILL podrían no enviarse antes de que finalice una instancia. Para manejar esta posibilidad, debes realizar un punto de control de forma periódica del estado de tu instancia y usarla de manera principal como caché en memoria en lugar de un almacén de datos confiable.

Solicitudes de verificación de estado

Puedes usar solicitudes de verificación de estado periódicas para confirmar que una instancia de VM se implementó de manera correcta y para comprobar que una instancia en ejecución mantenga un buen estado.

Compila y, luego, implementa tu entorno de ejecución personalizado

Después de configurar el archivo app.yaml y DOCKER, puedes compilar y, luego, implementar esa imagen de contenedor en App Engine.

Como alternativa, puedes implementar imágenes de contenedor compiladas previamente de tus entornos de ejecución personalizados que se almacenan en Artifact Registry. Por ejemplo, puedes usar Cloud Build para compilar tus imágenes por separado y, luego, almacenarlas en Artifact Registry. Para obtener más información, consulta Envía y extrae imágenes.

Integra tu aplicación con Google Cloud

Las aplicaciones que se ejecutan en entornos de ejecución personalizados pueden usar las bibliotecas cliente de Google Cloud para acceder a los servicios de Google Cloud. Las aplicaciones en entornos de ejecución personalizados también pueden usar cualquier servicio de terceros a través de las APIs estándar.

Autentica con servicios de Google Cloud

Las credenciales predeterminadas de la aplicación proporcionan la forma más sencilla de autenticarse y llamar a las API de Google.

Si tu aplicación usa Cloud Build para compilar imágenes de Docker, la red cloudbuild aloja las credenciales predeterminadas de la aplicación, lo que permite que los servicios de Google Cloud asociados encuentren tus credenciales de forma automática.

Para obtener más información sobre la autenticación, consulta Autenticación en Google.

Logging

Cuando se envía una solicitud a tu aplicación que se ejecuta en App Engine, los detalles de la solicitud y la respuesta se registran automáticamente. Se pueden ver en el Explorador de registros de la consola de Google Cloud.

Cuando tu aplicación controla una solicitud, también puede escribir sus propios mensajes de registro en stdout y stderr. Estos archivos se recopilan de forma automática y se pueden visualizar en el Explorador de registros. Solo se conservan las entradas más recientes a stdout y stderr para limitar su tamaño.

También puedes escribir registros personalizados en /var/log/app_engine/custom_logs con un archivo que termine en .log o .json.

Si incluyes agentes de terceros en el contenedor de tu aplicación, asegúrate de configurar los agentes para que accedan a stdout y stderr, o a un registro personalizado. Esto garantiza que los errores que producen estos agentes sean visibles en Cloud Logging.

Un agente de Cloud Logging recopila la solicitud y los registros de la aplicación y los conserva durante un máximo de 90 días, hasta un máximo de 1 GB. Si deseas almacenar tus registros durante un período más largo o almacenar un tamaño superior a 1 GB, puedes exportar tus registros a Cloud Storage. También puedes exportar tus registros a BigQuery y Pub/Sub para su procesamiento posterior.

Otros registros también están disponibles para que los uses. Los siguientes son algunos de los registros que se configuran de forma predeterminada:

Nombre del registro Tipo de carga útil Objetivo
crash.log texto Información que se registra cuando falla la configuración. Si tu aplicación no se ejecuta, revisa este registro.
monitoring.* texto Información del contenedor de Docker que publica datos en Cloud Monitoring.
shutdown.log texto Información que se registró durante el cierre.
stdout texto Resultado estándar de tu app.
stderr texto Error estándar de tu contenedor.
syslog texto La VM syslog, fuera del contenedor de Docker.