Tutorial: Implementación de trabajos controlados por eventos con Azure Container Apps
Los trabajos de Azure Container Apps permiten ejecutar tareas en contenedor que se ejecutan durante una duración finita y salen. Las ejecuciones de trabajos se pueden desencadenar manualmente, según una programación o en función de los eventos. Los trabajos son más adecuados para tareas como el procesamiento de datos, el aprendizaje automático, la limpieza de recursos o cualquier escenario que requiera recursos de proceso efímeros sin servidor.
En este tutorial, aprenderá a trabajar con trabajos controlados por eventos.
- Crear un entorno de Container Apps para implementar las aplicaciones de contenedor
- Crear una cola de Azure Storage para enviar mensajes a la aplicación de contenedor
- Compilación de imágenes de contenedor que ejecutan trabajos
- Implementación del trabajo en el entorno de Container Apps
- Comprobar que la aplicación de contenedor procesa los mensajes de cola
El trabajo que se crea inicia una ejecución para cada mensaje que se envía a una cola de Azure Storage. Cada ejecución de trabajos ejecuta un contenedor que realiza los siguientes pasos:
- Obtiene un mensaje de la cola.
- Registra el mensaje en los registros de ejecución del trabajo.
- Elimina el mensaje de la cola.
- Sale.
Importante
El escalador supervisa la longitud de la cola para determinar cuántos trabajos se van a iniciar. Para obtener un escalado preciso, no elimine un mensaje de la cola hasta que la ejecución del trabajo haya terminado de procesarlo.
El código fuente del trabajo que se ejecuta en este tutorial está disponible en un repositorio de GitHub de ejemplos de Azure.
Requisitos previos
- Una cuenta de Azure con una suscripción activa.
- Si no tiene ninguna, puede crear una gratis.
- Instale la CLI de Azure.
- Consulte las restricciones de trabajos para obtener una lista de limitaciones.
Configuración
Para iniciar sesión en Azure desde la CLI, ejecute el siguiente comando y siga las indicaciones para completar el proceso de autenticación.
az login
Asegúrese de que ejecuta la versión más reciente de la CLI con el comando de actualización.
az upgrade
Instale la versión más reciente de la extensión de la CLI de Azure Container Apps.
az extension add --name containerapp --upgrade
Registre los espacios de nombres
Microsoft.App
yMicrosoft.OperationalInsights
si aún no los ha registrado en su suscripción de Azure.az provider register --namespace Microsoft.App az provider register --namespace Microsoft.OperationalInsights
Ahora que la configuración de la CLI de Azure está completa, puede definir las variables de entorno que se usan en este artículo.
RESOURCE_GROUP="jobs-quickstart" LOCATION="northcentralus" ENVIRONMENT="env-jobs-quickstart" JOB_NAME="my-job"
Creación de un entorno de Container Apps
El entorno de Azure Container Apps actúa como un límite seguro en torno a las aplicaciones y trabajos de contenedor para que puedan compartir la misma red y comunicarse entre sí.
Cree un grupo de recursos con el siguiente comando.
az group create \ --name "$RESOURCE_GROUP" \ --location "$LOCATION"
Cree el entorno de Container Apps mediante el siguiente comando.
az containerapp env create \ --name "$ENVIRONMENT" \ --resource-group "$RESOURCE_GROUP" \ --location "$LOCATION"
Configuración de una cola de almacenamiento
El trabajo usa una cola de Azure Storage para recibir mensajes. En esta sección se creará una cuenta de almacenamiento y una cola.
Defina un nombre para la cuenta de almacenamiento.
STORAGE_ACCOUNT_NAME="<STORAGE_ACCOUNT_NAME>" QUEUE_NAME="myqueue"
Reemplace
<STORAGE_ACCOUNT_NAME>
por un nombre único para la cuenta de almacenamiento. Los nombres de las cuentas de almacenamiento deben ser únicos en Azure, deben tener entre 3 y 24 caracteres, y solo pueden incluir números y letras en minúscula.Cree una cuenta de Azure Storage.
az storage account create \ --name "$STORAGE_ACCOUNT_NAME" \ --resource-group "$RESOURCE_GROUP" \ --location "$LOCATION" \ --sku Standard_LRS \ --kind StorageV2
Guarde la cadena de conexión de la cola en una variable.
QUEUE_CONNECTION_STRING=`az storage account show-connection-string -g $RESOURCE_GROUP --name $STORAGE_ACCOUNT_NAME --query connectionString --output tsv`
Cree la cola de mensajes.
az storage queue create \ --name "$QUEUE_NAME" \ --account-name "$STORAGE_ACCOUNT_NAME" \ --connection-string "$QUEUE_CONNECTION_STRING"
Creación e implementación del trabajo
Para implementar el trabajo, primero debe compilar una imagen de contenedor para el trabajo e insertarla en un registro. Luego, puede implementar el trabajo en el entorno de Container Apps.
Defina un nombre para la imagen de contenedor y el registro.
CONTAINER_IMAGE_NAME="queue-reader-job:1.0" CONTAINER_REGISTRY_NAME="<CONTAINER_REGISTRY_NAME>"
Reemplace
<CONTAINER_REGISTRY_NAME>
por un nombre único para el registro de contenedor. Los nombres del registro de contenedor deben ser únicos en Azure, deben tener entre 5 y 50 caracteres, y solo pueden incluir números y letras en minúscula.Cree un registro de contenedor.
az acr create \ --name "$CONTAINER_REGISTRY_NAME" \ --resource-group "$RESOURCE_GROUP" \ --location "$LOCATION" \ --sku Basic \ --admin-enabled true
El código fuente del trabajo está disponible en GitHub. Ejecute el siguiente comando para clonar el repositorio y compilar la imagen de contenedor en la nube mediante el comando
az acr build
.az acr build \ --registry "$CONTAINER_REGISTRY_NAME" \ --image "$CONTAINER_IMAGE_NAME" \ "https://github.com/Azure-Samples/container-apps-event-driven-jobs-tutorial.git"
La imagen ya está disponible en el registro de contenedor.
Cree un trabajo en el entorno de Container Apps.
az containerapp job create \ --name "$JOB_NAME" \ --resource-group "$RESOURCE_GROUP" \ --environment "$ENVIRONMENT" \ --trigger-type "Event" \ --replica-timeout "1800" \ --min-executions "0" \ --max-executions "10" \ --polling-interval "60" \ --scale-rule-name "queue" \ --scale-rule-type "azure-queue" \ --scale-rule-metadata "accountName=$STORAGE_ACCOUNT_NAME" "queueName=$QUEUE_NAME" "queueLength=1" \ --scale-rule-auth "connection=connection-string-secret" \ --image "$CONTAINER_REGISTRY_NAME.azurecr.io/$CONTAINER_IMAGE_NAME" \ --cpu "0.5" \ --memory "1Gi" \ --secrets "connection-string-secret=$QUEUE_CONNECTION_STRING" \ --registry-server "$CONTAINER_REGISTRY_NAME.azurecr.io" \ --env-vars "AZURE_STORAGE_QUEUE_NAME=$QUEUE_NAME" "AZURE_STORAGE_CONNECTION_STRING=secretref:connection-string-secret"
La siguiente tabla describe los principales parámetros que se usan en el comando.
Parámetro Descripción --replica-timeout
La duración máxima que se puede ejecutar una réplica. --min-executions
El número mínimo de ejecuciones de trabajos que tienen lugar por intervalo de sondeo. --max-executions
El número máximo de ejecuciones de trabajos que tienen lugar por intervalo de sondeo. --polling-interval
El intervalo de sondeo en el que se evalúa la regla de escalado. --scale-rule-name
El nombre de la regla de escalado. --scale-rule-type
El tipo de regla de escalado que se usa. --scale-rule-metadata
Los metadatos de la regla de escalado. --scale-rule-auth
La autenticación de la regla de escalado. --secrets
Los secretos que se usan para el trabajo. --registry-server
El servidor de registro de contenedor que se usa para el trabajo. En el caso de una instancia de Azure Container Registry, el comando configura automáticamente la autenticación. --env-vars
Las variables de entorno que se usan para el trabajo. La configuración de la regla de escalado define el origen del evento que se supervisa. Se evalúa en cada intervalo de sondeo y determina el número de ejecuciones de trabajos se desencadenan. Para más información, consulte Establecimiento de reglas de escalado.
El trabajo controlado por eventos ahora se crea en el entorno de Container Apps.
Comprobar la implementación
El trabajo se configura para evaluar la regla de escalado cada 60 segundos, que comprueba el número de mensajes de la cola. Para cada período de evaluación, inicia una nueva ejecución de trabajos para cada mensaje de la cola, hasta un máximo de 10 ejecuciones.
Para comprobar que el trabajo se ha configurado correctamente, puede enviar algunos mensajes a la cola, confirmar que se inician las ejecuciones de los trabajos y que los mensajes se registran en los registros de ejecución de trabajos.
Envíe un mensaje a la cola.
az storage message put \ --content "Hello Queue Reader Job" \ --queue-name "$QUEUE_NAME" \ --connection-string "$QUEUE_CONNECTION_STRING"
Enumere las ejecuciones de un trabajo.
az containerapp job execution list \ --name "$JOB_NAME" \ --resource-group "$RESOURCE_GROUP" \ --output json
Dado que el trabajo está configurado para evaluar la regla de escalado cada 60 segundos, la ejecución del trabajo puede tardar hasta un minuto en iniciarse. Repita el comando hasta que vea la ejecución del trabajo y que su estado es
Succeeded
.Ejecute el comando siguiente para ver los mensajes registrados. Estos comandos necesitan la extensión de Log Analytics, así que acepte el mensaje para instalar la extensión cuando se le solicite.
LOG_ANALYTICS_WORKSPACE_ID=`az containerapp env show --name $ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.appLogsConfiguration.logAnalyticsConfiguration.customerId --out tsv` az monitor log-analytics query \ --workspace "$LOG_ANALYTICS_WORKSPACE_ID" \ --analytics-query "ContainerAppConsoleLogs_CL | where ContainerJobName_s == '$JOB_NAME' | order by _timestamp_d asc"
Hasta que la tabla
ContainerAppConsoleLogs_CL
esté lista, el comando devuelve un error:BadArgumentError: The request had some invalid properties
. Espere unos minutos y pruebe otra vez.
Sugerencia
¿Tiene problemas? Háganoslo saber en GitHub abriendo una incidencia en el repositorio de Azure Container Apps.
Limpieza de recursos
Cuando haya terminado, ejecute el siguiente comando para eliminar el grupo de recursos que contiene los recursos de Container Apps.
Precaución
El comando siguiente elimina el grupo de recursos especificado y todos los recursos que contiene. Si existen recursos en el grupo de recursos especificado que están fuera del ámbito de este tutorial, también se eliminarán.
az group delete \
--resource-group $RESOURCE_GROUP