Configuración de la publicación de Durable Functions en Azure Event Grid

La publicación de eventos de ciclo de vida de orquestación en Azure Event Grid permite la automatización de DevOps (como implementaciones azules o verdes), paneles de supervisión en tiempo real y seguimiento de procesos en segundo plano de larga duración.

Nota:

En esta guía se usan ejemplos de .NET, pero los conceptos y los comandos CLI de Azure se aplican a todos los lenguajes de Durable Functions admitidos.

Sugerencia

Si ya tiene configurado un tema personalizado de Event Grid y una identidad administrada, vaya a Configurar la aplicación de publicador de Durable Functions.

Prerrequisitos

Creación de un tema personalizado de Event Grid

Puede crear un tema de Event Grid para enviar eventos desde Durable Functions mediante the CLI de Azure, PowerShell o the Azure portal.

En esta guía se usa el CLI de Azure.

Creación de un grupo de recursos

Cree un grupo de recursos con el comando az group create. Elija una ubicación que admita Event Grid y coincida con la ubicación en la que desea implementar los recursos.

Nota:

Actualmente, Azure Event Grid no admite todas las regiones. Para obtener información sobre qué regiones se admiten, consulte la introducción a Azure Event Grid.

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

Habilitar el proveedor de recursos de Event Grid

  1. Si es la primera vez que usa Event Grid en su suscripción de Azure, es posible que tenga que registrar el proveedor de recursos de Event Grid. Ejecute el siguiente comando para registrar el proveedor:

    az provider register --namespace Microsoft.EventGrid
    
  2. El registro puede tardar unos instantes en finalizar. Para comprobar el estado, ejecute el comando siguiente:

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

    Cuando registrationState sea Registered, estará preparado para continuar.

Creación de un tema personalizado

Un tema de Event Grid proporciona un punto de conexión definido por el usuario en el que se publica el evento. Reemplace <topic-name> en el comando siguiente por un nombre único para el tema. El nombre del tema debe ser único porque se convierte en una entrada DNS.

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

Obtención del punto de conexión del tema

Obtenga el punto de conexión del tema. Reemplace <topic-name> en los siguientes comandos por el nombre que eligió.

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

Guarde este punto de conexión para más adelante.

Las identidades administradas en Azure permiten que los recursos se autentiquen en los servicios de Azure sin almacenar credenciales, lo que simplifica la seguridad y la administración de identidades. Asigne la identidad administrada asociada a la aplicación Durable Function al tema personalizado de Event Grid.

Configuración de la aplicación de publicador de Durable Functions

Aunque la aplicación Durable Functions publica automáticamente eventos de ciclo de vida de orquestación en Event Grid, debe configurar las opciones de conexión. Agregue lo siguiente a la sección extensions.durableTask en su host.json.

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

Nota:

La configuración eventGridTopicEndpoint hace referencia al punto de conexión de tema personalizado de Event Grid que guardó anteriormente. La configuración de credenciales gestiona tanto la identidad administrada como los escenarios de cadena de conexión.

Asignación del rol remitente de datos de Event Grid

Conceda permiso a la identidad administrada para publicar eventos en el tema de 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>

Reemplace los siguientes valores:

  • <client-id-of-managed-identity>: El ID de cliente de la identidad administrada asignada por el usuario.
  • <subscription-id>: identificador de suscripción de Azure
  • <resource-group-name>: el nombre del grupo de recursos que contiene el tema de Event Grid.
  • <topic-name>: el nombre del tema de Event Grid.

Nota:

Las asignaciones de roles pueden tardar entre 5 y 10 minutos en propagarse. Es posible que vea errores de autenticación si continúa inmediatamente después de la asignación.

Configuración de aplicaciones

Una vez que haya habilitado la identidad administrada para la aplicación de funciones y el tema, configure las opciones de la aplicación de Event Grid en la aplicación de funciones de Durable Functions.

Agregue la siguiente configuración de la aplicación:

  • EventGrid__topicEndpoint — el endpoint del topic de Event Grid.
  • EventGrid__credential : se establece en managedidentity.
  • EventGrid__clientId : identificador de cliente de identidad administrada asignada por el usuario.
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>"

Suscripción a los eventos

Para recibir los eventos de ciclo de vida publicados, cree una suscripción de Event Grid que enruta los eventos del tema personalizado a un suscriptor. Entre los tipos de suscriptor comunes se incluyen Azure Functions (con un desencadenador de Event Grid), Logic Apps y webhooks.

En el ejemplo siguiente se crea una aplicación de función de suscriptor con un desencadenador de Event Grid mediante el CLI de Azure. Si ya tiene un suscriptor, ir a Crear una suscripción de Event Grid.

Creación de una aplicación de función de agente de escucha

Cree una aplicación de funciones para hospedar el desencadenador de Event Grid. El suscriptor debe estar en la misma región que el tema de Event Grid.

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

Creación e implementación de una función de desencadenador de Event Grid

Generar estructura para un proyecto local, agregar un disparador de Event Grid y publicarlo

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>

Nota:

Reemplace por dotnet-isolated el entorno de ejecución preferido (node, python, javao powershell). Para obtener instrucciones detalladas sobre la implementación, consulte Publish to Azure.

Creación de una suscripción de Event Grid

Cree la suscripción utilizando el tipo de endpoint azurefunction, que gestiona automáticamente la validación del webhook.

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

Sugerencia

El uso --endpoint-type azurefunction con el identificador de recurso de la función es el enfoque recomendado. Controla automáticamente la validación del webhook y es más confiable que usar --endpoint-type webhook con una dirección URL.

Esquema del evento

Cuando cambia un estado de orquestación, el Durable Functions runtime publica un evento con la siguiente estructura. Los eventos se generan automáticamente para cada transición de estado; no es necesario agregar ningún código.

Campo Descripción
id Identificador único del evento de Event Grid.
subject durable/orchestrator/{orchestrationRuntimeStatus} : el estado puede ser Running, Completed, Failedo Terminated.
eventType Siempre orchestratorEvent.
eventTime Hora del evento (UTC).
data.hubName Nombre de TaskHub .
data.functionName nombre de una función de orquestador.
data.instanceId Identificador de instancia de orquestación único.
data.runtimeStatus Running, Completed, Failedo Canceled.
data.reason Datos de seguimiento adicionales. Para obtener más información, vea Diagnostics in Durable Functions.

Event Grid garantiza la entrega al menos una vez, por lo que puede recibir eventos duplicados en escenarios de errores poco frecuentes. Considere agregar lógica de desduplicación mediante el instanceId si es necesario.

Verificar la entrega de eventos

Para comprobar la configuración de un extremo a otro, implemente la aplicación de Durable Functions y desencadene una orquestación:

  1. Publicar el código de función en Azure y comprobar que la aplicación de funciones muestra "En ejecución" en el portal de Azure.

  2. En el portal de Azure, compruebe la configuración de la aplicación en Settings> Variables de entorno incluya EventGrid__topicEndpoint y (si usa la identidad administrada) EventGrid__credential.

  3. Desencadene una orquestación mediante un cliente HTTP:

    curl -X POST https://<function_app_name>.azurewebsites.net/api/HelloOrchestration_HttpStart
    
  4. En el portal de Azure, vaya a la aplicación de funciones listener>EventGridTrigger>Monitor para ver los eventos recibidos. Debería ver eventos con temas como durable/orchestrator/Running y durable/orchestrator/Completed.

Comprobación en Application Insights (opcional)

Para obtener una vista más completa, ejecute esta consulta KQL en los registros de Application Insights de la aplicación de funciones:

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

Solución de problemas

Los eventos no se publican en Event Grid

Problema: la función de escucha no recibe eventos.

Soluciones:

  • Compruebe que la aplicación de funciones de Durable Functions tiene la configuración correcta de la aplicación:
    • EventGrid__topicEndpoint debe apuntar al punto de conexión del tema personalizado
    • EventGrid__credential se debe establecer en managedidentity
    • EventGrid__clientId debe establecerse si se usa una identidad asignada por el usuario.
  • Compruebe que la identidad administrada tiene asignado el rol Remitente de datos de EventGrid al tema personalizado de Event Grid.
  • Compruebe los registros de la aplicación de funciones de Durable Functions en Application Insights para ver si hay errores.
  • Compruebe que el tema de Event Grid existe y es accesible en la misma suscripción.

La función de listener no se activa

Problema: la función de escucha existe, pero no se está ejecutando cuando se publican eventos.

Soluciones:

  • Compruebe que se creó la suscripción a Event Grid y que está habilitada:
    • En el portal de Azure, vaya al tema de Event Grid → Subscriptions
    • Confirme que la suscripción de la función de escucha aparece con el estado Habilitado
  • Compruebe que la suscripción de Event Grid usa el tipo de punto de conexión correcto:
    • Para Azure Functions, utilice --endpoint-type azurefunction con el identificador de recurso de la función.
    • Si ha usado --endpoint-type webhook, asegúrese de que la dirección URL del webhook tiene el formato correcto: https://<function-app>.azurewebsites.net/runtime/webhooks/eventgrid?functionName=<function-name>&code=<system-key>
  • Revise los registros de la aplicación de la función de escucha para detectar errores o problemas de entrega.
  • En el tema de Event Grid → Métricas, busque Eventos descartados que pueden indicar errores de entrega.

"Prohibido" o errores de autenticación en los registros

Problema: errores de autenticación al publicar en Event Grid.

Soluciones:

  • Compruebe que la identidad administrada está configurada y habilitada correctamente en la aplicación de funciones de Durable Functions:
    • En el portal de Azure, vaya a la aplicación de funciones → Identity
    • Asegúrese de que el "Estado" muestra Activado para la identidad asignada por el sistema o por el usuario.
  • Compruebe que la asignación de roles es correcta:
    • Vaya al tema de Event Grid → Access Control (IAM)
    • Confirme que la identidad administrada tiene el rol EventGrid Data Sender (nota: sin espacio entre "Event" y "Grid")
    • La asignación de roles puede tardar entre 5 y 10 minutos en propagarse.

Errores de "Conexión rechazada" o "punto de conexión no encontrado"

Problema: errores de conexión al tema de Event Grid.

Soluciones:

  • Compruebe que el punto de conexión del tema de Event Grid en la configuración de la aplicación es correcto e incluye la dirección URL completa (por ejemplo, https://my-topic.eventgrid.azure.net/api/events).
  • Compruebe que el recurso de tema de Event Grid existe en la misma suscripción y región.
  • Compruebe que la aplicación de Durable Functions tenga acceso de red al punto de conexión de Event Grid.

Probar localmente

Para probar localmente, consulte Pruebas locales con la aplicación web visor. Al probar localmente con identidad administrada, use las credenciales de desarrollador para autenticarse en el tema de Event Grid. Consulte Configuración de Durable Functions con identidad administrada: desarrollo local para obtener más información.

Limpieza de recursos

Si no va a seguir usando los recursos creados en este tutorial, elimínelos para evitar incurrir en cargos.

Eliminación de los grupos de recursos

Elimine los grupos de recursos y todos sus recursos contenidos:

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

Eliminación de recursos individuales

Si desea conservar algunos recursos, puede eliminarlos individualmente:

  1. Elimine la suscripción de Event Grid:

    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. Elimine el tema de Event Grid:

    az eventgrid topic delete --name <topic-name> --resource-group <resource-group-name>
    
  3. Elimine las aplicaciones de función:

    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. Elimine las cuentas de almacenamiento:

    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
    

Pasos siguientes

Más información sobre: