Introducción a Dapr .NET SDK (9/N): Azure Container Apps mode


En el pasado Microsoft Ignite (2021), se revelaba un nuevo servicio, Azure Container App. Un servicio de contenedores Serverless completamente gestionado para la construcción y el despligue de aplicaciones permitiendo facilmente su escalabilidad en base a las siguientes característidas:

Escenarios de ejemplo para Azure Container Apps.

Una gran ventaja que nos aporta es, sin duda, la integración «out of the box» con Dapr. Es decir, de manera nativa incluye el Runtime, por lo que nos podemos incluso olvidar de su instalación.

En la serie de 8 capitulos que comenzaba con este, trabajamos con la aplicación «AllTogether» que usamos como prueba y, que ya conocemo. En este otro la publicabamos en Kubernetes. En este, aprovecharemos para desplegarla (los dos servicios y la web), en Azure Container Apps.

Configuración

La creación de un Container App, requiere de un Container App Environment donde se hostea y un Log Analytics workspace. Los siguientes pasos nos indican el camino para ello.

Opción 1. Portal de Azure.

Buscamos en el Portal «Container App» y puslamos «Create».

Tras pulsar «Create» seleccionamos el Resource Group e introducimos el nombre para nuestro Container App.

Pulsamos el link «Create new» vinculado al campo «Container App environtment» y completamos la información solictada.

Antes de pulsar «Create», cambiamos a la pestaña «Monitoring» y de igual forma, completamos la información, «OK» y «Create».

Para finalizar seleccionamos la pestaña «App settings», donde temos la posibilidad de ajustar los valores para nuestro Container App. Desde el origen de las imágenes docker hasta hasta los recursos para la ejecución de dicha imagen, que contiene la aplicación/servicio/proceso y un ingres.

La configuración de Dapr, como podemos ver, no está disponible a través del Portal de Azure.

Dejamos marcado de manera predeterminada la casilla «Use quickstart image» (que es una imagen docker de ejemplo «Hellow World») y el resto de valores y, pulsamos «Review + create» y a continuación, «create» para concluir.

Este Container App, salvo para nuestro «cacharreo», no lo vamos a necesitar, sin embargo no temos opción de poder omitirlo a través del portal. Por lo que podemos eliminarlo.

Opción 2. AZ CLI.

Mediante la consola de comando y haciendo uso de AZ CLI, podemos ejecutar los siguientes comandos o bien aglutinarlos en un Powershell (.ps1). De la misma forma que a través del Portal, con estos dos comandos tedremos creado el Log Analytics y el Container App Environment.

az monitor log-analytics workspace create --resource-group $RESOURCE_GROUP --workspace-name $LOG_ANALYTICS_WORKSPACE

$LOG_ANALYTICS_WORKSPACE_CLIENT_ID=(az monitor log-analytics workspace show --query customerId -g $RESOURCE_GROUP -n $LOG_ANALYTICS_WORKSPACE --out tsv)

$LOG_ANALYTICS_WORKSPACE_CLIENT_SECRET=(az monitor log-analytics workspace get-shared-keys --query primarySharedKey -g $RESOURCE_GROUP -n $LOG_ANALYTICS_WORKSPACE --out tsv)

