Partilhar via


Durable Functions a ser publicado no Azure Event Grid

Este artigo mostra como configurar Funções Duráveis para publicar eventos do ciclo de vida da orquestração (como criados, concluídos e falhados) num tópico personalizado do Azure Event Grid.

Seguem-se alguns cenários em que esta funcionalidade é útil:

  • Cenários DevOps como implementações azuis/verdes: Pode querer saber se há tarefas a decorrer antes de implementar a estratégia de implementação lado a lado.

  • Suporte avançado de monitorização e diagnóstico: Pode acompanhar a informação de estado da orquestração numa loja externa otimizada para consultas, como Azure SQL Database ou Azure Cosmos DB.

  • Atividade em segundo plano de longa duração: Se usar Funções Duráveis para uma atividade em segundo plano de longa duração, esta funcionalidade ajuda-o a conhecer o estado atual.

Pré-requisitos

Crie um tópico personalizado para a Grelha de Eventos

Crie um tópico do Event Grid para enviar eventos a partir de Durable Functions. As instruções seguintes mostram como criar um tópico usando Azure CLI. Também pode criar o tema usando o PowerShell ou utilizando o portal Azure.

Criar um grupo de recursos

Crie um grupo de recursos com o comando az group create. Atualmente, o Azure Event Grid não suporta todas as regiões. Para informações sobre quais as regiões suportadas, consulte a visão geral do Azure Event Grid.

az group create --name eventResourceGroup --location westus2

Criar um tópico personalizado

Um tópico de Grelha de Eventos fornece um endpoint definido pelo utilizador onde publica o seu evento. Substitua <topic_name> por um nome exclusivo para o seu tópico. O nome do tópico tem de ser único porque se torna uma entrada DNS.

az eventgrid topic create --name <topic_name> -l westus2 -g eventResourceGroup

Obtenha o endpoint e a chave

Percebe o ponto final do tema. Substitui <topic_name> pelo nome que escolheste.

az eventgrid topic show --name <topic_name> -g eventResourceGroup --query "endpoint" --output tsv

Obtenha a chave do tópico se estiver a usar autenticação baseada em chaves. Substitui <topic_name> pelo nome que escolheste.

az eventgrid topic key list --name <topic_name> -g eventResourceGroup --query "key1" --output tsv

Agora podes enviar eventos sobre o tema.

Configurar a publicação em Grade de Eventos com autenticação baseada em chaves

No seu projeto de Funções Duradouras, encontre o ficheiro host.json.

Funções Duráveis 1.x

Adicione eventGridTopicEndpoint e eventGridKeySettingName numa propriedade durableTask.

{
  "durableTask": {
    "eventGridTopicEndpoint": "https://<topic_name>.westus2-1.eventgrid.azure.net/api/events",
    "eventGridKeySettingName": "EventGridKey"
  }
}

Funções Duráveis 2.x

Adicione uma notifications secção à durableTask propriedade do ficheiro, substituindo <topic_name> pelo nome que escolheu. Se as durableTask propriedades ou extensions não existirem, crie-as como este exemplo:

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "notifications": {
        "eventGrid": {
          "topicEndpoint": "https://<topic_name>.westus2-1.eventgrid.azure.net/api/events",
          "keySettingName": "EventGridKey"
        }
      }
    }
  }
}

As possíveis propriedades de configuração do Azure Event Grid podem ser encontradas na documentaçãohost.json. Depois de configurar o host.json ficheiro, a sua aplicação de funções envia eventos do ciclo de vida para o tópico Grelha de Eventos. Esta ação começa quando executa a sua aplicação de funções, tanto localmente como no Azure.

Defina a configuração da aplicação para a chave de tópico na Function App e local.settings.json. Este JSON é um exemplo para local.settings.json de depuração local usando um emulador do Azure Storage. Substitui <topic_key> pela chave do tópico.

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "EventGridKey": "<topic_key>"
    }
}

Se estiveres a usar o Emulador de Armazenamento em vez de uma conta real do Azure Storage, certifica-te de que está a correr. É uma boa ideia limpar quaisquer dados de armazenamento existentes antes de executar.

Se estiveres a usar uma conta real do Azure Storage, substitui UseDevelopmentStorage=true em local.settings.json pela sua string de ligação.

Configurar a publicação em Event Grid com Identidade Gerida

As identidades geridas no Azure permitem que os recursos se autentiquem nos serviços Azure sem armazenar credenciais, simplificando a segurança e a gestão de identidades. A identidade gerida atribuída ao sistema é criada automaticamente quando a ativa num recurso Azure e está ligada ao ciclo de vida desse recurso. Se o recurso for eliminado, a identidade também é removida. A identidade gerida atribuída pelo utilizador é criada como um recurso Azure autónomo e pode ser atribuída a múltiplos recursos. Persiste independentemente de qualquer recurso, oferecendo flexibilidade para acesso partilhado e gestão centralizada de identidades. Recomenda-se que use a identidade atribuída pelo utilizador porque não está ligada ao ciclo de vida da aplicação.

Para mais informações, visite Usar identidades geridas para App Service e Azure Functions.

Identidade Atribuída ao Sistema

Para configurar a identidade atribuída ao sistema, siga as instruções abaixo:

Configuração

  1. Ativar a identidade atribuída ao sistema para a aplicação de funções

    • Vai à secção Identidade da aplicação de funções e, no separador Sistema Atribuído, ativa o interruptor de Estado.

      Captura de ecrã de ativar a identidade atribuída ao sistema na aplicação de funções.

  2. No recurso tópico do Event Grid, atribua à aplicação da função o papel de Remetente de Dados do EventGrid.

    • Vai à secção de Controlo de Acesso (IAM ), clica + Adicionar.

      Captura de ecrã da adição de uma função ao recurso do Event Grid topic.

    • Selecione o papel de Remetente de Dados EventGrid , clique em Próximo.

      Captura de ecrã da seleção do papel de Remetente de Dados EventGrid.

    • Escolha Identidade Gerida na secção Atribuir acesso a, clique + Selecionar Membros na secção Membros, selecione a identidade gerida e depois clique em Rever + Atribuir.

      Captura de ecrã da seleção de uma identidade gerida.

Definições da Aplicação

Adicione uma EventGrid__topicEndpoint configuração de aplicação com o valor definido como o endpoint do tópico da Grade de Eventos.

Pode usar o seguinte comando: az functionapp config appsettings set --name <function app name> --resource-group <resource group name> --settings EventGrid__topicEndpoint="<topic endpoint>"

Identidade atribuída pelo usuário

Para configurar a identidade gerida atribuída pelo utilizador, siga as instruções abaixo:

Configuração

  1. Crie uma identidade gerida atribuída pelo utilizador.

    • No portal Azure, pesquise por Identidades Geridas na barra de pesquisa global.

    • Crie uma identidade gerida atribuída pelo utilizador (UAMI) e selecione Rever + criar.

      Captura de ecrã da criação da identidade gerida atribuida pelo utilizador.

  2. Anexe o UAMI ao recurso da aplicação de funções

    • Vai à aplicação de funções, secção Identidade , clica em Adicionar +.

      Captura de ecrã da secção de identidade da aplicação de funções para identidade gerida atribuída pelo utilizador.

    • Escolha o UAMI criado acima, depois clique em Adicionar.

      Captura de ecrã da seleção de uma identidade gerida específica atribuída pelo utilizador.

  3. Anexe o UAMI ao recurso de tópicos da grade de eventos.

    • Vai ao recurso do tópico da grelha de eventos, secção Identidade , escolhe o separador Utilizador atribuído e depois clica em Adicionar +. Escolha a identidade gerida atribuída pelo utilizador e depois clique em Adicionar.

      Captura de ecrã da adição de uma identidade gerida atribuída pelo utilizador ao tópico da grelha de eventos.

  4. Crie uma subscrição ao Event Grid e selecione um endpoint.

    • No separador Overview do recurso Event Grid Topic, selecione + Event Subscribe e crie a subscrição do evento.

      Captura de ecrã do botão + Subscrição do Evento.

    • Com base no endpoint que escolher em Detalhes do Endpoint, verá uma secção de Identidade Gerida para Entrega . Escolha Utilizador Atribuído para o tipo de Identidade Gerida e selecione o UAMI.

      Captura de ecrã da adição de uma identidade gerida atribuída pelo utilizador à subscrição da grelha de eventos.

  5. No recurso tópico Event Grid, atribua o papel de Remetente de Dados EventGrid ao UAMI.

    • Vai à secção de Controlo de Acesso (IAM ), clica + Adicionar.

      Captura de ecrã da adição de uma função a um recurso de tópico do Event Grid.

    • Selecione o papel de Remetente de Dados EventGrid , clique em Próximo.

      Captura de ecrã da seleção do papel de Remetente de Dados EventGrid.

    • Escolha Identidade Gerida na secção Atribuir acesso a, clique + Selecionar Membros na secção Membros, selecione o UAMI e depois clique em Rever + Atribuir.

      Captura de ecrã da seleção de uma identidade gerida.

Definições do Aplicativo

  • Adicione uma EventGrid__topicEndpoint definição de aplicação com o valor como endpoint do tópico da Grade de Eventos.
  • Adicione uma EventGrid__credential definição de aplicação com o valor managedidentity.
  • Adicione uma EventGrid__clientId definição de aplicação com o valor do ID de cliente de identidade gerida atribuído pelo utilizador.

Crie funções que escutem eventos

Usando o portal Azure, crie outra aplicação de funções para ouvir eventos publicados pela sua aplicação Durable Functions. É melhor localizá-lo na mesma região do tópico da Grelha de Eventos.

Criar uma função de ativação do Event Grid

  1. Na tua aplicação de funções, seleciona Funções e depois seleciona + Adicionar

    Adicione uma função no portal Azure.

  2. Procure Event Grid e depois selecione o template do gatilho Azure Event Grid.

    Selecione o modelo de gatilho Event Grid no portal Azure.

  3. Nomeie o novo gatilho e depois selecione Criar Função.

    Nomeie o gatilho da Grelha de Eventos no portal Azure.

    É criada uma função com o seguinte código:

    #r "Newtonsoft.Json"
    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    using Microsoft.Extensions.Logging;
    
    public static void Run(JObject eventGridEvent, ILogger log)
    {
        log.LogInformation(eventGridEvent.ToString(Formatting.Indented));
    }
    

Adicionar uma subscrição do Event Grid

Agora pode adicionar uma subscrição Event Grid para o tópico Event Grid que criou. Para mais informações, consulte Conceitos no Azure Event Grid.

  1. Na sua nova função, escolha Integração e depois selecione Event Grid Trigger (eventGridEvent).

    Selecione o link do Trigger do Event Grid.

  2. Selecione Criar Descrição da Grelha de Eventos.

    Crie a subscrição do Event Grid.

  3. Nomeie a subscrição do seu evento e selecione o tipo de tópico Event Grid Topics.

  4. Selecione uma subscrição. Depois, selecione o grupo de recursos e o recurso que criou para o tópico da Grelha de Eventos.

  5. Selecione Criar.

    Crie uma subscrição do Event Grid.

Agora está pronto para receber eventos do ciclo de vida.

Execute a aplicação Durable Functions para enviar os eventos

No projeto Durable Functions que configuraste anteriormente, começa a depurar na tua máquina local e inicia uma orquestração. A aplicação publica eventos do ciclo de vida das Funções Duradouras na Grade de Eventos. Verifica se o Event Grid ativa a função de ouvinte que criaste, verificando os seus registos no portal Azure.

2019-04-20T09:28:21.041 [Info] Function started (Id=3301c3ef-625f-40ce-ad4c-9ba2916b162d)
2019-04-20T09:28:21.104 [Info] {
    "id": "054fe385-c017-4ce3-b38a-052ac970c39d",
    "subject": "durable/orchestrator/Running",
    "data": {
        "hubName": "DurableFunctionsHub",
        "functionName": "Sample",
        "instanceId": "055d045b1c8a415b94f7671d8df693a6",
        "reason": "",
        "runtimeStatus": "Running"
    },
    "eventType": "orchestratorEvent",
    "eventTime": "2019-04-20T09:28:19.6492068Z",
    "dataVersion": "1.0",
    "metadataVersion": "1",
    "topic": "/subscriptions/<your_subscription_id>/resourceGroups/eventResourceGroup/providers/Microsoft.EventGrid/topics/durableTopic"
}

2019-04-20T09:28:21.104 [Info] Function completed (Success, Id=3301c3ef-625f-40ce-ad4c-9ba2916b162d, Duration=65ms)
2019-04-20T09:28:37.098 [Info] Function started (Id=36fadea5-198b-4345-bb8e-2837febb89a2)
2019-04-20T09:28:37.098 [Info] {
    "id": "8cf17246-fa9c-4dad-b32a-5a868104f17b",
    "subject": "durable/orchestrator/Completed",
    "data": {
        "hubName": "DurableFunctionsHub",
        "functionName": "Sample",
        "instanceId": "055d045b1c8a415b94f7671d8df693a6",
        "reason": "",
        "runtimeStatus": "Completed"
    },
    "eventType": "orchestratorEvent",
    "eventTime": "2019-04-20T09:28:36.5061317Z",
    "dataVersion": "1.0",
    "metadataVersion": "1",
    "topic": "/subscriptions/<your_subscription_id>/resourceGroups/eventResourceGroup/providers/Microsoft.EventGrid/topics/durableTopic"
}
2019-04-20T09:28:37.098 [Info] Function completed (Success, Id=36fadea5-198b-4345-bb8e-2837febb89a2, Duration=0ms)

Esquema de eventos

A lista seguinte explica o esquema dos eventos do ciclo de vida:

  • id: Identificador único para o evento da Grelha de Eventos.
  • subject: Caminho para o assunto do evento. durable/orchestrator/{orchestrationRuntimeStatus}. {orchestrationRuntimeStatus} serão Running, Completed, Failed, e Terminated.
  • data: Parâmetros Específicos das Funções Duradouras.
    • hubName: Nome TaskHub .
    • functionName: Nome da função Orchestrator.
    • instanceId: ID da instância das Funções Duradouras.
    • reason: Dados adicionais associados ao evento de rastreamento. Para mais informações, consulte Diagnósticos em Funções Duráveis (Azure Functions)
    • runtimeStatus: Estado de Execução da Orquestração. Em execução, Concluído, Falha, Cancelado.
  • eventType: "eventoOrquestrador"
  • eventTime: Hora do evento (UTC).
  • dataVersion: Versão do esquema de eventos do ciclo de vida.
  • metadataVersion: Versão dos metadados.
  • topic: Recurso temático da Grelha de Eventos.

Como testar localmente

Para testar localmente, leia Local testing com a aplicação web do visualizador.

Próximos passos