Freigeben über


Tutorial: Bidirektionale MQTT-Brücke zu Azure Event Grid

Wichtig

Diese Seite enthält Anweisungen zum Verwalten der Komponenten von Azure IoT Einsatz mithilfe von Kubernetes-Bereitstellungsmanifesten. Diese Option befindet sich in der Vorschau. Dieses Feature wird mit einigen Einschränkungen bereitgestellt und sollte nicht für Produktionsworkloads verwendet werden.

Die zusätzlichen Nutzungsbestimmungen für Microsoft Azure-Vorschauen enthalten rechtliche Bedingungen. Sie gelten für diejenigen Azure-Features, die sich in der Beta- oder Vorschauversion befinden oder aber anderweitig noch nicht zur allgemeinen Verfügbarkeit freigegeben sind.

In diesem Lernprogramm richten Sie eine bidirektionale MQTT-Brücke zwischen einem Azure IoT Einsatz MQTT-Broker und Azure Event Grid ein. Um das Tutorial einfach zu halten, werden die Standardeinstellungen für den MQTT-Broker von Azure IoT Einsatz und die Azure Event Grid-Endpunkte verwendet und wird keine Transformation angewendet.

Voraussetzungen

Festlegen von Umgebungsvariablen

Anmelden mit der Azure CLI:

az login

Legen Sie Umgebungsvariablen für den Rest des Setups fest. Ersetzen Sie Werte in <> durch gültige Werte oder Namen Ihrer Wahl. Auf der Grundlage der von Ihnen angegebenen Namen werden in Ihrem Azure-Abonnement ein neuer Azure Event Grid-Namespace und ein Themenbereich erstellt:

# For this tutorial, the steps assume the IoT Operations cluster and the Event Grid
# are in the same subscription, resource group, and location.

# Name of the resource group of Azure Event Grid and IoT Operations cluster 
export RESOURCE_GROUP=<RESOURCE_GROUP_NAME>

# Azure region of Azure Event Grid and IoT Operations cluster
export LOCATION=<LOCATION>

# Name of the Azure Event Grid namespace
export EVENT_GRID_NAMESPACE=<EVENT_GRID_NAMESPACE>

# Name of the Arc-enabled IoT Operations cluster 
export CLUSTER_NAME=<CLUSTER_NAME>

# Subscription ID of Azure Event Grid and IoT Operations cluster
export SUBSCRIPTION_ID=<SUBSCRIPTION_ID>

Event Grid-Namespace mit aktiviertem MQTT-Broker erstellen

Erstellen eines Event Grid-Namespace mit Azure CLI. Der Speicherort sollte mit dem Speicherort übereinstimmen, den Sie zum Bereitstellen von Azure IoT Operations verwendet haben.

az eventgrid namespace create \
  --namespace-name $EVENT_GRID_NAMESPACE \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --topic-spaces-configuration "{state:Enabled,maximumClientSessionsPerAuthenticationName:3}"

Wenn die eventgrid-Erweiterung nicht installiert ist, erhalten Sie eine Eingabeaufforderung, in der Sie gefragt werden, ob Sie sie installieren möchten. Wählen Sie Y aus, um die Erweiterung zu installieren.

Durch Festlegen des topic-spaces-configuration erstellt dieser Befehl einen Namespace mit:

  • MQTT-Broker aktiviert
  • Maximale Clientsitzungen pro Authentifizierungsname als 3.

Die Option „Max.-Clientsitzungen“ ermöglicht Azure IoT Einsatz MQTT, mehrere Instanzen zu erzeugen und trotzdem eine Verbindung herzustellen. Weitere Informationen finden Sie unter Unterstützung für mehrere Sitzungen.

Erstellen eines Themenbereichs

Erstellen Sie im Event Grid-Namespace einen Themenbereich tutorial mit einer Themenvorlage telemetry/#.

az eventgrid namespace topic-space create \
  --resource-group $RESOURCE_GROUP \
  --namespace-name $EVENT_GRID_NAMESPACE \
  --name tutorial \
  --topic-templates "telemetry/#"

Mithilfe des Platzhalters # in der Themenvorlage können Sie in jedem Thema im telemetry Themenbereich veröffentlichen. Zum Beispiel: telemetry/temperature oder telemetry/humidity.

Gewähren des Zugangs zum Event Grid Themenbereich für die Azure IoT Einsatz

Suchen Sie mithilfe der Azure CLI die Prinzipal-ID für die Arc-Erweiterung für Azure IoT Einsatz. Der Befehl speichert die Prinzipal-ID in einer Variablen für die spätere Verwendung.

export PRINCIPAL_ID=$(az k8s-extension list \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --cluster-type connectedClusters \
  --query "[?extensionType=='microsoft.iotoperations'].identity.principalId | [0]" -o tsv)
echo $PRINCIPAL_ID

Notieren Sie sich den Ausgabewert für identity.principalId, bei dem es sich um einen GUID-Wert mit dem folgenden Format handelt:

d84481ae-9181-xxxx-xxxx-xxxxxxxxxxxx

Verwenden Sie dann Azure CLI, um Azure IoT Einsatz MQTT die Herausgeber- und Abonnentenrolle für den von Ihnen erstellten Themenbereich zuzuweisen.

Zuweisen der Herausgeberrolle:

az role assignment create \
  --assignee $PRINCIPAL_ID \
  --role "EventGrid TopicSpaces Publisher" \
  --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.EventGrid/namespaces/$EVENT_GRID_NAMESPACE/topicSpaces/tutorial

Zuweisen der Abonnentenrolle:

az role assignment create \
  --assignee $PRINCIPAL_ID \
  --role "EventGrid TopicSpaces Subscriber" \
  --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.EventGrid/namespaces/$EVENT_GRID_NAMESPACE/topicSpaces/tutorial

Tipp

Der Umfang entspricht dem id des Themenbereichs, den Sie mit az eventgrid namespace topic-space create im vorherigen Schritt erstellt haben. Sie können ihn der Ausgabe des Befehls finden.

Hostname des Event Grid MQTT-Brokers

Verwenden Sie Azure CLI, um den Hostnamen des Event Grid MQTT-Brokers abzurufen.

az eventgrid namespace show \
  --resource-group $RESOURCE_GROUP \
  --namespace-name $EVENT_GRID_NAMESPACE \
  --query topicSpacesConfiguration.hostname \
  -o tsv

Notieren Sie sich den Ausgabewert für topicSpacesConfiguration.hostname, bei dem es sich um einen Hostnamenwert handelt, der wie folgt aussieht:

example.region-1.ts.eventgrid.azure.net

Erstellen eines Azure Event Grid-Datenflussendpunkts

Erstellen Sie den Datenflussendpunkt für das Azure Event Grid. Dieser Endpunkt ist das Ziel für den Datenfluss, der Nachrichten an Azure Event Grid sendet. Ersetzen Sie <EVENT_GRID_HOSTNAME> durch den MQTT-Hostnamen, den Sie im vorherigen Schritt ermittelt haben. Schließen Sie die Portnummer 8883 ein.

Der Datenfluss und die Datenflussendpunkte für Azure Event Grid können als Azure-Standardressourcen bereitgestellt werden, da sie über Azure Resource Provider-Implementierungen verfügen. Diese Bicep-Vorlagendatei aus der Bicep-Datei für das MQTT-Bridge Dataflow Tutorial stellt die erforderlichen Datenfluss- und Datenflussendpunkte bereit.

Laden Sie die Datei auf Ihren lokales Computer herunter, und stellen Sie sicher, dass Sie die Werte für customLocationName, aioInstanceName eventGridHostName durch Ihre eigenen Werte ersetzen.

param customLocationName string = '<CUSTOM_LOCATION_NAME>'
param aioInstanceName string = '<AIO_INSTANCE_NAME>'
param eventGridHostName string = '<EVENT_GRID_HOSTNAME>:8883'

resource customLocation 'Microsoft.ExtendedLocation/customLocations@2021-08-31-preview' existing = {
  name: customLocationName
}

resource aioInstance 'Microsoft.IoTOperations/instances@2024-11-01' existing = {
  name: aioInstanceName
}
resource remoteMqttBrokerDataflowEndpoint 'Microsoft.IoTOperations/instances/dataflowEndpoints@2024-11-01' = {
  parent: aioInstance
  name: 'eventgrid'
  extendedLocation: {
    name: customLocation.id
    type: 'CustomLocation'
  }
  properties: {
    endpointType: 'Mqtt'
    mqttSettings: {
      host: eventGridHostName
      authentication: {
        method: 'SystemAssignedManagedIdentity'
        systemAssignedManagedIdentitySettings: {}
      }
      tls: {
        mode: 'Enabled'
      }
    }
  }
}

Führen Sie als Nächstes in Ihrem Terminal den folgenden Befehl aus. Ersetzen Sie <FILE> durch den Namen der heruntergeladenen Bicep-Datei.

az deployment group create --resource-group <RESOURCE_GROUP> --template-file <FILE>.bicep

Hier wird die Authentifizierungsmethode so festgelegt, dass SystemAssignedManagedIdentity die verwaltete Identität der Azure IoT Einsatz-Erweiterung zur Authentifizierung beim MQTT-Broker von Event Grid verwendet wird. Diese Einstellung funktioniert, weil die Azure IoT Einsatz-Erweiterung über die erforderlichen Berechtigungen zum Veröffentlichen und Abonnieren des Event Grid-Themenbereichs verfügt, die über Azure RBAC-Rollen konfiguriert werden. Beachten Sie, dass in der Konfiguration keine Geheimnisse wie Benutzername oder Kennwort erforderlich sind.

Da der MQTT-Broker von Event Grid TLS erfordert, ist die Einstellung tls aktiviert. Es ist nicht erforderlich, ein vertrauenswürdiges Zertifizierungsstellenzertifikat bereitzustellen, da der Event Grid MQTT-Broker eine vertrauenswürdige Zertifizierungsstelle verwendet.

Erstellen von Dataflows

Erstellen Sie zwei Datenflüsse mit dem MQTT-Brokerendpunkt von Azure IoT Einsatz als Quelle und dem Azure Event Grid-Endpunkt als Ziel und umgekehrt. Die Transformation muss nicht konfiguriert werden.

param customLocationName string = '<CUSTOM_LOCATION_NAME>'
param aioInstanceName string = '<AIO_INSTANCE_NAME>'

resource customLocation 'Microsoft.ExtendedLocation/customLocations@2021-08-31-preview' existing = {
  name: customLocationName
}
resource aioInstance 'Microsoft.IoTOperations/instances@2024-11-01' existing = {
  name: aioInstanceName
}
resource defaultDataflowProfile 'Microsoft.IoTOperations/instances/dataflowProfiles@2024-11-01' existing = {
  parent: aioInstance
  name: 'default'
}
resource dataflow_1 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-11-01' = {
  parent: defaultDataflowProfile
  name: 'local-to-remote'
  extendedLocation: {
    name: customLocation.id
    type: 'CustomLocation'
  }
  properties: {
    mode: 'Enabled'
    operations: [
      {
        operationType: 'Source'
        sourceSettings: {
          endpointRef: 'default'
          serializationFormat: 'Json'
          dataSources: array('tutorial/local')
        }
      }
      {
        operationType: 'BuiltInTransformation'

        builtInTransformationSettings: {
        serializationFormat: 'Json'
        datasets: []
        filter: []
        map: [
          {
            type: 'PassThrough'
            inputs: [
              '*'
            ]
            output: '*'
          }
        ]
        }
      }
      {
        operationType: 'Destination'
        destinationSettings: {
          endpointRef: 'eventgrid'
          dataDestination: 'telemetry/aio'
        }
      }
    ]
  }
} 
resource dataflow_2 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-11-01' = {
  parent: defaultDataflowProfile
  name: 'remote-to-local'
  extendedLocation: {
    name: customLocation.id
    type: 'CustomLocation'
  }
  properties: {
    mode: 'Enabled'
    operations: [
      {
        operationType: 'Source'
        sourceSettings: {
          endpointRef: 'eventgrid'
          serializationFormat: 'Json'
          dataSources: array('telemetry/#')
        }
      }
      {
        operationType: 'BuiltInTransformation'

        builtInTransformationSettings: {
        serializationFormat: 'Json'
        datasets: []
        filter: []
        map: [
          {
            type: 'PassThrough'
            inputs: [
              '*'
            ]
            output: '*'
          }
        ]
        }
      }
      {
        operationType: 'Destination'
        destinationSettings: {
          endpointRef: 'default'
          dataDestination: 'tutorial/cloud'
        }
      }
    ]
  }
}

Führen Sie wie beim Datenendpunkt in Ihrem Terminal den folgenden Befehl aus:

az deployment group create --resource-group <RESOURCE_GROUP> --template-file <FILE>.bicep

Zusammen bilden die beiden Datenflüsse eine MQTT-Brücke, wo Sie Folgendes tun können:

  • Verwenden des Event Grid MQTT-Brokers als Remote-Broker
  • Verwenden des lokalen MQTT-Brokers von Azure IoT Einsatz als lokalen Broker
  • Verwenden von TLS für Remote-Broker und lokale Broker
  • Verwenden der systemseitig zugewiesenen verwalteten Identität für die Authentifizierung bei dem Remote-Broker
  • Verwenden des Kubernetes-Dienstkontos für die Authentifizierung für den lokalen Broker
  • Verwenden der Themenzuordnung zum Zuordnen des Themas tutorial/local zum Thema telemetry/aio des Remote-Brokers
  • Verwenden Sie die Themenzuordnung, um das Thema telemetry/# auf dem Remote-Broker dem Thema tutorial/cloud auf dem lokalen Broker zuzuordnen

Hinweis

Standardmäßig stellt Azure IoT Einsatz einen MQTT-Broker sowie einen MQTT-Broker-Datenflussendpunkt bereit. Der MQTT-Broker-Datenflussendpunkt wird verwendet, um eine Verbindung mit dem MQTT-Broker herzustellen. In der Standardkonfiguration wird das integrierte Dienstkontotoken für die Authentifizierung verwendet. Der Endpunkt trägt den Namen default und ist im selben Namespace wie Azure IoT Einsatz verfügbar. Der Endpunkt wird als Quelle für den Dataflow verwendet, der in diesem Tutorial erstellt wird. Weitere Informationen zum MQTT-Broker-Standard-Datenflussendpunkt finden Sie unter Lokaler MQTT-Broker-Standardendpunkt für Azure IoT Einsatz.

Wenn Sie das Thema tutorial/local auf dem lokalen MQTT Broker von Azure IoT Einsatz veröffentlichen, wird die Nachricht mit dem Thema telemetry/aio zum Remote-MQ Broker von Event Grid überbrückt. Anschließend wird die Nachricht zurück zum Thema tutorial/cloud (weil es vom Platzhalterthema telemetry/# erfasst wird) auf dem lokalen Azure IoT Operations MQTT-Broker überbrückt. Ebenso wird die Nachricht, wenn Sie das Thema telemetry/aio auf dem Remote Event Grid MQTT Broker veröffentlichen, mit dem Thema tutorial/cloud zum lokalen MQTT Broker von Azure IoT Einsatz überbrückt.

Bereitstellen des MQTT-Clients

Um zu überprüfen, ob die MQTT-Brücke funktioniert, stellen Sie einen MQTT-Client im selben Namespace wie Azure IoT Einsatz bereit. Geben Sie in einer neuen Datei mit dem Namen client.yaml die Clientbereitstellung an:

Derzeit ist bicep nicht für die Bereitstellung des MQTT-Clients anwendbar.

Starten eines Abonnenten

Verwenden Sie kubectl exec, um eine Shell im Mosquitto-Client-Pod zu starten.

kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh

Starten Sie innerhalb der Shell einen Abonnenten des Azure IoT Einsatz-Brokers im Themenbereich tutorial/# mit mosquitto_sub.

mosquitto_sub --host aio-broker --port 18883 \
  -t "tutorial/#" \
  --debug --cafile /var/run/certs/ca.crt \
  -D CONNECT authentication-method 'K8S-SAT' \
  -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)

Lassen Sie den Befehl laufen und öffnen Sie ein neues Terminalfenster.

Veröffentlichen von MQTT-Nachrichten in der Cloud über die Brücke

Starten Sie in einem neuen Terminalfenster eine weitere Shell im Mosquitto-Client-Pod.

kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh

Verwenden Sie mosquitto in der Shell, um fünf Nachrichten im Thema tutorial/local zu veröffentlichen.

mosquitto_pub -h aio-broker -p 18883 \
  -m "This message goes all the way to the cloud and back!" \
  -t "tutorial/local" \
  --repeat 5 --repeat-delay 1 -d \
  --debug --cafile /var/run/certs/ca.crt \
  -D CONNECT authentication-method 'K8S-SAT' \
  -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)

Anzeigen der Nachrichten im Abonnenten

In der Abonnentenshell werden die von Ihnen veröffentlichten Nachrichten angezeigt.

Hier sehen Sie, dass die Nachrichten im lokalen Azure IoT Einsatz-Broker im Thema tutorial/local veröffentlicht werden, zum Event Grid MQTT Broker überbrückt und dann wieder zum lokalen Azure IoT Einsatz-Broker im Thema tutorial/cloud überbrückt werden. Die Nachrichten werden dann an den Abonnenten übermittelt. In diesem Beispiel beträgt die Roundtrip-Zeit etwa 80 ms.

Überprüfen von Event Grid-Metriken, um die Nachrichtenübermittlung zu überprüfen

Sie können auch die Event-Grid-Metriken überprüfen, um zu verifizieren, dass die Nachrichten an den Event Grid MQTT-Broker übermittelt werden. Wechseln Sie im Azure-Portal zu dem von Ihnen erstellten Event Grid-Namespace. Unter Metriken>MQTT: Erfolgreich veröffentlichte Nachrichten. Die Anzahl der veröffentlichten und übermittelten Nachrichten sollte sich beim Veröffentlichen von Nachrichten an den lokalen Azure IoT Einsatz-Broker erhöhen.

Screenshot der Metrikansicht im Azure-Portal mit erfolgreichen MQTT-Nachrichten.

Tipp

Sie können die Konfigurationen von Datenflüssen, QoS und Nachrichtenrouten mit der CLI-Erweiterung az iot ops check --detail-level 2 überprüfen.

Nächste Schritte

In diesem Tutorial haben Sie erfahren, wie Sie Azure IoT Einsatz für eine bidirektionale MQTT-Brücke mit dem Azure Event Grid MQTT-Broker konfiguriert. Erkunden Sie als Nächstes die folgenden Szenarien:

  • Wenn Sie einen MQTT-Client verwenden möchten, um Nachrichten direkt im Event Grid MQTT-Broker zu veröffentlichen, lesen Sie Veröffentlichen von MQTT-Nachrichten im Event Grid MQTT-Broker. Weisen Sie dem Client eine Herausgeberberechtigungsbindung an den von Ihnen erstellten Themenbereich zu, und Sie können Nachrichten in einem beliebigen Thema unter dem telemetry veröffentlichen, wie telemetry/temperature oder telemetry/humidity. Alle diese Nachrichten werden mit dem Thema tutorial/cloud im lokalen Azure IoT Operations-Broker verknüpft.
  • Zum Einrichten von Routingregeln für den Event Grid MQTT-Broker, siehe Konfigurieren von Routingregeln für den Event Grid MQTT-Broker. Mithilfe von Routingregeln können Sie Nachrichten basierend auf dem Themennamen an verschiedene Themen weiterleiten oder Nachrichten basierend auf dem Nachrichteninhalt filtern.