Compartir vía


Tutorial: Implementación de una aplicación Dapr en Azure Container Apps mediante la CLI de Azure

Dapr (Distributed Application Runtime) ayuda a los desarrolladores a crear microservicios resistentes y de confianza. En este tutorial, se implementa una aplicación Dapr de muestra en Azure Container Apps.

Aprenderá a:

  • Crear un entorno de Container Apps para las aplicaciones de contenedor
  • Crear un almacén de estado de Azure Blob Storage para la aplicación de contenedor
  • Implementación de dos aplicaciones que producen y consumen mensajes y los conservan mediante el almacén de estado
  • Comprobar la interacción entre los dos microservicios.

Con Azure Container Apps se obtiene una versión totalmente administrada de las API de Dapr al compilar microservicios. Al usar Dapr en Azure Container Apps, puede habilitar sidecars para que se ejecuten junto a los microservicios que proporcionan un amplio conjunto de funcionalidades. Las API de Dapr disponibles incluyen llamadas de servicio a servicio, pub/sub, enlaces de eventos, almacenes de estado y actores.

En este tutorial, implementará las mismas aplicaciones del inicio rápido Hola mundo de Dapr.

La aplicación consta de:

  • Una aplicación contenedora de cliente (Python) para generar mensajes.
  • Una aplicación contenedora de servicio (Node) para consumir y conservar esos mensajes en un almacén de estado

En el siguiente diagrama de arquitectura se muestran los componentes que conforman este tutorial:

Diagrama de arquitectura de Dapr Hola mundo microservicios en Azure Container Apps

Configurar

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

Para asegurarse de que ejecuta la versión más reciente de la CLI, ejecute el comando de actualización.

az upgrade

Luego, instale o actualice la extensión de Azure Container Apps para la CLI.

Si recibe errores sobre los parámetros que faltan al ejecutar az containerapp comandos en la CLI de Azure o cmdlets del Az.App módulo en Azure PowerShell, asegúrese de que tiene instalada la versión más reciente de la extensión Azure Container Apps.

az extension add --name containerapp --upgrade

Nota:

A partir de mayo de 2024, las extensiones de la CLI de Azure ya no habilitan las características en versión preliminar de manera predeterminada. Para acceder a las características de la versión preliminar de Container Apps, instale la extensión Container Apps con --allow-preview true.

az extension add --name containerapp --upgrade --allow-preview true

Ahora que la extensión o módulo actualizado está instalado, registre los espacios de nombre Microsoft.App y Microsoft.OperationalInsights.

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
az provider register --namespace Microsoft.OperationalInsights

Establecimiento de variables de entorno

Establezca las siguientes variables de entorno. Reemplace los <MARCADORES DE POSICIÓN> por sus valores:

RESOURCE_GROUP="<RESOURCE_GROUP>"
LOCATION="<LOCATION>"
CONTAINERAPPS_ENVIRONMENT="<CONTAINERAPPS_ENVIRONMENT>"

Creación de un grupo de recursos de Azure

Cree un grupo de recursos para organizar los servicios relacionados con la implementación de la aplicación contenedora.

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

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.

Para crear el entorno, ejecute el comando siguiente:

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

Configuración de un almacén de estado

Creación de una cuenta de Azure Blob Storage

Con el entorno implementado, el siguiente paso consiste en implementar una cuenta de Azure Blob Storage que use uno de los microservicios para almacenar los datos. Antes de implementar el servicio, debe elegir un nombre 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 deben contener solo números y letras en minúscula.

STORAGE_ACCOUNT_NAME="<storage account name>"

Use el siguiente comando para crear la cuenta de Azure Storage.

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

Configuración de una identidad asignada por el usuario para la aplicación de nodo

Aunque Container Apps admite identidades administradas asignadas por el usuario y asignadas por el sistema, una identidad asignada por el usuario proporciona a la aplicación de nodo habilitada para Dapr permisos para acceder a la cuenta de Blob Storage.

  1. Cree una identidad asignada por el usuario.
az identity create --resource-group $RESOURCE_GROUP --name "nodeAppIdentity" --output json

Recupere las propiedades principalId y id y almacénelas en variables.

PRINCIPAL_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query principalId | tr -d \")
IDENTITY_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query id | tr -d \")
CLIENT_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query clientId | tr -d \")
  1. Asignación del rol Storage Blob Data Contributor a la identidad asignada por el usuario

Recupere el id. de la suscripción actual.

SUBSCRIPTION_ID=$(az account show --query id --output tsv)
az role assignment create --assignee $PRINCIPAL_ID  \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"

Configuración del componente del almacén de estado

Hay varias maneras de autenticarse en recursos externos a través de Dapr. En este ejemplo no se usa la API de secretos de Dapr en tiempo de ejecución, sino que se usa un almacén de estado basado en Azure. Por lo tanto, puede crear un componente de almacén de secretos y, en su lugar, proporcionar acceso directo desde la aplicación de nodo al almacén de blobs mediante la identidad administrada. Si quiere usar un almacén de estado que no sea de Azure o la API de secretos de Dapr en tiempo de ejecución, puede crear un componente de almacén de secretos. Este componente cargaría los secretos en tiempo de ejecución para poder hacer referencia a ellos en tiempo de ejecución.

Abra un editor de texto y cree un archivo de configuración llamado statestore.yaml con las propiedades que obtuvo en los pasos anteriores. Este archivo ayuda a permitir que la aplicación Dapr acceda al almacén de estado. En el ejemplo siguiente se muestra el aspecto que debe tener el archivo statestore.yaml cuando se configura para la cuenta de Azure Blob Storage:

# statestore.yaml for Azure Blob storage component
componentType: state.azure.blobstorage
version: v1
metadata:
  - name: accountName
    value: "<STORAGE_ACCOUNT_NAME>"
  - name: containerName
    value: mycontainer
  - name: azureClientId
    value: "<MANAGED_IDENTITY_CLIENT_ID>"
scopes:
  - nodeapp

Para usar este archivo, actualice los marcadores de posición:

  • Reemplace <STORAGE_ACCOUNT_NAME> por el valor de la variable STORAGE_ACCOUNT_NAME que ha definido. Para obtener su valor, ejecute el siguiente comando:
echo $STORAGE_ACCOUNT_NAME
  • Reemplace <MANAGED_IDENTITY_CLIENT_ID> por el valor de la variable CLIENT_ID que ha definido. Para obtener su valor, ejecute el siguiente comando:
echo $CLIENT_ID

Vaya al directorio en el que ha almacenado el archivo YAML del componente y ejecute el siguiente comando para configurar el componente de Dapr en el entorno de Container Apps. Para obtener más información sobre cómo configurar componentes de Dapr, consulte Configuración de componentes de Dapr.

az containerapp env dapr-component set \
    --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP \
    --dapr-component-name statestore \
    --yaml statestore.yaml

Implementación de la aplicación de servicio (servidor web HTTP)

az containerapp create \
  --name nodeapp \
  --resource-group $RESOURCE_GROUP \
  --user-assigned $IDENTITY_ID \
  --environment $CONTAINERAPPS_ENVIRONMENT \
  --image dapriosamples/hello-k8s-node:latest \
  --min-replicas 1 \
  --max-replicas 1 \
  --enable-dapr \
  --dapr-app-id nodeapp \
  --dapr-app-port 3000 \
  --env-vars 'APP_PORT=3000'

De forma predeterminada, la imagen se extrae de Docker Hub.

Implementación de la aplicación cliente (cliente desatendido)

Ejecute el siguiente comando para implementar la aplicación contenedora del cliente.

az containerapp create \
  --name pythonapp \
  --resource-group $RESOURCE_GROUP \
  --environment $CONTAINERAPPS_ENVIRONMENT \
  --image dapriosamples/hello-k8s-python:latest \
  --min-replicas 1 \
  --max-replicas 1 \
  --enable-dapr \
  --dapr-app-id pythonapp

Verificación de los resultados

Confirmación de la persistencia de estado correcta

Puede confirmar que los servicios funcionan correctamente mediante la visualización de datos en la cuenta de Azure Storage.

  1. Abra Azure Portal en el navegador y vaya a la cuenta de almacenamiento.

  2. Seleccione el menú del lado izquierdo Contenedores.

  3. Seleccione mycontainer.

  4. Compruebe que puede ver el archivo denominado order en el contenedor.

  5. Seleccione el archivo .

  6. Seleccione la pestaña Editar.

  7. Seleccione el botón Actualizar para ver cómo se actualizan automáticamente los datos.

Ver registros

Los registros de una aplicación de contenedor se almacenan en la tabla personalizada ContainerAppConsoleLogs_CL del área de trabajo de Log Analytics. Puede ver los registros mediante Azure Portal o la CLI. Inicialmente, la tabla puede tardar un breve período de tiempo en aparecer en el área de trabajo.

Use el siguiente comando de la CLI para ver los registros mediante la línea de comandos.

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 == 'nodeapp' and (Log_s contains 'persisted' or Log_s contains 'order') | project ContainerAppName_s, Log_s, TimeGenerated | sort by TimeGenerated | take 5" \
  --out table

En la salida siguiente, se muestra el tipo de respuesta que se espera del comando de la CLI.

ContainerAppName_s    Log_s                            TableName      TimeGenerated
--------------------  -------------------------------  -------------  ------------------------
nodeapp               Got a new order! Order ID: 61    PrimaryResult  2021-10-22T21:31:46.184Z
nodeapp               Successfully persisted state.    PrimaryResult  2021-10-22T21:31:46.184Z
nodeapp               Got a new order! Order ID: 62    PrimaryResult  2021-10-22T22:01:57.174Z
nodeapp               Successfully persisted state.    PrimaryResult  2021-10-22T22:01:57.174Z
nodeapp               Got a new order! Order ID: 63    PrimaryResult  2021-10-22T22:45:44.618Z

Limpieza de recursos

Felicidades. Ha completado el tutorial. Si quiere eliminar los recursos creados como parte de este tutorial, ejecute el siguiente comando.

Precaución

Este comando 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

Nota:

Puesto que pythonapp realiza llamadas continuas a nodeapp con mensajes que se conservan en el almacén de estado configurado, es importante completar estos pasos de limpieza para evitar las operaciones facturables en curso.

Sugerencia

¿Tiene problemas? Háganoslo saber en GitHub abriendo una incidencia en el repositorio de Azure Container Apps.

Pasos siguientes