az containerapp env create `
  --name $CONTAINERAPPS_ENVIRONMENT `
  --resource-group $RESOURCE_GROUP `
  --logs-workspace-id $LOG_ANALYTICS_WORKSPACE_CLIENT_ID `
  --logs-workspace-key $LOG_ANALYTICS_WORKSPACE_CLIENT_SECRET `
  --location "$LOCATION"

Integración y uso de Dapr

Llegados a este punto, disponemos de todo lo necesario. Unicamente nos queda desplegar nuestros dos servicios y la aplicación web. Cada uno de ellos en un Container App.

Actualmente la integración con Dapr solo es posible vía AZ CLI

Procedemos por tanto como sigue:

En primer lugar, con algunos pre-requisitos, tales como el «az cli» para asegurarnos de disponer de la última versión.

az upgrade / brew upgrade az (MacOS)

A continuación añadimos una nueva extensión. Justo la que nos va a permitir trabajar con Azure Container Apps. que por el momento se encuentra en preview.

az extension add \
--source https://workerappscliextension.blob.core.windows.net/azure-cli-extension/containerapp-0.2.0-py2.py3-none-any.whl

Y, registramos el namespace «Microsoft.Web»

az provider register --namespace Microsoft.Web

Despues, creamos un nuevo y único fichero «components.yaml» compuesto por los componentes Dapr que hemos venido usando y, sobre los que hemos hablado en capitulos anteriores. Si bien, el esquema/estructura es diferente al de los componentes Dapr. Es por tanto donde tenemos que poner antención para su creación.

- name: pubsub

  type: pubsub.azure.servicebus
  version: v1
  metadata:
  - name: connectionString    
    secretRef: connectionsString 
- name: statestore
  type: state.azure.tablestorage
  version: v1
  metadata:
  - name: accountName
    value: daprdemo1
  - name: tableName
    value: daprdemotable    
  - name: accountKey    
    secretRef: accountkey

Importante: Como vemos, el componente de Secretos no es utilizado. Esto es debido a que los secretos se indican y configurarán de manera diferente. Es el Azure Container App, quien los almacena y gestiona. Es más, por el momento y esta primera preview, no es posible trabajar con SecretsStores (Kubernetes Secrets, KeyVault, etc.).

Teniendo todo esto en cuenta, creamos cada Container App indicando los parámetros de configuración necesarios y, habilitamos y configuramos Dapr.

 az containerapp create `
 --name website `
 --resource-group $RESOURCE_GROUP `
 --environment $CONTAINERAPPS_ENVIRONMENT `
 --secrets "accountkey=$STORAGE_ACCOUNT_KEY,connectionstring=$SERVICE_BUS_CONNECTION_STRING" `
 --registry-login-server $ACR `
 --registry-username $ACR_User `
 --registry-password $ACR_Password `
 --image k8sappsregistry.azurecr.io/alltogether.website:latest `
 --target-port 80 `
 --ingress 'external' `
 --min-replicas 1 `
 --max-replicas 1 `
 --enable-dapr `
 --dapr-app-port 80 `
 --dapr-app-id website `
 --dapr-components ..\..\dapr\components\azure\components.yaml `
 --verbose

Nota: Todas las keys del parámetro «–secrets» deben ser alfanuméricias y minúsculas.

El scripts PowerShell completo lo tenemos aquí en el repositorio github de la aplicación: AllTogetherApp – deploy – AzureContainerApps – Deploy-AzureContainerApps.ps1. Tras su ejecución, vemos como los tres Container Apps se han creado.

Si accedemos al «website» tenemos todo el detalle del mismo: Secrets, Ingress e incluso en «Revision management» información de escalado y mas detalle sobre Dapr.

Finalmente, navegamos a la «Application Url» y vemos como nuestra aplicación se ejecuta correctamente.

TIP Troubleshooting

Si tenemos errores, es aquí donde entra en juego el Log Analytics antes creado. Por tanto, basta con ejectuar una consulta similar a la siguiente para encontralos.

ContainerAppConsoleLogs_CL 
| where  ContainerAppName_s  contains "Website"
| project  ContainerAppName_s, Log_s, TimeGenerated
| where Log_s !startswith "time="
| order by TimeGenerated desc 
| take  10
Ejemplo de consulta mostrando un error de Dapr

Aun le queda recorrido a Azure Container Apps, sin embargo y en lo que respecta a Dapr, creo que es el comienzo de un largo recorrido. ¡Dapr está llegando para quedarse. La «era» multicloud ya es una realidad!

Happy Dapr coding in Multicloud environments !!!

Referencias

9 comentarios sobre “Introducción a Dapr .NET SDK (9/N): Azure Container Apps mode

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.