Konfigurera publiceringen av Durable Functions till Azure Event Grid

Genom att publicera orkestreringslivscykel-händelser till Azure Event Grid kan man möjliggöra DevOps-automatisering (till exempel blå/gröna distributioner), övervakningspaneler i realtid och spårning av långvariga bakgrundsprocesser.

Anmärkning

Den här guiden använder .NET exempel, men begreppen och Azure CLI kommandona gäller för alla Durable Functions språk som stöds.

Tips/Råd

Om du redan har konfigurerat ett anpassat Event Grid-ämne och en hanterad identitet går du vidare till Konfigurera Durable Functions publisher-appen.

Förutsättningar

Skapa ett anpassat Event Grid-ämne

Du kan skapa ett Event Grid-ämne för att skicka händelser från Durable Functions med hjälp av the Azure CLI, PowerShell eller the Azure portal.

Den här guiden använder Azure CLI.

Skapa en resursgrupp

Skapa en resursgrupp med kommandot az group create. Välj en plats som stöder Event Grid och matchar var du vill distribuera dina resurser.

Anmärkning

För närvarande stöder Azure Event Grid inte alla regioner. Information om vilka regioner som stöds finns i Översikt över Azure Event Grid.

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

Aktivera resursprovidern för Event Grid

  1. Om det är första gången du använder Event Grid i din Azure-prenumeration kan du behöva registrera Event Grid-resursprovidern. Registrera providern genom att köra följande kommando:

    az provider register --namespace Microsoft.EventGrid
    
  2. Det kan ta en stund innan registreringen är klar. Kontrollera statusen genom att köra följande kommando:

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

    När registrationState är Registered kan du fortsätta.

Skapa ett anpassat ämne

Ett Event Grid-ämne innehåller en användardefinierad slutpunkt som du publicerar händelsen till. Ersätt <topic-name> i följande kommando med ett unikt namn för ditt ämne. Ämnesnamnet måste vara unikt eftersom det blir en DNS-post.

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

Hämta ämnesslutpunkten

Hämta slutpunkten för ämnet. Ersätt <topic-name> i följande kommandon med det namn du valde.

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

Spara den här slutpunkten för senare.

Hanterade identiteter i Azure gör det möjligt för resurser att autentisera till Azure-tjänster utan att lagra autentiseringsuppgifter, vilket förenklar säkerhets- och identitetshantering. Tilldela den hanterade identitet som är associerad med din Durable Function-app till ditt anpassade Event Grid-ämne.

Konfigurera Durable Functions publisher-appen

Även om din Durable Functions-app automatiskt publicerar orkestreringslivscykelhändelser till Event Grid måste du konfigurera anslutningsinställningarna. Lägg till följande i extensions.durableTask-avsnittet i din host.json.

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

Anmärkning

Inställningen eventGridTopicEndpoint refererar till den anpassade ämnesslutpunkten för Event Grid som du sparade tidigare. Inställningen för autentiseringsuppgifter hanterar både scenarier med hanterad identitet och anslutningssträng.

Tilldela rollen Event Grid Data Sender

Ge din hanterade identitet behörighet att publicera händelser till Event Grid-ämnet.

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>

Ersätt följande värden:

  • <client-id-of-managed-identity>: Klient-ID för din användartilldelade hanterade identitet
  • <subscription-id>: Ditt Azure-prenumerations-ID
  • <resource-group-name>: Namnet på resursgruppen som innehåller event grid-ämnet
  • <topic-name>: Namnet på ditt Event Grid-ämne

Anmärkning

Rolltilldelningar kan ta 5–10 minuter att propagera. Du kan se autentiseringsfel om du fortsätter direkt efter tilldelningen.

Konfigurera appinställningar

När du har aktiverat hanterad identitet för funktionsappen och ämnet konfigurerar du inställningarna för Event Grid-appen i din Durable Functions funktionsapp.

Lägg till följande appinställningar:

  • EventGrid__topicEndpoint — Event Grid-ämnesslutpunkten.
  • EventGrid__credential – inställt på managedidentity.
  • EventGrid__clientId – det användartilldelade klient-ID:t för hanterad identitet.
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>"

Prenumerera på händelser

Om du vill ta emot publicerade livscykelhändelser skapar du en Event Grid-prenumeration som dirigerar händelser från ditt anpassade ämne till en prenumerant. Vanliga prenumeranttyper är Azure Functions (med en Event Grid-utlösare), Logic Apps och webhooks.

I följande exempel skapas en prenumerantfunktionsapp med en Event Grid-utlösare med hjälp av Azure CLI. Om du redan har en prenumerant går du vidare till Skapa en Event Grid-prenumeration.

Skapa en lyssnarfunktionsapp

Skapa en funktionsapp som värd för Event Grid-utlösaren. Lyssnaren måste finnas i samma region som Event Grid-ämnet.

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

Skapa och distribuera en Event Grid-utlösarfunktion

Skapa ett lokalt projekt, lägg till en Event Grid-utlösare och publicera det:

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>

Anmärkning

Ersätt dotnet-isolated med önskad körning (node, python, javaeller powershell). Detaljerade distributionsinstruktioner finns i Publicera till Azure.

Skapa en Event Grid-prenumeration

Skapa prenumerationen med hjälp av azurefunction slutpunktstypen, som automatiskt hanterar webhook-validering:

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

Tips/Råd

Att använda --endpoint-type azurefunction med funktionens resurs-ID är den rekommenderade metoden. Den hanterar webhooksvalidering automatiskt och är mer tillförlitlig än att använda --endpoint-type webhook med en URL.

Händelseschema

När ett orkestreringstillstånd ändras publicerar Durable Functions-körningen en händelse med följande struktur. Händelser genereras automatiskt för varje tillståndsövergång – du behöver inte lägga till någon kod.

Fält Beskrivning
id Unik identifierare för Event Grid-händelsen.
subject durable/orchestrator/{orchestrationRuntimeStatus} – statusen kan vara Running, Completed, Failedeller Terminated.
eventType Alltid orchestratorEvent.
eventTime Händelsetid (UTC).
data.hubName TaskHub-namn .
data.functionName Orchestrator-funktionsnamn.
data.instanceId Unikt orkestreringsinstans-ID.
data.runtimeStatus Running, Completed, Failed eller Canceled.
data.reason Ytterligare spårningsdata. Mer information finns i Diagnostics i Durable Functions.

Event Grid säkerställer leverans minst en gång, så du kan i sällsynta fall få samma händelser fler än en gång vid fel. Överväg att lägga till dedupliceringslogik med hjälp av instanceId om det behövs.

Verifiera händelseleverans

Om du vill verifiera konfigurationen från slutpunkt till slutpunkt distribuerar du din Durable Functions app och utlöser en orkestrering:

  1. Publicera funktionskoden till Azure och kontrollera att funktionsappen visar "Körs" i Azure portalen.

  2. I Azure-portalen kontrollerar du appinställningarna under Inställningar>Miljövariabler inkluderar EventGrid__topicEndpoint och (om hanterad identitet används) EventGrid__credential.

  3. Utlös en orkestrering med hjälp av en HTTP-klient:

    curl -X POST https://<function_app_name>.azurewebsites.net/api/HelloOrchestration_HttpStart
    
  4. I Azure-portalen går du till funktionsappen listener>EventGridTrigger>Monitor för att visa mottagna händelser. Du bör se händelser med ämnen som durable/orchestrator/Running och durable/orchestrator/Completed.

Verifiera i Application Insights (valfritt)

Om du vill ha en mer omfattande vy kör du den här KQL-frågan i funktionsappens Application Insights-loggar:

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

Felsökning

Händelser publiceras inte till Event Grid

Problem: Lyssnarfunktionen tar inte emot händelser.

Lösningar:

  • Kontrollera att Durable Functions funktionsappen har rätt appinställningar:
    • EventGrid__topicEndpoint måste peka på din anpassade ämnesslutpunkt
    • EventGrid__credential måste anges till managedidentity
    • EventGrid__clientId måste anges om du använder en användartilldelad identitet
  • Kontrollera att den hanterade identiteten har rollen EventGrid Data Sender tilldelad till det anpassade event grid-ämnet.
  • Kontrollera loggarna för Durable Functions-funktionsappen i Application Insights för eventuella fel.
  • Kontrollera att Event Grid-ämnet finns och är tillgängligt i samma prenumeration.

Lyssnarfunktionen utlöses inte

Problem: Lyssnarfunktionen finns men körs inte när händelser publiceras.

Lösningar:

  • Kontrollera att Event Grid-prenumerationen har skapats och är aktiverad:
    • I Azure-portalen går du till event grid-ämnet → Prenumerationer
    • Bekräfta att din lyssnarfunktions prenumeration visas med statusen Aktiverad
  • Kontrollera att Event Grid-prenumerationen använder rätt slutpunktstyp:
    • För Azure Functions använder du --endpoint-type azurefunction med funktionens resurs-ID
    • Om du använde --endpoint-type webhookkontrollerar du att webhookens URL är i rätt format: https://<function-app>.azurewebsites.net/runtime/webhooks/eventgrid?functionName=<function-name>&code=<system-key>
  • Kontrollera om det finns fel eller leveransproblem i lyssnarfunktionens apploggar.
  • I avsnittet Event Grid → Mått söker du efter borttagna händelser som kan tyda på leveransfel.

"Förbjudet" eller autentiseringsfel i loggar

Problem: Autentiseringsfel vid publicering till Event Grid.

Lösningar:

  • Kontrollera att den hanterade identiteten är korrekt konfigurerad och aktiverad i Durable Functions funktionsappen:
    • I Azure-portalen går du till funktionsappen → Identity
    • Bekräfta att "Status" visar för antingen en systemtilldelad eller användartilldelad identitet
  • Kontrollera att rolltilldelningen är korrekt:
    • Gå till event grid-ämnet → Access Control (IAM)
    • Bekräfta att den hanterade identiteten har rollen EventGrid Data Sender (obs! inget utrymme mellan "Event" och "Grid")
    • Rolltilldelningen kan ta 5–10 minuter att sprida

Felmeddelanden "Anslutningen nekades" eller "slutpunkten hittades inte"

Problem: Anslutningsfel till Event Grid-ämnet.

Lösningar:

  • Kontrollera att Event Grid-ämnesslutpunkten i appinställningarna är korrekt och innehåller den fullständiga URL:en (till exempel https://my-topic.eventgrid.azure.net/api/events)
  • Kontrollera att Event Grid-ämnesresursen finns i samma prenumeration och region
  • Kontrollera att din Durable Functions app har nätverksåtkomst till Event Grid-slutpunkten

Testa lokalt

Om du vill testa lokalt läser du Lokal testning med visningswebbappen. När du testar lokalt med hanterad identitet använder du dina autentiseringsuppgifter för utvecklare för att autentisera mot Event Grid-ämnet. Mer information finns i Konfigurera Durable Functions med hanterad identitet – lokal utveckling.

Rensa resurser

Om du inte kommer att använda resurserna som skapades i den här handledningen, ta bort dem för att undvika avgifter.

Ta bort resursgrupperna

Ta bort både resursgrupper och alla deras inneslutna resurser:

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

Ta bort enskilda resurser

Om du vill behålla vissa resurser kan du ta bort dem individuellt:

  1. Ta bort Event Grid-prenumerationen:

    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. Ta bort Event Grid-ämnet:

    az eventgrid topic delete --name <topic-name> --resource-group <resource-group-name>
    
  3. Ta bort funktionsapparna:

    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. Ta bort lagringskontona:

    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ästa steg

Läs mer om: