Tutoriel : Déployer une application Dapr sur Azure Container Apps à l’aide de l’interface Azure CLI

Dapr (Distributed Application Runtime) permet aux développeurs de créer des microservices résilients et fiables. Dans ce tutoriel, un exemple d’application Dapr est déployé sur Azure Container Apps.

Vous allez apprendre à effectuer les actions suivantes :

  • Créer un environnement Container Apps pour vos applications de conteneur
  • Créer un magasin d’état Stockage Blob Azure pour l’application de conteneur
  • Déployer deux applications qui produisent et consomment des messages et les conservent dans le magasin d’état
  • Vérifier l’interaction entre les deux microservices.

Grâce à Azure Container Apps, vous disposez d’une version complètement managée des API Dapr lors de la création de microservices. Quand vous utilisez Dapr dans Azure Container Apps, vous pouvez autoriser les side-car à s’exécuter à côté de vos microservices qui fournissent un ensemble complet de fonctionnalités. Les API Dapr disponibles incluent Appels de service à service, Pub/Sub, Liaisons d’événements, Magasins d’état et Acteurs.

Dans ce tutoriel, vous déployez les mêmes applications à partir du démarrage rapide Hello World Dapr.

L’application comporte les éléments suivants :

  • Une application de conteneur client (Python) pour générer des messages
  • Une application de conteneur de service (Node) pour consommer ces messages et les conserver dans un magasin d’état

Le diagramme d’architecture suivant illustre les composants qui composent ce tutoriel :

Diagramme d’architecture pour microservices Hello World Dapr sur Azure Container Apps

Programme d’installation

Pour vous connecter à Azure à partir de l’interface CLI, exécutez la commande suivante et suivez les invites pour procéder à l’authentification.

az login

Pour être sûr d’utiliser la dernière version de l’interface CLI, exécutez la commande de mise à niveau.

az upgrade

Ensuite, installez ou mettez à jour l’extension Azure Container Apps pour l’interface CLI.

Si vous recevez des erreurs concernant des paramètres manquants lorsque vous exécutez des commandes az containerapp dans Azure CLI ou les cmdlets du module Az.App dans Azure PowerShell, assurez-vous que la dernière version de l’extension Azure Container Apps est installée.

az extension add --name containerapp --upgrade

Remarque

À compter de mai 2024, les extensions Azure CLI n’activent plus les fonctionnalités en préversion par défaut. Pour accéder aux fonctionnalités en préversion de Container Apps, installez l’extension Container Apps avec --allow-preview true.

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

Maintenant que la version actuelle de l’extension ou du module est installée, inscrivez les espaces de noms Microsoft.App et Microsoft.OperationalInsights.

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

Définir des variables d’environnement

Définissez les variables d’environnement suivantes. Remplacez les <ESPACES RÉSERVÉS> par vos valeurs :

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

Création d’un groupe de ressources Azure

Créez un groupe de ressources pour organiser les services liés au déploiement de votre application de conteneur.

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

Créer un environnement

Un environnement dans Azure Container Apps crée une limite sécurisée autour d’un groupe d’applications de conteneur. Les applications de conteneur déployées dans le même environnement sont déployées dans le même réseau virtuel et écrivent les journaux dans le même espace de travail Log Analytics.

Pour créer l’environnement, exécutez la commande suivante :

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

Configurer un magasin d’état

Créer un compte de stockage Blob Azure

Avec l’environnement déployé, l’étape suivante consiste à déployer un compte Stockage Blob Azure utilisé par l’un des microservices pour stocker des données. Avant de déployer le service, vous devez choisir un nom pour le compte de stockage. Les noms des comptes de stockage doivent être uniques dans Azure et comporter entre 3 et 24 caractères, uniquement des lettres minuscules et des chiffres.

STORAGE_ACCOUNT_NAME="<storage account name>"

Utilisez la commande suivante pour créer le compte de stockage Azure.

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

Configurer une identité affectée par l’utilisateur pour l’application de nœud

Bien que Container Apps prenne en charge l’identité managée affectée par l’utilisateur et affectée par le système, une identité affectée par l’utilisateur fournit à l’application de nœud compatible Dapr des autorisations pour accéder au compte de stockage d’objets blob.

  1. Créer uneidentité affectée par l’utilisateur.
az identity create --resource-group $RESOURCE_GROUP --name "nodeAppIdentity" --output json

Récupérer les propriétés principalId et id, et les stocker dans des 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. Attribuer le rôle Storage Blob Data Contributor à l’identité affectée par l’utilisateur

Récupérer l’ID d’abonnement de votre abonnement actuel.

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"

Configurer le composant de stockage d’état

Il existe plusieurs façons de s’authentifier auprès des ressources externes via Dapr. Cet exemple n’utilise pas l’API Dapr Secrets au moment de l’exécution, mais utilise un magasin d’état basé sur Azure. Par conséquent, vous pouvez créer un composant de magasin de secrets et fournir à la place un accès direct de l’application de nœud au magasin d’objets blob à l’aide de Managed Identity. Si vous souhaitez utiliser un magasin d’état non Azure ou l’API Dapr Secrets au moment de l’exécution, vous pouvez créer un composant de magasin de secrets. Ce composant charge les secrets du runtime afin de pouvoir les référencer au moment de l’exécution.

Ouvrez un éditeur de texte et créez un fichier config nommé statestore.yaml avec les propriétés issues des étapes précédentes. Ce fichier permet à votre application Dapr d’accéder à votre magasin d’état. L’exemple suivant montre a quoi votre fichier statestore.yaml doit ressembler lorsqu’il est configuré pour votre compte Stockage Blob Azure :

# 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

Pour utiliser ce fichier, mettez à jour les espaces réservés :

  • Remplacez <STORAGE_ACCOUNT_NAME> par la valeur de la variable STORAGE_ACCOUNT_NAME que vous avez définie. Pour obtenir sa valeur, exécutez la commande suivante :
echo $STORAGE_ACCOUNT_NAME
  • Remplacez <MANAGED_IDENTITY_CLIENT_ID> par la valeur de la variable CLIENT_ID que vous avez définie. Pour obtenir sa valeur, exécutez la commande suivante :
echo $CLIENT_ID

Accédez au répertoire dans lequel vous avez stocké le fichier yaml composant et exécutez la commande suivante pour configurer le composant Dapr dans l’environnement Container Apps. Pour plus d'informations sur la configuration des composants Dapr, consultez Configurer les composants Dapr.

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

Déployer l’application de service (serveur 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'

Si vous utilisez un Azure Container Registry, incluez l’indicateur --registry-server <REGISTRY_NAME>.azurecr.io dans la commande.

Par défaut, l’image est extraite de Docker Hub.

Déployer l’application cliente (client administré à distance)

Exécutez la commande suivante pour déployer l’application de conteneur client.

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

Si vous utilisez un Azure Container Registry, incluez l’indicateur --registry-server <REGISTRY_NAME>.azurecr.io dans la commande.

Vérifier les résultats

Confirmer la réussite de la persistance de l’état

Vous pouvez vérifier que les services fonctionnent correctement en affichant les données de votre compte de stockage Azure.

  1. Ouvrez le portail Azure dans votre navigateur et accédez à votre compte de stockage.

  2. Sélectionnez le menu Conteneurs côté gauche.

  3. Sélectionnez mycontainer.

  4. Vérifiez que vous pouvez voir le fichier nommé order dans le conteneur.

  5. Sélectionnez le fichier .

  6. Sélectionnez l’onglet Modifier.

  7. Sélectionnez le bouton Actualiser pour observer la mise à jour automatique des données.

Afficher les journaux

Les journaux d’une application conteneur sont stockés dans la table personnalisée ContainerAppConsoleLogs_CL de l’espace de travail Log Analytics. Vous pouvez voir les journaux dans le portail Azure ou via l’interface CLI. Il peut y avoir un petit délai initialement pour que la table apparaisse dans l’espace de travail.

Utilisez la commande CLI suivante pour voir les journaux qui utilisent la ligne de commande.

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

La sortie suivante montre le type de réponse de la commande 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

Nettoyer les ressources

Félicitations ! Vous avez terminé le tutoriel. Si vous souhaitez supprimer les ressources créées dans le cadre de cette procédure pas à pas, exécutez la commande suivante.

Attention

Cette commande supprime le groupe de ressources spécifié et toutes les ressources qu’il contient. Si des ressources en dehors du cadre de ce tutoriel existent dans le groupe de ressources spécifié, elles seront également supprimées.

az group delete --resource-group $RESOURCE_GROUP

Remarque

Étant donné que pythonapp effectue continuellement des appels à nodeapp avec des messages qui sont conservés dans votre magasin d’état configuré, il est important d’effectuer ces étapes de nettoyage pour éviter que des opérations ne vous soient facturées.

Conseil

Vous rencontrez des problèmes ? Faites-le nous savoir sur GitHub en ouvrant un problème dans le dépôt Azure Container Apps.

Étapes suivantes