Tutorial: Bereitstellen einer Dapr-Anwendung in Azure Container Apps mithilfe der Azure CLI

Dapr (Distributed Application Runtime) hilft Entwicklern, resiliente, zuverlässige Microservices zu erstellen. In diesem Tutorial wird eine Dapr-Beispielanwendung in Azure Container Apps bereitgestellt.

Folgendes wird vermittelt:

  • Erstellen einer Container Apps-Umgebung für Ihre Container-Apps
  • Erstellen eines Azure Blob Storage Zustandsspeichers für die Container-App
  • Bereitstellen von zwei Apps, die Nachrichten erzeugen und nutzen und sie mithilfe des Zustandsspeichers speichern
  • Überprüfen Sie die Interaktion zwischen den beiden Microservices.

Mit Azure Container Apps erhalten Sie eine vollständig verwaltete Version der Dapr-APIs beim Erstellen von Microservices. Wenn Sie Dapr in Azure Container Apps verwenden, können Sie Sidecars für die Ausführung neben Ihren Microservices aktivieren, die einen umfangreichen Satz von Funktionen bieten. Zu den verfügbaren Dapr-APIs gehören Dienst-zu-Dienst-Aufrufe, Pub/Sub, Ereignisbindungen, Zustandsspeicher und Akteure.

In diesem Tutorial stellen Sie dieselben Anwendungen bereit wie in der Schnellstartversion von Dapr Hello World.

Die Anwendung besteht aus Folgendem:

  • Eine Clientcontainer-App (Python) zum Generieren von Nachrichten.
  • Eine Dienstcontainer-App (Node) zum Nutzen und dauerhaften Speichern dieser Nachrichten in einem Zustandsspeicher.

Das folgende Architekturdiagramm veranschaulicht die Komponenten, aus denen sich dieses Tutorial zusammensetzt:

Architecture diagram for Dapr Hello World microservices on Azure Container Apps

Setup

Melden Sie sich zunächst bei Azure an. Führen Sie den folgenden Befehl aus, und befolgen Sie die Anweisungen, um den Authentifizierungsprozess abzuschließen.

az login

Installieren Sie als Nächstes die Azure Container Apps-Erweiterung für die CLI.

az extension add --name containerapp --upgrade

Die aktuelle Erweiterung oder das aktuelle Modul wurde installiert. Registrieren Sie nun den Namespace Microsoft.App.

Hinweis

Azure Container Apps-Ressourcen wurden vom Microsoft.Web-Namespace zum Microsoft.App-Namespace migriert. Weitere Informationen finden Sie unter Namespacemigration von Microsoft.Web zu Microsoft.App im März 2022.

az provider register --namespace Microsoft.App

Registrieren Sie den Anbieter Microsoft.OperationalInsights für den Azure Monitor Log Analytics-Arbeitsbereich, falls Sie ihn bisher noch nicht verwendet haben.

az provider register --namespace Microsoft.OperationalInsights

Legen Sie anschließend die folgenden Umgebungsvariablen fest:

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

Wenn diese Variablen definiert sind, können Sie eine Ressourcengruppe erstellen, um die Dienste zu organisieren, die mit Ihrer neuen Container-App verknüpft sind.

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

Wenn die CLI aktualisiert wurde und eine neue Ressourcengruppe verfügbar ist, können Sie eine Container Apps-Umgebung erstellen und Ihre Container-App bereitstellen.

Erstellen einer Umgebung

Eine Umgebung in Azure Container Apps erstellt eine sichere Grenze für eine Gruppe von Container-Apps. Container-Apps, die in derselben Umgebung bereitgestellt werden, werden im gleichen virtuellen Netzwerk bereitgestellt und schreiben Protokolle in denselben Log Analytics-Arbeitsbereich.


Einzelne Container-Apps werden in einer Azure Container Apps-Umgebung bereitgestellt. Führen Sie den folgenden Befehl aus, um die Umgebung zu erstellen:

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

Einrichten eines Zustandsspeichers

Erstellen eines Azure Blob Storage-Kontos

Mit der bereitgestellten Umgebung besteht der nächste Schritt darin, ein Azure Blob Storage-Konto bereitzustellen, das von einem der Microservices zum Speichern von Daten verwendet wird. Bevor Sie den Dienst bereitstellen, müssen Sie einen Namen für das Speicherkonto auswählen. Speicherkontonamen müssen innerhalb von Azure eindeutig und zwischen 3 und 24 Zeichen lang sein und dürfen nur Zahlen und Kleinbuchstaben enthalten.

STORAGE_ACCOUNT_NAME="<storage account name>"

Verwenden Sie den folgenden Befehl, um das Azure-Speicherkonto zu erstellen.

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

Konfigurieren einer benutzerseitig zugewiesenen Identität für die Knoten-App

Während Container Apps sowohl benutzerseitig als auch systemseitig zugewiesene verwaltete Identitäten unterstützt, stellt eine benutzerseitig zugewiesene Identität der Dapr-aktivierten Knoten-App Berechtigungen zum Zugriff auf das Blobspeicherkonto bereit.

  1. Erstellen Sie eine benutzerseitig zugewiesene Identität.
az identity create --resource-group $RESOURCE_GROUP --name "nodeAppIdentity" --output json

Rufen Sie die Eigenschaften principalId und id ab, und speichern Sie sie in Variablen.

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. Weisen Sie die Rolle Storage Blob Data Contributor der benutzerseitig zugewiesenen Identität zu.

Rufen Sie die Abonnement-ID für Ihr aktuelles Abonnement ab.

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"

Konfigurieren der Zustandsspeicherkomponente

Es gibt mehrere Möglichkeiten, sich über Dapr bei externen Ressourcen zu authentifizieren. In diesem Beispiel wird die Dapr-Geheimnisse-API zur Laufzeit nicht verwendet, sondern ein Azure-basierter Zustandsspeicher. Daher können Sie auf das Erstellen einer Geheimnisspeicherkomponente verzichten und stattdessen direkten Zugriff von der Knoten-App auf den Blobspeicher mithilfe einer verwalteten Identität bereitstellen. Wenn Sie einen Nicht-Azure-Zustandsspeicher oder die Dapr-Geheimnisse-API zur Laufzeit verwenden möchten, könnten Sie eine Geheimnisspeicherkomponente erstellen. Diese Komponente würde Laufzeitgeheimnisse laden, damit Sie zur Laufzeit auf diese verweisen können.

Öffnen Sie einen Text-Editor, und erstellen Sie eine Konfigurationsdatei namens statestore.yaml mit den Eigenschaften, die Sie aus den vorherigen Schritten bezogen haben. Mit dieser Datei kann Ihre Dapr-App auf Ihren Zustandsspeicher zugreifen. Im folgenden Beispiel wird gezeigt, wie Ihre Datei mit dem Namen statestore.yaml aussehen sollte, wenn sie für Ihr Azure Blob Storage-Konto konfiguriert ist:

# 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

Um diese Datei zu verwenden, aktualisieren Sie die Platzhalter:

  • Ersetzen Sie <STORAGE_ACCOUNT_NAME> durch den Wert der von Ihnen definierten Variable STORAGE_ACCOUNT_NAME. Führen Sie den folgenden Befehl aus, um den Wert abzurufen:
echo $STORAGE_ACCOUNT_NAME
  • Ersetzen Sie <MANAGED_IDENTITY_CLIENT_ID> durch den Wert der von Ihnen definierten Variable CLIENT_ID. Führen Sie den folgenden Befehl aus, um den Wert abzurufen:
echo $CLIENT_ID

Navigieren Sie zu dem Verzeichnis, in dem Sie die YAML-Komponentendatei gespeichert haben, und führen Sie den folgenden Befehl aus, um die Dapr-Komponente in der Container Apps-Umgebung zu konfigurieren. Weitere Informationen zum Konfigurieren von Dapr-Komponenten finden Sie unter Konfigurieren von Dapr-Komponenten.

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

Bereitstellen der Dienstanwendung (HTTP-Webserver)

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'

Standardmäßig wird das Bild von Docker Hub gepullt.

Bereitstellen der Clientanwendung (Kopfloser Client)

Führen Sie den folgenden Befehl aus, um die Clientcontainer-App bereitzustellen.

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

Überprüfen der Ergebnisse

Bestätigen der erfolgreichen Zustandspersistenz

Sie können überprüfen, ob die Dienste ordnungsgemäß funktionieren, indem Sie Daten in Ihrem Azure-Speicherkonto anzeigen.

  1. Öffnen Sie das Azure-Portal in Ihrem Browser, und navigieren Sie zu Ihrem Speicherkonto.

  2. Wählen Sie im Menü auf der linken Seite Container aus.

  3. Wählen Sie MyContainer.

  4. Vergewissern Sie sich, dass die Datei mit dem Namen order im Container angezeigt wird.

  5. Wählen Sie die Datei aus.

  6. Wählen Sie die Registerkarte Bearbeiten aus.

  7. Wählen Sie die Schaltfläche Aktualisieren aus, um zu sehen, wie die Daten automatisch aktualisiert werden.

Protokolle anzeigen

Protokolle aus Container-Apps werden in der benutzerdefinierten Tabelle ContainerAppConsoleLogs_CL im Log Analytics-Arbeitsbereich gespeichert. Sie können Protokolle über das Azure-Portal oder mithilfe der CLI anzeigen. Möglicherweise kommt es bei der Anzeige der Tabelle im Arbeitsbereich anfangs zu einer kleinen Verzögerung.

Verwenden Sie den folgenden CLI-Befehl, um Protokolle über die Befehlszeile anzuzeigen.

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

Die folgende Ausgabe veranschaulicht den Typ der Antwort, die vom CLI-Befehl erwartet wird.

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

Bereinigen von Ressourcen

Herzlichen Glückwunsch! Sie haben dieses Tutorial abgeschlossen. Wenn Sie die im Rahmen dieser exemplarischen Vorgehensweise erstellten Ressourcen löschen möchten, führen Sie den folgenden Befehl aus.

Achtung

Mit diesem Befehl werden die angegebene Ressourcengruppe und alle darin enthaltenen Ressourcen gelöscht. Falls in der angegebenen Ressourcengruppe Ressourcen enthalten sind, die nicht zum Umfang dieses Tutorials gehören, werden sie ebenfalls gelöscht.

az group delete --resource-group $RESOURCE_GROUP

Hinweis

Da pythonapp kontinuierlich Aufrufe von nodeapp mit Nachrichten vornimmt, die in Ihrem konfigurierten Zustandsspeicher gespeichert werden, ist es wichtig, diese Bereinigungsschritte auszuführen, um laufende abrechenbare Vorgänge zu vermeiden.

Tipp

Treten Probleme auf? Informieren Sie uns über GitHub, indem Sie ein Problem im Azure Container Apps-Repository öffnen.

Nächste Schritte