Tutorial: Implementación de una aplicación de procesamiento en segundo plano con Azure Container Apps

El uso de Azure Container Apps permite implementar aplicaciones sin necesidad de exponer puntos de conexión públicos. Al usar las reglas de escala de Container Apps, la aplicación se puede escalar y reducir horizontalmente en función de la longitud de la cola de Azure Storage. Cuando no hay ningún mensaje en la cola, la aplicación de contenedor se reduce horizontalmente a cero.

Aprenderá a:

  • 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
  • Implementar la aplicación de procesamiento en segundo plano como una aplicación de contenedor
  • Comprobar que la aplicación de contenedor procesa los mensajes de cola

Instalación

Para empezar, inicie sesión en Azure. Ejecute el siguiente comando y siga las indicaciones para completar el proceso de autenticación.

az login

Luego instale la extensión Azure Container Apps para la CLI.

az extension add --name containerapp --upgrade

Ahora que la extensión o módulo actual está instalado, registre el espacio de nombres Microsoft.App.

Nota:

Los recursos de Azure Container Apps han migrado desde el espacio de nombres Microsoft.Web al espacio de nombres Microsoft.App. Consulte Migración del espacio de nombres de Microsoft.Web a Microsoft.App marzo de 2022 para obtener más detalles.

az provider register --namespace Microsoft.App

Registre el proveedor Microsoft.OperationalInsights para el área de trabajo de Log Analytics de Azure Monitor si no se ha usado antes.

az provider register --namespace Microsoft.OperationalInsights

A continuación, agregue estas variables de entorno:

RESOURCE_GROUP="my-container-apps"
LOCATION="canadacentral"
CONTAINERAPPS_ENVIRONMENT="my-environment"

Con estas variables definidas, puede crear un grupo de recursos para organizar los servicios relacionados con la nueva aplicación de contenedor.

az group create \
  --name $RESOURCE_GROUP \
  --location $LOCATION

Con la CLI actualizada y un nuevo grupo de recursos disponible, puede crear un entorno de Container Apps e implementar la aplicación de contenedor.

Creación de un entorno

Un entorno de Azure Container Apps crea un límite seguro alrededor de un grupo de aplicaciones de contenedor. Las aplicaciones de contenedor implementadas en el mismo entorno se implementan en la misma red virtual y escriben registros en la misma área de trabajo de Log Analytics.


Las aplicaciones de contenedor individuales se implementan en un entorno de Azure Container Apps. Para crear el entorno, ejecute el comando siguiente:

az containerapp env create \
  --name $CONTAINERAPPS_ENVIRONMENT \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION"

Configuración de una cola de almacenamiento

Para empezar, defina el nombre de 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.

STORAGE_ACCOUNT_NAME="<STORAGE_ACCOUNT_NAME>"

Cree una cuenta de Azure Storage.

az storage account create \
  --name $STORAGE_ACCOUNT_NAME \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION" \
  --sku Standard_RAGRS \
  --kind StorageV2

A continuación, obtenga la cadena de conexión para la cola.

QUEUE_CONNECTION_STRING=`az storage account show-connection-string -g $RESOURCE_GROUP --name $STORAGE_ACCOUNT_NAME --query connectionString --out json | tr -d '"'`

Ahora puede crear la cola de mensajes.

az storage queue create \
  --name "myqueue" \
  --account-name $STORAGE_ACCOUNT_NAME \
  --connection-string $QUEUE_CONNECTION_STRING

Por último, puede enviar un mensaje a la cola.

az storage message put \
  --content "Hello Queue Reader App" \
  --queue-name "myqueue" \
  --connection-string $QUEUE_CONNECTION_STRING

Implementación de la aplicación en segundo plano

Cree un archivo denominado queue.json y pegue dentro el código de configuración siguiente.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "defaultValue": "canadacentral",
            "type": "String"
        },
        "environment_name": {
            "type": "String"
        },
        "queueconnection": {
            "type": "secureString"
        }
    },
    "variables": {},
    "resources": [
    {
        "name": "queuereader",
        "type": "Microsoft.App/containerApps",
        "apiVersion": "2022-03-01",
        "kind": "containerapp",
        "location": "[parameters('location')]",
        "properties": {
            "managedEnvironmentId": "[resourceId('Microsoft.App/managedEnvironments', parameters('environment_name'))]",
            "configuration": {
                "activeRevisionsMode": "single",
                "secrets": [
                {
                    "name": "queueconnection",
                    "value": "[parameters('queueconnection')]"
                }]
            },
            "template": {
                "containers": [
                    {
                        "image": "mcr.microsoft.com/azuredocs/containerapps-queuereader",
                        "name": "queuereader",
                        "env": [
                            {
                                "name": "QueueName",
                                "value": "myqueue"
                            },
                            {
                                "name": "QueueConnectionString",
                                "secretRef": "queueconnection"
                            }
                        ]
                    }
                ],
                "scale": {
                    "minReplicas": 1,
                    "maxReplicas": 10,
                    "rules": [
                        {
                            "name": "myqueuerule",
                            "azureQueue": {
                                "queueName": "myqueue",
                                "queueLength": 100,
                                "auth": [
                                    {
                                        "secretRef": "queueconnection",
                                        "triggerParameter": "connection"
                                    }
                                ]
                            }
                        }
                    ]
                }
            }
        }
    }]
}

Ahora puede crear e implementar la aplicación de contenedor.

az deployment group create --resource-group "$RESOURCE_GROUP" \
  --template-file ./queue.json \
  --parameters \
    environment_name="$CONTAINERAPPS_ENVIRONMENT" \
    queueconnection="$QUEUE_CONNECTION_STRING" \
    location="$LOCATION"

Este comando implementa la aplicación de demostración desde la imagen de contenedor pública denominada mcr.microsoft.com/azuredocs/containerapps-queuereader y establece los secretos y las variables de entorno que usa la aplicación.

La aplicación escala horizontalmente hasta 10 réplicas en función de la longitud de la cola, como se define en la sección scale de la plantilla de ARM.

Comprobar el resultado

La aplicación contenedora se ejecuta como un proceso en segundo plano. A medida que llegan mensajes de la cola de Azure Storage, la aplicación crea entradas de registro en el análisis de registros. Debe esperar unos minutos para que el análisis llegue por primera vez antes de poder consultar los datos registrados.

Ejecute el comando siguiente para ver los mensajes registrados. Este comando necesita la extensión de Log Analytics, así que acepte el mensaje para instalar la extensión cuando se le solicite.

LOG_ANALYTICS_WORKSPACE_CLIENT_ID=`az containerapp env show --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.appLogsConfiguration.logAnalyticsConfiguration.customerId --out tsv`

az monitor log-analytics query \
  --workspace $LOG_ANALYTICS_WORKSPACE_CLIENT_ID \
  --analytics-query "ContainerAppConsoleLogs_CL | where ContainerAppName_s == 'queuereader' and Log_s contains 'Message ID' | project Time=TimeGenerated, AppName=ContainerAppName_s, Revision=RevisionName_s, Container=ContainerName_s, Message=Log_s | take 5" \
  --out table

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