Het configureren van het publiceren van Durable Functions naar Azure Event Grid

Het publiceren van levenscyclusgebeurtenissen voor indelingen naar Azure Event Grid maakt DevOps-automatisering (zoals blauw/groene implementaties), realtime bewakingsdashboards en het bijhouden van langlopende achtergrondprocessen mogelijk.

Opmerking

In deze handleiding worden .NET voorbeelden gebruikt, maar de concepten en Azure CLI opdrachten zijn van toepassing op alle ondersteunde Durable Functions talen.

Aanbeveling

Als u al een aangepast Event Grid-onderwerp en een beheerde identiteit hebt geconfigureerd, gaat u naar Configure the Durable Functions publisher app.

Vereiste voorwaarden

Een aangepast Event Grid-onderwerp maken

U kunt een Event Grid-onderwerp maken voor het verzenden van gebeurtenissen vanuit Durable Functions met behulp van the Azure CLI, PowerShell of de Azure portal.

In deze handleiding wordt de Azure CLI gebruikt.

Een brongroep maken

Maak een resourcegroep met de opdracht az group create. Kies een locatie die Ondersteuning biedt voor Event Grid en komt overeen met de locatie waar u uw resources wilt implementeren.

Opmerking

Op dit moment biedt Azure Event Grid geen ondersteuning voor alle regio's. Zie het overzicht van Azure Event Grid voor informatie over welke regio's worden ondersteund.

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

De Event Grid-resourceprovider inschakelen

  1. Als dit de eerste keer is dat u Event Grid in uw Azure-abonnement gebruikt, moet u mogelijk de Event Grid-resourceprovider registreren. Voer de volgende opdracht uit om de provider te registreren:

    az provider register --namespace Microsoft.EventGrid
    
  2. Het kan even duren voordat de registratie is voltooid. Voer de volgende opdracht uit om de status te controleren:

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

    Wanneer registrationStateRegistered is, bent u klaar om door te gaan.

Een aangepast onderwerp maken

Een Event Grid-onderwerp biedt een door de gebruiker gedefinieerd eindpunt waarnaar u uw gebeurtenis post. Vervang <topic-name> in de volgende opdracht door een unieke naam voor uw onderwerp. De onderwerpnaam moet uniek zijn omdat deze een DNS-vermelding wordt.

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

Het onderwerpeindpunt ophalen

Haal het eindpunt van het onderwerp op. Vervang <topic-name> in de volgende opdrachten door de naam die u hebt gekozen.

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

Sla dit eindpunt op voor later gebruik.

Met beheerde identiteiten in Azure kunnen resources zich authentiseren bij Azure-services zonder dat referenties hoeven te worden opgeslagen, waardoor beveiliging en identiteitsbeheer eenvoudiger worden. Wijs de beheerde identiteit die is gekoppeld aan uw Durable Function-app toe aan het aangepaste Event Grid-onderwerp.

De Durable Functions publisher-app configureren

Hoewel uw Durable Functions-app automatisch orkestratielevenscyclusevenementen in Event Grid publiceert, moet u de verbindingsinstellingen configureren. Voeg het volgende toe aan de extensions.durableTask sectie in uw host.json:

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

Opmerking

De eventGridTopicEndpoint instelling verwijst naar het eindpunt van het aangepaste Event Grid-onderwerp dat u eerder hebt opgeslagen. De referentie-instelling verwerkt zowel beheerde identiteit als verbindingsreeks scenario's.

Rol Event Grid-gegevenszender toewijzen

Verleen uw beheerde identiteit toestemming om gebeurtenissen naar het Event Grid-topic te publiceren.

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>

Vervang de volgende waarden:

  • <client-id-of-managed-identity>: De client-id van uw door de gebruiker toegewezen beheerde identiteit
  • <subscription-id>: uw Azure-abonnements-id
  • <resource-group-name>: De naam van de resourcegroep met het Event Grid-onderwerp
  • <topic-name>: De naam van uw Event Grid-onderwerp

Opmerking

Het kan 5 tot 10 minuten duren voordat roltoewijzingen zijn doorgegeven. Mogelijk ziet u verificatiefouten als u direct na de toewijzing doorgaat.

App-instellingen configureren

Zodra u beheerde identiteit voor uw functie-app en onderwerp hebt ingeschakeld, configureert u de Event Grid-app-instellingen in uw Durable Functions functie-app.

Voeg de volgende app-instellingen toe:

  • EventGrid__topicEndpoint — het Event Grid-onderwerpeindpunt.
  • EventGrid__credential — ingesteld op managedidentity.
  • EventGrid__clientId — de client-id van een door de gebruiker toegewezen beheerde identiteit.
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>"

Abonneren op gebeurtenissen

Als u de gepubliceerde levenscyclus-gebeurtenissen wilt ontvangen, maakt u een Event Grid-abonnement waarmee gebeurtenissen van uw aangepaste onderwerp worden gerouteerd naar een abonnee. Veelvoorkomende abonneetypen zijn Azure Functions (met een Event Grid-trigger), Logic Apps en webhooks.

In het volgende voorbeeld wordt een abonneefunctie-app gemaakt met een Event Grid-trigger met behulp van de Azure CLI. Als u al een abonnee hebt, gaat u verder met het maken van een Event Grid-abonnement.

Een listener-functie-app maken

Maak een functie-app om de Event Grid-trigger te hosten. De listener moet zich in dezelfde regio bevinden als het Event Grid-onderwerp.

# 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>

Een Event Grid-triggerfunctie maken en implementeren

Een lokaal project opzetten, een Event Grid-trigger toevoegen en publiceren:

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>

Opmerking

Vervang door dotnet-isolated uw voorkeursruntime (node, python, javaof powershell). Zie Publicatie naar Azure voor gedetailleerde implementatie-instructies.

Een Event Grid-abonnement maken

Maak het abonnement met behulp van het azurefunction-eindpunttype, dat webhookvalidatie automatisch afhandelt.

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

Aanbeveling

Het gebruik --endpoint-type azurefunction met de resource-id van de functie is de aanbevolen benadering. Webhookvalidatie wordt automatisch verwerkt en is betrouwbaarder dan het gebruik van --endpoint-type webhook met een URL.

Gebeurtenisschema

Wanneer de toestand van een orkestratie verandert, publiceert de Durable Functions-runtime een gebeurtenis met de volgende structuur. Gebeurtenissen worden automatisch gegenereerd voor elke statusovergang. U hoeft geen code toe te voegen.

Veld Beschrijving
id Unieke id voor de Event Grid-gebeurtenis.
subject durable/orchestrator/{orchestrationRuntimeStatus}— de status kan Runningzijn, Completedof FailedTerminated.
eventType Altijd orchestratorEvent.
eventTime Tijd van gebeurtenis (UTC).
data.hubName TaskHub-naam .
data.functionName De naam van de Orchestrator-functie.
data.instanceId Unieke orkestratie-instantie-ID.
data.runtimeStatus Running, Completed, Failed of Canceled.
data.reason Aanvullende traceringsgegevens. Zie Diagnostics in Durable Functions voor meer informatie.

Event Grid zorgt voor ten minste één levering, dus u kunt dubbele gebeurtenissen ontvangen in zeldzame foutscenario's. Overweeg indien nodig ontdubbelingslogica instanceId toe te voegen.

Gebeurtenislevering verifiëren

Om de end-to-end-installatie te verifiëren, implementeer uw Durable Functions-app en activeer een orkestratie.

  1. Publiceer de functiecode naar Azure en controleer of de functie-app wordt uitgevoerd in de Azure-portal.

  2. Controleer in de Azure-portal uw app-instellingen onder Settings>OmgevingsvariabelenEventGrid__topicEndpoint en (indien met beheerde identiteit) EventGrid__credential.

  3. Een orkestratie activeren met behulp van een HTTP-client:

    curl -X POST https://<function_app_name>.azurewebsites.net/api/HelloOrchestration_HttpStart
    
  4. Navigeer in de Azure-portal naar de functie-app listener>EventGridTrigger>Monitor om ontvangen gebeurtenissen weer te geven. U zou gebeurtenissen met onderwerpen zoals durable/orchestrator/Running en durable/orchestrator/Completed moeten zien.

Controleren in Application Insights (optioneel)

Voor een uitgebreider overzicht voert u deze KQL-query uit in de Application Insights Logs voor uw functie-app:

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

Troubleshooting

Gebeurtenissen worden niet gepubliceerd naar Event Grid

Probleem: de listenerfunctie ontvangt geen gebeurtenissen.

Oplossingen:

  • Controleer of de Durable Functions functie-app de juiste app-instellingen heeft:
    • EventGrid__topicEndpoint moet verwijzen naar uw aangepaste onderwerpeindpunt
    • EventGrid__credential moet zijn ingesteld op managedidentity
    • EventGrid__clientId moet worden ingesteld als u een door de gebruiker toegewezen identiteit gebruikt
  • Controleer of voor de beheerde identiteit de rol EventGrid-gegevenszender is toegewezen aan het aangepaste Event Grid-onderwerp.
  • Controleer de Durable Functions functie-app-logboeken in Application Insights op fouten.
  • Controleer of het Event Grid-onderwerp bestaat en toegankelijk is in hetzelfde abonnement.

De listenerfunctie wordt niet geactiveerd

Probleem: de listenerfunctie bestaat, maar wordt niet uitgevoerd wanneer gebeurtenissen worden gepubliceerd.

Oplossingen:

  • Controleer of het Event Grid-abonnement is gemaakt en is ingeschakeld:
    • Navigeer in de Azure-portal naar het Event Grid-onderwerp → Subscriptions
    • Controleer of het abonnement van uw listenerfunctie wordt vermeld met de status Ingeschakeld
  • Controleer of het Event Grid-abonnement het juiste eindpunttype gebruikt:
    • Gebruik voor Azure Functions --endpoint-type azurefunction met de resource-id van de functie
    • Als u deze hebt gebruikt --endpoint-type webhook, controleert u of de URL van de webhook de juiste indeling heeft: https://<function-app>.azurewebsites.net/runtime/webhooks/eventgrid?functionName=<function-name>&code=<system-key>
  • Controleer de logboeken van de listener-functie-app op fouten of leveringsproblemen.
  • Controleer in het Event Grid-onderwerp → metrische gegevens op verwijderde gebeurtenissen die kunnen duiden op bezorgingsfouten.

'Verboden' en verificatiefouten in logboeken

Probleem: verificatiefouten bij het publiceren naar Event Grid.

Oplossingen:

  • Controleer of de beheerde identiteit correct is geconfigureerd en ingeschakeld in de Durable Functions functie-app:
    • Navigeer in de Azure-portal naar uw functie-app → Identity
    • Bevestig dat "Status" Aan toont voor zowel systeemtoegewezen als gebruikers toegewezen identiteit
  • Controleer of de roltoewijzing juist is:
    • Navigeer naar het Event Grid-onderwerp → Access Control (IAM)
    • Controleer of uw beheerde identiteit de rol EventGrid-gegevenszender heeft (opmerking: geen spatie tussen 'Event' en 'Grid')
    • Het kan 5-10 minuten duren voordat de roltoewijzing is doorgegeven

Fouten 'Verbinding geweigerd' of 'eindpunt niet gevonden'

Probleem: Verbindingsfouten met het Event Grid-onderwerp.

Oplossingen:

  • Controleer of het Event Grid-onderwerpeindpunt in uw app-instellingen juist is en de volledige URL bevat (bijvoorbeeld https://my-topic.eventgrid.azure.net/api/events)
  • Controleer of de Event Grid-onderwerpresource bestaat in hetzelfde abonnement en dezelfde regio
  • Controleer of uw Durable Functions-app netwerktoegang heeft tot het Event Grid-eindpunt

Lokaal testen

Als u lokaal wilt testen, raadpleegt u Lokaal testen met de viewer-web-app. Wanneer u lokaal test met een beheerde identiteit, gebruikt u uw ontwikkelaarsreferenties om te autoriseren tegen het Event Grid-topic. Zie Configureer Durable Functions met beheerde identiteit - Lokale ontwikkeling voor meer informatie.

De hulpbronnen opschonen

Als u de resources die in deze zelfstudie zijn gemaakt niet meer gaat gebruiken, verwijdert u deze om kosten te voorkomen.

De resourcegroepen verwijderen

Verwijder zowel resourcegroepen als alle bijbehorende resources:

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

Afzonderlijke bronnen verwijderen

Als u bepaalde resources wilt behouden, kunt u ze afzonderlijk verwijderen:

  1. Het Event Grid-abonnement verwijderen:

    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. Het Event Grid-onderwerp verwijderen:

    az eventgrid topic delete --name <topic-name> --resource-group <resource-group-name>
    
  3. Verwijder de functie-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. Verwijder de opslagaccounts:

    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
    

Volgende stappen 

Meer informatie over: