Compartilhar via


Tutorial: Rotear mensagens MQTT na Grade de Eventos do Azure para o Azure Functions usando tópicos personalizados – CLI do Azure

Neste tutorial, você aprenderá a rotear mensagens MQTT recebidas por um namespace da Grade de Eventos do Azure para uma função do Azure por meio de um tópico personalizado da Grade de Eventos seguindo estas etapas:

Se não tiver uma assinatura do Azure, você poderá inscrever-se em uma avaliação gratuita.

Pré-requisitos

Siga as instruções de Criar uma função Azure usando o Visual Studio Code, mas use o Gatilho da Grade de Eventos do Azure em vez de usar o Gatilho HTTP. Você deverá ver um código semelhante ao exemplo a seguir:

using System;
using Azure.Messaging;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

namespace Company.Function
{
    public class MyEventGridTriggerFunc
    {
        private readonly ILogger<MyEventGridTriggerFunc> _logger;

        public MyEventGridTriggerFunc(ILogger<MyEventGridTriggerFunc> logger)
        {
            _logger = logger;
        }

        [Function(nameof(MyEventGridTriggerFunc))]
        public void Run([EventGridTrigger] CloudEvent cloudEvent)
        {
            _logger.LogInformation("Event type: {type}, Event subject: {subject}", cloudEvent.Type, cloudEvent.Subject);
        }
    }
}

Você usará essa função do Azure como um manipulador de eventos para a assinatura de um tópico mais adiante neste tutorial.

Observação

  • Crie todos os recursos na mesma região.
  • Este tutorial foi testado com uma função do Azure que usa a pilha de runtime do .NET 8.0 (isolada).

Criar um tópico da Grade de Eventos (tópico personalizado)

Nesta etapa, você criará um tópico da Grade de Eventos.

  1. Copie e cole o script em um editor.
  2. Substitua os valores a seguir.
  3. Selecione Abrir o Cloud Shell.
  4. Mude do PowerShell para o Bash (no canto superior esquerdo da janela do Cloud Shell).
  5. Copie e cole o script do editor para o Cloud Shell e execute o script.

O script cria um grupo de recursos do Azure e um tópico personalizado da Grade de Eventos nele. Posteriormente neste tutorial, você configurará o roteamento para um namespace da Grade de Eventos para que os eventos ou mensagens enviadas para o namespace sejam roteados para o tópico personalizado e, em seguida, para a função do Azure por meio da assinatura do tópico.

Espaço reservado Descrição
RESOURCEGROUPNAME Nome do grupo de recursos a ser criado.
REGION Região na qual você deseja criar o grupo de recursos e o tópico personalizado.
TOPICNAME Nome do tópico personalizado a ser criado.

O script usa o comando az eventgrid topic create para criar um tópico da Grade de Eventos ou um tópico personalizado. O tipo de esquema é especificado como esquema de evento na nuvem.

rgName="RESOURCEGROUPNAME"
location="REGION"
topicName="TOPICNAME"

az group create -n $rgName -l $location

az eventgrid topic create --name $topicName -l $location -g $rgName --input-schema cloudeventschemav1_0

Observação

Use o Esquema de evento na nuvem em todos os lugares neste tutorial.

Adicione uma assinatura ao tópico usando a função

Nesta etapa, você criará uma assinatura para o tópico personalizado usando a função do Azure criada anteriormente.

Substitua os valores a seguir e execute o script no Cloud Shell. O script usa o comando az eventgrid event-subscription create para criar uma assinatura de função do Azure para o tópico personalizado. No comando, a ID de origem é a ID do recurso do tópico e o ponto de extremidade é a ID do recurso da função. O tipo de ponto de extremidade é definido como função do Azure e o esquema de entrega de eventos é especificado como o esquema de eventos na nuvem.

Espaço reservado Descrição
FUNCTIONRESOURCEGROUP Nome do grupo de recursos que tem o aplicativo do Azure Functions.
FUNCTIONSAPPNAME Nome do aplicativo do Azure Functions.
FUNCTIONNAME Nome da função do Azure.
funcAppRgName="FUNCTIONRESOURCEGROUP"
funcAppName="FUNCTIONSAPPNAME"
funcName="FUNCTIONNAME"
funcResourceId=$(az functionapp function show -g $funcAppRgName -n $funcAppName --function-name $funcName --query "{I:id}" -o tsv)

topicResourceId=$(az eventgrid topic show --name $topicName -g $rgName --query id --output tsv)
eventSubscriptionName="EVENTSUBSCRIPTIONNAME"
az eventgrid event-subscription create --name $eventSubscriptionName --source-resource-id $topicResourceId  --endpoint-type azurefunction --endpoint $funcResourceId --event-delivery-schema cloudeventschemav1_0

Criar namespaces, clientes, espaços de tópicos e associações de permissões

Siga as instruções do Início rápido: Publicar e assinar mensagens MQTT em um namespace da Grade de Eventos com a CLI do Azure para:

  1. Criar um namespace da Grade de Eventos.
  2. Criar dois clientes.
  3. Criar um espaço de tópico.
  4. Criar vinculações de permissão de fornecedor e assinante.
  5. Testar usando o aplicativo MQTTX para confirmar que os clientes podem enviar e receber mensagens.

Habilitar a identidade gerenciada do namespace

Substitua o valor a seguir e execute o script para habilitar a identidade gerenciada atribuída pelo sistema para o namespace da Grade de Eventos.

Espaço reservado Descrição
EVENTGRIDNAMESPACENAME Nome do namespace da Grade de Eventos.

O script usa o comando az eventgrid namespace update com identity definido como identidade SystemAssigned.

nsName="EVENTGRIDNAMESPACENAME"
az eventgrid namespace update -g $rgName -n $nsName --topic-spaces-configuration "{state:Enabled}" --identity "{type:SystemAssigned}"

Em seguida, conceda à identidade gerenciada do namespace a permissão enviar no tópico personalizado da Grade de Eventos criado anteriormente para que o namespace possa enviar ou rotear mensagens para o tópico personalizado. Você faz isso adicionando a identidade gerenciada à função Remetente de Dados da Grade de Eventos no tópico personalizado.

egNamespaceServicePrincipalObjectID=$(az ad sp list --display-name $nsName --query [].id -o tsv)
topicResourceId=$(az eventgrid topic show --name $topicName -g $rgName --query id --output tsv)
az role assignment create --assignee $egNamespaceServicePrincipalObjectID --role "EventGrid Data Sender" --scope $topicResourceId

O script usa o comando az role assignment create com as IDs da identidade gerenciada do namespace e o tópico personalizado e atribui a função do Remetente de Dados da Grade de Eventos à identidade gerenciada do namespace no tópico personalizado.

Configurar mensagens de roteamento para a função do Azure por meio de um tópico personalizado

Nesta etapa, configure o roteamento do namespace da Grade de Eventos para que as mensagens que ele recebe sejam encaminhadas para o tópico personalizado que você criou.

az eventgrid namespace update -g $rgName -n $nsName --topic-spaces-configuration "{state:Enabled,'routeTopicResourceId':$topicResourceId,'routingIdentityInfo':{type:SystemAssigned}}"

O script usa o comando az eventgrid namespace update para definir o tópico de roteamento e o tipo de identidade gerenciada a ser usado para rotear eventos para o tópico.

Enviar mensagens MQTT de teste usando o MQTTX

Envie mensagens MQTT de teste para o namespace e confirme se a função as recebe.

Siga as instruções do artigo Publicar, assinar mensagens usando o aplicativo MQTTX para enviar algumas mensagens de teste para o namespace da Grade de Eventos.

Aqui está o fluxo dos eventos ou mensagens:

  1. O MQTTX envia mensagens para o espaço de tópico do namespace da Grade de Eventos.

  2. As mensagens são encaminhadas para o tópico personalizado que você configurou.

  3. As mensagens são encaminhadas para a assinatura do evento, que é a função do Azure.

  4. Use o recurso de registro em log para verificar se a função recebeu o evento.

    Captura de tela mostrando a página de fluxo de logs de uma função do Azure.

Próxima etapa

Veja exemplos de código em este repositório GitHub.