Konfigurieren der Veröffentlichung von Durable Functions zu Azure Event Grid

Das Veröffentlichen von Orchestrierungslebenszyklusereignissen für Azure Event Grid ermöglicht die DevOps-Automatisierung (z. B. blaue/grüne Bereitstellungen), Echtzeitüberwachungsdashboards und das Nachverfolgen langer Hintergrundprozesse.

Hinweis

In diesem Handbuch werden .NET Beispiele verwendet, aber die Konzepte und Azure CLI Befehle gelten für alle unterstützten Durable Functions Sprachen.

Tipp

Wenn Sie bereits ein benutzerdefiniertes Ereignisrasterthema und eine verwaltete Identität konfiguriert haben, fahren Sie mit Configure der Durable Functions Publisher-App fort.

Voraussetzungen

  • Ein Durable Functions Projekt, das für Azure bereitgestellt wird. Wenn Sie keins haben, erstellen Sie eins mithilfe der Schnellstartanleitung für Ihre bevorzugte Sprache:

  • Die richtige Durable Functions Erweiterungsversion. Aktualisieren Sie ihre Erweiterung für .NET auf die neueste Version:

    • 2.7.0+ (prozessintern)

      dotnet add package Microsoft.Azure.WebJobs.Extensions.DurableTask
      
    • 1.1.0+ (isolierter Arbeitnehmer)

      dotnet add package Microsoft.Azure.Functions.Worker.Extensions.DurableTask
      

    Überprüfen Sie für andere Sprachen Ihre package.json, , requirements.txt, pom.xmloder requirements.psd1.

  • In Ihrer Funktions-App ist die verwaltete Identität aktiviert und konfiguriert.

  • Ein aktiver Speicheranbieter oder der lokale Azurite-Speicheremulator.

  • Azure CLI oder Azure Cloud Shell.

  • Ein HTTP-Testtool , das Ihre Daten sicher hält.

Erstellen eines benutzerdefinierten Ereignisrasterthemas

Sie können ein Ereignisrasterthema zum Senden von Ereignissen aus Durable Functions erstellen, indem Sie the Azure CLI, PowerShell oder the Azure portal verwenden.

In diesem Leitfaden wird die Azure CLI verwendet.

Erstellen einer Ressourcengruppe

Erstellen Sie mit dem Befehl az group create eine Ressourcengruppe. Wählen Sie einen Standort aus, der Event Grid unterstützt und mit dem Ort übereinstimmt, an dem Sie Ihre Ressourcen bereitstellen möchten.

Hinweis

Derzeit unterstützt Azure Event Grid nicht alle Regionen. Informationen dazu, welche Regionen unterstützt werden, finden Sie in der Azure Event Grid-Übersicht.

az group create --name <resource-group-name> --location <location>

Aktivieren des Event Grid-Ressourcenanbieters

  1. Wenn Sie "Event Grid" zum ersten Mal in Ihrem Azure-Abonnement verwenden, müssen Sie möglicherweise den Event Grid-Ressourcenanbieter registrieren. Führen Sie den folgenden Befehl aus, um den Anbieter zu registrieren:

    az provider register --namespace Microsoft.EventGrid
    
  2. Es kann einen Moment dauern, bis die Registrierung abgeschlossen ist. Führen Sie den folgenden Befehl aus, um den Status zu überprüfen:

    az provider show --namespace Microsoft.EventGrid --query "registrationState"
    

    Wenn registrationStateRegistered ist, können Sie den Vorgang fortsetzen.

Erstellen eines benutzerdefinierten Themas

Ein Ereignisrasterthema stellt einen benutzerdefinierten Endpunkt bereit, auf den Sie Ihr Ereignis bereitstellen. Ersetzen Sie <topic-name> im folgenden Befehl durch einen eindeutigen Namen für Ihr Thema. Der Themenname muss eindeutig sein, da er zu einem DNS-Eintrag wird.

az eventgrid topic create --name <topic-name> --location <location> --resource-group <resource-group-name>

Abrufen des Themenendpunkts

Rufen Sie den Endpunkt des Themas ab. Ersetzen Sie <topic-name> in den folgenden Befehlen durch den von Ihnen gewählten Namen.

az eventgrid topic show --name <topic-name> --resource-group <resource-group-name> --query "endpoint" --output tsv

Speichern Sie diesen Endpunkt für später.

Verwaltete Identitäten in Azure ermöglichen es Ressourcen, sich bei Azure-Diensten zu authentifizieren, ohne Zugangsdaten zu speichern, was die Sicherheits- und Identitätsverwaltung vereinfacht. Weisen Sie dem benutzerdefinierten Event Grid-Thema die verwaltete Identität zu, die mit Ihrer Durable Function-App verknüpft ist.

Konfigurieren der Durable Functions Publisher-App

Obwohl Ihre Durable Functions-App automatisch Orchestrierungslebenszyklusereignisse im Event Grid veröffentlicht, müssen Sie die Verbindungseinstellungen konfigurieren. Fügen Sie den folgenden Abschnitt extensions.durableTask in Ihren host.json Abschnitt hinzu.

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "eventGridTopicEndpoint": "%EventGrid__topicEndpoint%",
      "eventGridKeySettingName": "EventGrid__credential"
    }
  }
}

Hinweis

Die eventGridTopicEndpoint Einstellung verweist auf den benutzerdefinierten Themenendpunkt des Ereignisrasters, den Sie zuvor gespeichert haben. Die Anmeldeinformationseinstellung deckt sowohl Szenarien mit verwalteter Identität als auch mit Verbindungszeichenfolgen ab.

Rolle "Ereignisrasterdaten-Absender zuweisen"

Erteilen Sie Ihrer verwalteten Identität die Berechtigung zum Publizieren von Ereignissen für das Thema "Event Grid".

az role assignment create \
  --assignee <client-id-of-managed-identity> \
  --assignee-principal-type ServicePrincipal \
  --role "EventGrid Data Sender" \
  --scope /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.EventGrid/topics/<topic-name>

Ersetzen Sie die folgenden Werte:

  • <client-id-of-managed-identity>: Die Client-ID Ihrer vom Benutzer zugewiesenen verwalteten Identität
  • <subscription-id>: Ihre Azure-Abonnement-ID
  • <resource-group-name>: Der Name der Ressourcengruppe, die Ihr Ereignisrasterthema enthält
  • <topic-name>: Der Name Ihres Event Grid-Themas

Hinweis

Rollenzuweisungen können 5 bis 10 Minuten dauern, bis sie verteilt werden. Möglicherweise werden Authentifizierungsfehler angezeigt, wenn Sie unmittelbar nach der Zuweisung fortfahren.

Konfigurieren von App-Einstellungen

Nachdem Sie die verwaltete Identität für Ihre Funktions-App und Ihr Thema aktiviert haben, konfigurieren Sie die Ereignisraster-App-Einstellungen in Ihrer Durable Functions Funktions-App.

Fügen Sie die folgenden App-Einstellungen hinzu:

  • EventGrid__topicEndpoint – der Themenendpunkt des Ereignisrasters.
  • EventGrid__credential — auf managedidentity.
  • EventGrid__clientId — die vom Benutzer zugewiesene verwaltete Identitätsclient-ID.
az functionapp config appsettings set --name <function app name> --resource-group <resource group name> --settings EventGrid__topicEndpoint="<topic endpoint>" EventGrid__credential="managedidentity" EventGrid__clientId="<client id>"

Abonnieren von Ereignissen

Um die veröffentlichten Lebenszyklusereignisse zu erhalten, erstellen Sie ein Event Grid-Abonnement , das Ereignisse von Ihrem benutzerdefinierten Thema an einen Abonnenten weiter leitet. Allgemeine Abonnententypen umfassen Azure-Funktionen (mit einem Event-Grid-Trigger), Logic-Apps und Webhooks.

Im folgenden Beispiel wird eine Subscriber-Funktions-App mit einem Event Grid-Trigger mithilfe des Azure CLI erstellt. Wenn Sie bereits über einen Abonnenten verfügen, fahren Sie mit dem Erstellen eines Event Grid-Abonnements fort.

Erstellen einer Listener-Funktions-App

Erstellen Sie eine Funktions-App zum Hosten des Ereignisrastertriggers. Der Listener muss sich in derselben Region wie das Thema "Ereignisraster" befinden.

# Create a resource group
az group create --name <listener-resource-group-name> --location <location>

# Create a storage account
az storage account create \
  --name <storage-account-name> \
  --resource-group <listener-resource-group-name> \
  --location <location> \
  --sku Standard_LRS \
  --allow-blob-public-access false

# Create the function app
az functionapp create \
  --resource-group <listener-resource-group-name> \
  --consumption-plan-location <location> \
  --runtime <preferred-runtime> \
  --functions-version 4 \
  --name <listener-function-app-name> \
  --storage-account <storage-account-name>

Erstellen und Bereitstellen einer Ereignisrastertriggerfunktion

Erstellen Sie ein Gerüst für ein lokales Projekt, fügen Sie einen Ereignisrastertrigger hinzu, und veröffentlichen Sie es:

mkdir EventGridListenerFunction && cd EventGridListenerFunction
func init --name EventGridListener --runtime dotnet-isolated
func new --template "Event Grid trigger" --name EventGridTrigger
func azure functionapp publish <listener-function-app-name>

Hinweis

Ersetzen Sie sie dotnet-isolated durch Ihre bevorzugte Laufzeit (node, python, javaoder powershell). Ausführliche Bereitstellungsanweisungen finden Sie unter Publish to Azure.

Erstellen eines Event Grid-Abonnements

Erstellen Sie das Abonnement mithilfe des azurefunction Endpunkttyps, der die Webhook-Überprüfung automatisch behandelt:

az eventgrid event-subscription create \
  --name <subscription-name> \
  --source-resource-id /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.EventGrid/topics/<topic-name> \
  --endpoint /subscriptions/<subscription-id>/resourceGroups/<listener-resource-group-name>/providers/Microsoft.Web/sites/<listener-function-app-name>/functions/EventGridTrigger \
  --endpoint-type azurefunction

Tipp

Die Verwendung --endpoint-type azurefunction mit der Ressourcen-ID der Funktion ist der empfohlene Ansatz. Sie verarbeitet automatisch die Webhook-Validierung und ist zuverlässiger als die Verwendung --endpoint-type webhook mit einer URL.

Ereignisschema

Wenn sich ein Orchestrierungsstatus ändert, veröffentlicht die Durable Functions Laufzeit ein Ereignis mit der folgenden Struktur. Ereignisse werden für jeden Zustandsübergang automatisch generiert – Sie müssen keinen Code hinzufügen.

Feld Beschreibung
id Eindeutiger Bezeichner für das Ereignis "Event Grid".
subject durable/orchestrator/{orchestrationRuntimeStatus} — der Status kann sein Running, , Completed, Failedoder Terminated.
eventType Immer orchestratorEvent.
eventTime Ereigniszeit (UTC).
data.hubName TaskHub-Name
data.functionName Orchestrator-Funktionsname.
data.instanceId Eindeutige Orchestrierungsinstanz-ID.
data.runtimeStatus Running, Completed, Failed, oder Canceled.
data.reason Zusätzliche Nachverfolgungsdaten. Weitere Informationen finden Sie unter Diagnostics in Durable Functions.

Das Ereignisraster stellt mindestens einmal die Übermittlung sicher, sodass Sie in seltenen Fehlerszenarien doppelte Ereignisse erhalten können. Erwägen Sie ggf. das Hinzufügen der Deduplizierungslogik mithilfe von instanceId.

Überprüfen der Ereignisübermittlung

Um das End-to-End-Setup zu überprüfen, stellen Sie Ihre Durable Functions-App bereit, und lösen Sie eine Orchestrierung aus:

  1. Veröffentlichen Sie den Funktionscode nach Azure und überprüfen Sie, ob Ihre Funktions-App im Azure-Portal "Wird ausgeführt" anzeigt.

  2. Überprüfen Sie im Azure Portal ihre App-Einstellungen unter Settings>Environment-VariablenEventGrid__topicEndpoint und (wenn verwaltete Identität verwendet wird) EventGrid__credential.

  3. Auslösen einer Orchestrierung mithilfe eines HTTP-Clients:

    curl -X POST https://<function_app_name>.azurewebsites.net/api/HelloOrchestration_HttpStart
    
  4. Navigieren Sie im Azure-Portal zu Ihrer listener-Funktions-App>EventGridTrigger>Monitor, um empfangene Ereignisse anzuzeigen. Sie sollten Ereignisse mit Betreffzeilen wie durable/orchestrator/Running und durable/orchestrator/Completed sehen.

Überprüfen in Application Insights (optional)

Um eine umfassendere Ansicht zu erhalten, führen Sie diese KQL-Abfrage in den Anwendungseinblickprotokollen Ihrer Funktions-App aus:

traces
| where message contains "Event type" or message contains "Event subject"
| project timestamp, message
| order by timestamp desc

Problembehandlung

Ereignisse werden nicht im Ereignisraster veröffentlicht

Problem: Die Listenerfunktion empfängt keine Ereignisse.

Lösungen:

  • Überprüfen Sie, ob die Durable Functions-Funktions-App über die richtigen App-Einstellungen verfügt:
    • EventGrid__topicEndpoint muss auf Ihren benutzerdefinierten Themenendpunkt verweisen
    • EventGrid__credential muss auf managedidentity festgelegt werden.
    • EventGrid__clientId muss festgelegt werden, wenn eine vom Benutzer zugewiesene Identität verwendet wird
  • Stellen Sie sicher, dass der verwalteten Identität die Rolle "EventGrid Data Sender" dem benutzerdefinierten Event Grid-Thema zugewiesen ist.
  • Überprüfen Sie die Protokolle der Funktions-App von Durable Functions in Application Insights auf Fehler.
  • Überprüfen Sie, ob das Thema "Ereignisraster" vorhanden ist und im selben Abonnement zugänglich ist.

Listener-Funktion wird nicht ausgelöst

Problem: Die Listenerfunktion ist vorhanden, wird aber nicht ausgeführt, wenn Ereignisse veröffentlicht werden.

Lösungen:

  • Überprüfen Sie, ob das Ereignisrasterabonnement erstellt wurde und aktiviert ist:
    • Navigieren Sie im Azure-Portal zu Ihrem Ereignisrasterthema → Subscriptions
    • Bestätigen Sie, dass das Abonnement Ihrer Listenerfunktion mit dem Status "Aktiviert" aufgeführt ist.
  • Überprüfen Sie, ob das Ereignisrasterabonnement den richtigen Endpunkttyp verwendet:
    • Verwenden Sie für Azure Functions --endpoint-type azurefunction mit der Ressourcen-ID der Funktion.
    • Stellen Sie bei Verwendung --endpoint-type webhooksicher, dass die Webhook-URL das richtige Format aufweist: https://<function-app>.azurewebsites.net/runtime/webhooks/eventgrid?functionName=<function-name>&code=<system-key>
  • Überprüfen Sie die Protokolle der Listener-Funktions-App auf Fehler oder Übermittlungsprobleme.
  • Überprüfen Sie im Thema "Ereignisraster" → Metriken auf verworfene Ereignisse , die auf Übermittlungsfehler hinweisen können.

Fehler "Verboten" oder Authentifizierung in Protokollen

Problem: Authentifizierungsfehler beim Veröffentlichen im Ereignisraster.

Lösungen:

  • Überprüfen Sie, ob die verwaltete Identität ordnungsgemäß konfiguriert und in der Durable Functions-Funktions-App aktiviert ist:
    • Navigieren Sie im Azure-Portal zu Ihrer Funktions-App → Identity
    • „Status“ sicherstellen zeigt Ein für entweder vom System zugewiesene oder vom Benutzer zugewiesene Identität
  • Überprüfen Sie, ob die Rollenzuweisung korrekt ist:
    • Navigieren Sie zu Ihrem Ereignisrasterthema → Access Control (IAM)
    • Bestätigen Sie, dass Ihre verwaltete Identität über die Rolle "EventGrid Data Sender " verfügt (Hinweis: kein Leerzeichen zwischen "Event" und "Grid")
    • Die Rollenzuweisung kann 5-10 Minuten dauern, um sich zu verbreiten.

Fehler "Verbindung verweigert" oder "Endpunkt nicht gefunden"

Problem: Verbindungsfehler mit dem Ereignisrasterthema.

Lösungen:

  • Überprüfen Sie, ob der Themenendpunkt "Ereignisraster" in ihren App-Einstellungen korrekt ist und die vollständige URL enthält (z. B https://my-topic.eventgrid.azure.net/api/events. )
  • Überprüfen, ob die Event Grid-Themenressource im selben Abonnement und derselben Region vorhanden ist
  • Überprüfen Sie, ob Ihre Durable Functions-App Netzwerkzugriff auf den Event Grid-Endpunkt hat.

Lokales Testen

Informationen zum lokalen Testen finden Sie unter "Lokale Tests mit Viewer-Web-App". Verwenden Sie beim lokalen Testen mit verwalteter Identität Ihre Entwickleranmeldeinformationen, um sich beim Thema "Event Grid" zu authentifizieren. Weitere Informationen finden Sie unter Configure Durable Functions mit verwalteter Identität – lokale Entwicklung.

Bereinigen von Ressourcen

Wenn Sie die in diesem Lernprogramm erstellten Ressourcen nicht weiter verwenden werden, löschen Sie sie, um Gebühren zu vermeiden.

Löschen der Ressourcengruppen

Löschen Sie sowohl Ressourcengruppen als auch alle darin enthaltenen Ressourcen:

az group delete --name <resource-group-name> --yes
az group delete --name <listener-resource-group-name> --yes

Löschen einzelner Ressourcen

Wenn Sie einige Ressourcen beibehalten möchten, können Sie sie einzeln löschen:

  1. Löschen sie das Ereignisrasterabonnement:

    az eventgrid event-subscription delete \
      --name <subscription-name> \
      --source-resource-id /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.EventGrid/topics/<topic-name>
    
  2. Löschen sie das Thema "Ereignisraster":

    az eventgrid topic delete --name <topic-name> --resource-group <resource-group-name>
    
  3. Löschen Sie die Funktions-Apps:

    az functionapp delete --name <publisher-function-app-name> --resource-group <resource-group-name>
    az functionapp delete --name <listener-function-app-name> --resource-group <listener-resource-group-name>
    
  4. Löschen Sie die Speicherkonten:

    az storage account delete --name <storage-account-name> --resource-group <resource-group-name> --yes
    az storage account delete --name <listener-storage-account-name> --resource-group <listener-resource-group-name> --yes
    

Nächste Schritte

Weitere Informationen zu: