Share via


Tutorial: Weiterleiten von MQTT-Meldungen in Azure Event Grid zu Azure Functions mithilfe von benutzerdefinierten Themen – Azure CLI

In diesem Tutorial erfahren Sie, wie Sie MQTT-Meldungen, die von einem Azure Event Grid-Namespace empfangen werden, über ein benutzerdefiniertes Event Grid-Thema an eine Azure-Funktion weiterleiten, indem Sie die folgenden Schritte ausführen:

Falls Sie nicht über ein Azure-Abonnement verfügen, können Sie sich für eine kostenlose Testversion registrieren.

Voraussetzungen

Folgen Sie den Anweisungen unter Erstellen einer Azure-Funktion mit Visual Studio Code, verwenden Sie jedoch den Azure Event Grid Trigger anstelle des HTTP-Triggers. Der Code sollte etwa dem folgenden Beispiel entsprechen:

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);
        }
    }
}

Sie verwenden diese Azure-Funktion als Ereignishandler für das Abonnement eines Themas weiter unten in diesem Tutorial.

Hinweis

  • Erstellen Sie alle Ressourcen in der gleichen Region.
  • Dieses Tutorial wurde mit einer Azure-Funktion getestet, die (isolierte) .NET 8.0 Runtime-Stapel verwendet.

Erstellen eines Event Grid-Themas (benutzerdefiniertes Thema)

In diesem Schritt erstellen Sie ein Event Grid-Thema.

  1. Kopieren sie das Skript, und fügen Sie es in einen Editor ein.
  2. Ersetzen Sie die folgenden Werte.
  3. Wählen Sie Cloud Shell öffnen aus.
  4. Wechseln Sie von PowerShell zu Bash (in der oberen linken Ecke des Cloud Shell-Fensters).
  5. Kopieren Sie das Skript aus dem Editor, fügen Sie es in Cloud Shell ein, und führen Sie das Skript aus.

Das Skript erstellt eine Azure-Ressourcengruppe und darin ein benutzerdefiniertes Event Grid-Thema. Später in diesem Tutorial konfigurieren Sie das Routing für einen Event Grid-Namespace, sodass die an den Namespace gesendeten Ereignisse oder Nachrichten an das benutzerdefinierte Thema und dann über das Abonnement des Themas an die Azure-Funktion weitergeleitet werden.

Platzhalter Beschreibung
RESOURCEGROUPNAME Der Name der zu erstellenden Ressourcengruppe.
REGION Region, in der Sie die Ressourcengruppe und das benutzerdefinierte Thema erstellen möchten.
TOPICNAME Name des zu erstellenden benutzerdefinierten Themas.

Das Skript verwendet den Befehl az eventgrid topic create, um ein Event Grid-Thema oder ein benutzerdefiniertes Thema zu erstellen. Der Schematyp wird als Cloudereignisschema angegeben.

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

Hinweis

Verwenden Sie das Cloudereignisschema überall in diesem Tutorial.

Hinzufügen eines Abonnements zum Thema mithilfe der Funktion

In diesem Schritt erstellen Sie ein Abonnement für das benutzerdefinierte Thema mithilfe der zuvor erstellten Azure-Funktion.

Ersetzen Sie die folgenden Werte, und führen Sie das Skript in der Cloud Shell aus. Das Skript verwendet den Befehl az eventgrid event-subscription create, um ein Azure-Funktionsabonnement für das benutzerdefinierte Thema zu erstellen. Im Befehl ist die Quell-ID die Ressourcen-ID des Themas und der Endpunkt die Ressourcen-ID der Funktion. Der Endpunkttyp ist auf das Azure-Funktions- und Ereignisübermittlungsschema festgelegt, das als Cloudereignisschema angegeben ist.

Platzhalter Beschreibung
FUNCTIONRESOURCEGROUP Name der Ressourcengruppe mit der Azure Functions-App.
FUNCTIONSAPPNAME Name der Azure Functions-App.
FUNCTIONNAME Name der Azure-Funktion.
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

Erstellen von Namespaces, Clients, Themenbereichen und Berechtigungsbindungen

Mit den Anweisungen unter Schnellstart: Veröffentlichen und Abonnieren von MQTT-Meldungen im Event Grid-Namespace mit der Azure CLI können Sie Folgendes tun:

  1. Erstellen eines Event Grid-Namespace
  2. Erstellen Sie zwei Clients.
  3. Erstellen Sie einen Themenbereich.
  4. Erstellen Sie Herausgeber- und Abonnentenberechtigungsbindungen.
  5. Testen Sie mithilfe der MQTTX-App, ob Clients Meldungen senden und empfangen können.

Aktivieren der verwalteten Identität für den Namespace

Ersetzen Sie den folgenden Wert, und führen Sie das Skript aus, um die systemseitig zugewiesene verwaltete Identität für den Event Grid-Namespace zu aktivieren.

Platzhalter Beschreibung
EVENTGRIDNAMESPACENAME Name des Event Grid-Namespace.

Das Skript verwendet den Befehl az eventgrid namespace update, wobei identity auf die Identität SystemAssigned festgelegt ist.

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

Erteilen Sie dann der verwalteten Identität des Namespace die Sendeberechtigung für das zuvor erstellte benutzerdefinierte Event Grid-Thema, sodass der Namespace Meldungen an das benutzerdefinierte Thema senden oder weiterleiten kann. Dazu fügen Sie die verwaltete Identität im benutzerdefinierten Thema zur Rolle Event Grid-Datensender hinzu.

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

Das Skript verwendet den Befehl az role assignment create mit den IDs der verwalteten Identität des Namespace und des benutzerdefinierten Themas und weist im benutzerdefinierten Thema die Rolle Event Grid-Datensender der verwalteten Identität des Namespace zu.

Konfigurieren des Routings von Meldungen an die Azure-Funktion über ein benutzerdefiniertes Thema

In diesem Schritt konfigurieren Sie das Routing für den Event Grid-Namespace, sodass die empfangenen Meldungen an das von Ihnen erstellte benutzerdefinierte Thema weitergeleitet werden.

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

Das Skript verwendet den Befehl az eventgrid namespace update, um das Routingthema und den Typ der verwalteten Identität festzulegen, die zum Weiterleiten von Ereignissen an das Thema verwendet werden soll.

Senden von MQTT-Testmeldungen mit MQTTX

Senden Sie MQTT-Testmeldungen an den Namespace, und bestätigen Sie, dass die Funktion sie empfängt.

Folgen Sie den Anweisungen aus dem Artikel Veröffentlichen und abonnieren von Meldungen mithilfe der MQTTX-App, um einige Testmeldungen an den Event Grid-Namespace zu senden.

Der Flow der Ereignisse oder Meldungen ist wie folgt:

  1. MQTTX sendet Meldungen an den Themenbereich des Event Grid-Namespace.

  2. Die Meldungen werden an das von Ihnen konfigurierte benutzerdefinierte Thema weitergeleitet.

  3. Die Meldungen werden an das Ereignisabonnement, also die Azure-Funktion, weitergeleitet.

  4. Verwenden Sie das Protokollierungsfeature, um zu überprüfen, ob die Funktion das Ereignis empfangen hat.

    Screenshot der Seite „Protokolldatenstrom“ für eine Azure-Funktion.

Nächster Schritt

Codebeispiele finden Sie in diesem GitHub-Repository.