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.
- Kopieren sie das Skript, und fügen Sie es in einen Editor ein.
- Ersetzen Sie die folgenden Werte.
- Wählen Sie Cloud Shell öffnen aus.
- Wechseln Sie von PowerShell zu Bash (in der oberen linken Ecke des Cloud Shell-Fensters).
- 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:
- Erstellen eines Event Grid-Namespace
- Erstellen Sie zwei Clients.
- Erstellen Sie einen Themenbereich.
- Erstellen Sie Herausgeber- und Abonnentenberechtigungsbindungen.
- 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:
MQTTX sendet Meldungen an den Themenbereich des Event Grid-Namespace.
Die Meldungen werden an das von Ihnen konfigurierte benutzerdefinierte Thema weitergeleitet.
Die Meldungen werden an das Ereignisabonnement, also die Azure-Funktion, weitergeleitet.
Verwenden Sie das Protokollierungsfeature, um zu überprüfen, ob die Funktion das Ereignis empfangen hat.
Nächster Schritt
Codebeispiele finden Sie in diesem GitHub-Repository.