Partage via


Tutoriel : configurer un pont MQTT entre Azure IoT MQ (préversion) et Azure Event Grid

Important

Opérations Azure IoT (préversion) – activé parc Azure Arc est actuellement en PRÉVERSION. Vous ne devez pas utiliser ce logiciel en préversion dans des environnements de production.

Pour connaître les conditions juridiques qui s’appliquent aux fonctionnalités Azure en version bêta, en préversion ou plus généralement non encore en disponibilité générale, consultez l’Avenant aux conditions d’utilisation des préversions de Microsoft Azure.

Dans ce tutoriel, vous allez apprendre à configurer IoT MQ pour un pont MQTT bidirectionnel avec Azure Event Grid MQTT Broker PaaS. Vous pouvez utiliser cette fonctionnalité pour traiter vos données IoT à la périphérie et dans le cloud. Par exemple, vous pouvez utiliser IoT MQ pour traiter les données de télémétrie à la périphérie, puis relier les données à Azure Event Grid pour un traitement plus approfondi dans le cloud.

Prérequis

Définir des variables d’environnement

Se connecter avec Azure CLI :

az login

Définissez des variables d’environnement pour le reste de la configuration. Remplacez les valeurs dans <> par des valeurs ou des noms valides de votre choix. Un nouvel espace de noms et un espace de rubrique Azure Event Grid sont créés dans votre abonnement Azure en fonction des noms que vous fournissez :

# 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>

Créer un espace de noms Event Grid avec MQTT Broker activé

Créer un espace de noms Event Grid avec Azure CLI. L’emplacement doit être identique à celui que vous avez utilisé pour déployer des opérations Azure IoT.

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

En définissant le topic-spaces-configuration, cette commande crée un espace de noms avec :

  • MQTT broker activé
  • Nombre maximal de sessions clientes par nom d’authentification 3.

L’option max client sessions permet à IoT MQ de générer plusieurs instances et de se connecter. Pour plus d’informations, consultez support multisession.

Créer un espace de rubrique

Dans l’espace de noms Event Grid, créez un espace de rubrique nommé tutorial avec un modèle de rubrique telemetry/#.

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

En utilisant le caractère générique # dans le modèle de rubrique, vous pouvez publier sur n’importe quelle rubrique sous l’espace de rubriquetelemetry. Par exemple, telemetry/temperature ou telemetry/humidity.

Accorder à Azure IoT MQ préversion l’accès à l’espace de rubrique Event Grid

À l’aide de az k8s-extension show, recherchez l’ID de principal de l’extension Azure IoT MQ Arc. La commande stocke l’ID du principal dans une variable pour une utilisation ultérieure.

export PRINCIPAL_ID=$(az k8s-extension show \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name mq \
  --cluster-type connectedClusters \
  --query identity.principalId -o tsv)
echo $PRINCIPAL_ID

Notez la valeur de sortie de identity.principalId, qui est une valeur GUID au format suivant :

d84481ae-9181-xxxx-xxxx-xxxxxxxxxxxx

Ensuite, utilisez Azure CLI pour attribuer des rôles d’éditeur et d’abonné à IoT MQ pour l’espace de rubrique que vous avez créé.

Attribuez le rôle d’éditeur :

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

Attribuez le rôle d’abonné :

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

Conseil

L’étendue correspond à la id de l’espace de rubrique que vous avez créé avec az eventgrid namespace topic-space create à l’étape précédente, et vous pouvez la trouver dans la sortie de la commande.

Nom d’hôte du MQTT Broker Event Grid

Utilisez Azure CLI pour obtenir le nom d’hôte du MQTT Broker Event Grid.

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

Prenez note de la valeur de sortie pour topicSpacesConfiguration.hostname qui est une valeur de nom d’hôte qui ressemble à ceci :

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

Créer un connecteur de pont MQTT et des ressources de mappage de rubriques

Dans un nouveau fichier nommé bridge.yaml, spécifiez la configuration du connecteur de pont MQTT et de la carte de rubriques. Remplacez l’exemple de valeur d’espace réservé dans remoteBrokerConnection endpoint par le nom d’hôte MQTT Event Grid de l’étape précédente. Incluez le numéro de port 8883.

apiVersion: mq.iotoperations.azure.com/v1beta1
kind: MqttBridgeConnector
metadata:
  name: tutorial-bridge
  namespace: azure-iot-operations
spec:
  image: 
    repository: mcr.microsoft.com/azureiotoperations/mqttbridge
    tag: 0.4.0-preview
    pullPolicy: IfNotPresent
  protocol: v5
  bridgeInstances: 2
  logLevel: debug
  remoteBrokerConnection:
    endpoint: example.region-1.ts.eventgrid.azure.net:8883
    tls:
      tlsEnabled: true
    authentication:
      systemAssignedManagedIdentity:
        audience: https://eventgrid.azure.net
  localBrokerConnection:
    endpoint: aio-mq-dmqtt-frontend:8883
    tls:
      tlsEnabled: true
      trustedCaCertificateConfigMap: aio-ca-trust-bundle-test-only
    authentication:
      kubernetes: {}
---
apiVersion: mq.iotoperations.azure.com/v1beta1
kind: MqttBridgeTopicMap
metadata:
  name: tutorial-topic-map
  namespace: azure-iot-operations 
spec:
  mqttBridgeConnectorRef: tutorial-bridge
  routes:
    - direction: local-to-remote
      name: publish
      source: tutorial/local
      target: telemetry/iot-mq
      qos: 1
    - direction: remote-to-local
      name: subscribe
      source: telemetry/#
      target: tutorial/cloud
      qos: 1

Vous configurez le connecteur de pont MQTT sur :

  • Utiliser MQTT Broker Event Grid comme répartiteur distant
  • Utiliser le répartiteur IoT MQ local comme répartiteur local
  • Utiliser TLS pour les répartiteurs distants et locaux
  • Utiliser l’identité managée affectée par le système pour l’authentification auprès du répartiteur distant
  • Utiliser le compte de service Kubernetes pour l’authentification auprès du répartiteur local
  • Utilisez le mappage de rubriques pour mapper la rubrique tutorial/local à la rubrique telemetry/iot-mq sur le répartiteur distant
  • Utilisez le mappage de rubriques pour mapper la rubrique telemetry/# sur le répartiteur distant à la rubrique tutorial/cloud sur le répartiteur local

Lorsque vous publiez sur la rubrique tutorial/local sur le répartiteur MQ IoT local, le message est ponté vers la rubrique telemetry/iot-mq sur MQTT Broker Event Grid distant. Ensuite, le message est renvoyé à la rubrique tutorial/cloud sur le répartiteur IoT MQ local. Lorsque vous publiez sur la rubrique telemetry/iot-mq sur le MQTT Broker Event Grid local, le message est ponté vers la rubrique tutorial/cloud sur le MQTT Broker Event Grid distant.

Appliquez le fichier de déploiement avec kubectl.

kubectl apply -f bridge.yaml
mqttbridgeconnector.mq.iotoperations.azure.com/tutorial-bridge created
mqttbridgetopicmap.mq.iotoperations.azure.com/tutorial-topic-map created

Vérifier le déploiement du pont MQTT

Utilisez kubectl pour vérifier que les deux instances de pont sont prêtes et en cours d’exécution.

kubectl get pods -n azure-iot-operations -l app=aio-mq-mqttbridge
NAME                       READY   STATUS    RESTARTS   AGE
aio-mq-tutorial-bridge-0   1/1     Running   0          45s
aio-mq-tutorial-bridge-1   1/1     Running   0          45s

Vous pouvez maintenant publier sur le répartiteur local et vous abonner au MQTT Broker Event Grid et vérifier le flux de messages comme prévu.

Déployer le client MQTT

Pour vérifier que le pont MQTT fonctionne, déployez un client MQTT sur le même espace de noms que IoT MQ. Dans un nouveau fichier nommé client.yaml, spécifiez le déploiement du client :

apiVersion: v1
kind: Pod
metadata:
  name: mqtt-client
  namespace: azure-iot-operations
spec:
  serviceAccountName: mqtt-client
  containers:
  - image: alpine
    name: mqtt-client
    command: ["sh", "-c"]
    args: ["apk add mosquitto-clients mqttui && sleep infinity"]
    volumeMounts:
    - name: mq-sat
      mountPath: /var/run/secrets/tokens
    - name: trust-bundle
      mountPath: /var/run/certs
  volumes:
  - name: mq-sat
    projected:
      sources:
      - serviceAccountToken:
          path: mq-sat
          audience: aio-mq
          expirationSeconds: 86400
  - name: trust-bundle
    configMap:
      name: aio-ca-trust-bundle-test-only

Appliquez le fichier de déploiement avec kubectl.

kubectl apply -f client.yaml
pod/mqtt-client created

Démarrer un abonné

Utilisez kubectl exec pour démarrer un interpréteur de commandes dans le pod client mosquitto.

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

À l’intérieur de l’interpréteur de commandes, démarrez un abonné au répartiteur MQ IoT sur l’espace de rubrique tutorial/# avec mqttui.

mqttui log "tutorial/#" \
-b mqtts://aio-mq-dmqtt-frontend:8883 \
-u '$sat' \
--password $(cat /var/run/secrets/tokens/mq-sat) \
--insecure

Laissez la commande en cours d’exécution et ouvrez une nouvelle fenêtre de terminal.

Publier des messages MQTT dans le cloud via le pont

Dans une nouvelle fenêtre de terminal, démarrez un autre interpréteur de commandes dans le pod client mosquitto.

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

Dans l’interpréteur de commandes, utilisez mosquitto pour publier cinq messages dans la rubrique tutorial/local.

mosquitto_pub -h aio-mq-dmqtt-frontend -p 8883 \
-m "This message goes all the way to the cloud and back!" \
-t "tutorial/local" -u '$sat' -P $(cat /var/run/secrets/tokens/mq-sat) \
--cafile /var/run/certs/ca.crt \
--repeat 5 --repeat-delay 1 -d

Afficher les messages dans l’abonné

Dans l’interpréteur de commandes de l’abonné, vous voyez les messages que vous avez publiés.

23:17:50.802 QoS:AtMostOnce  tutorial/local     Payload( 52): This message goes all the way to the cloud and back!
23:17:51.086 QoS:AtMostOnce  tutorial/cloud     Payload( 52): This message goes all the way to the cloud and back!
23:17:51.803 QoS:AtMostOnce  tutorial/local     Payload( 52): This message goes all the way to the cloud and back!
23:17:51.888 QoS:AtMostOnce  tutorial/cloud     Payload( 52): This message goes all the way to the cloud and back!
23:17:52.804 QoS:AtMostOnce  tutorial/local     Payload( 52): This message goes all the way to the cloud and back!
23:17:52.888 QoS:AtMostOnce  tutorial/cloud     Payload( 52): This message goes all the way to the cloud and back!
23:17:53.805 QoS:AtMostOnce  tutorial/local     Payload( 52): This message goes all the way to the cloud and back!
23:17:53.895 QoS:AtMostOnce  tutorial/cloud     Payload( 52): This message goes all the way to the cloud and back!
23:17:54.807 QoS:AtMostOnce  tutorial/local     Payload( 52): This message goes all the way to the cloud and back!
23:17:54.881 QoS:AtMostOnce  tutorial/cloud     Payload( 52): This message goes all the way to the cloud and back!

Ici, vous voyez que les messages sont publiés sur le répartiteur MQ IoT local dans la rubrique tutorial/local , pontés vers MQTT Broker Event Grid, puis renvoyés au répartiteur IoT MQ local sur la rubrique tutorial/cloud . Les messages sont ensuite remis à l’abonné. Dans cet exemple, le temps d’aller-retour est d’environ 80 ms.

Vérifier les métriques Event Grid pour vérifier la remise des messages

Vous pouvez également vérifier les métriques Event Grid pour vérifier que les messages sont remis au MQTT Broker Event Grid. Dans le portail Azure, accédez à l’espace de noms Event Grid que vous avez créé. Sous Métriques>MQTT : Messages publiés réussis. Vous devez voir le nombre de messages publiés et remis augmenter lorsque vous publiez des messages sur le répartiteur IoT MQ local.

Capture d’écran de la vue des métriques dans le portail Azure pour montrer les messages MQTT réussis.

Conseil

Vous pouvez vérifier les configurations des cartes de rubriques, de la QoS et des routes de message avec l’extension CLI az iot ops check --detail-level 2.

Étapes suivantes

Dans ce tutoriel, vous avez appris à configurer IoT MQ pour le pont MQTT bidirectionnel avec le MQTT Broker Azure Event Grid. À l’étape suivante, explorez les scénarios suivants :

  • Pour utiliser un client MQTT pour publier des messages directement sur le MQTT Broker Event Grid, consultez Publier des messages MQTT sur le MQTT Broker Event Grid. Donnez au client une liaison d’autorisation d’éditeur à l’espace de rubrique que vous avez créé et vous pouvez publier des messages dans n’importe quelle rubrique sous le telemetry, comme telemetry/temperature ou telemetry/humidity. Tous ces messages sont liés à la rubrique tutorial/cloud sur le répartiteur IoT MQ local.
  • Pour configurer des règles de routage pour le MQTT Broker Event Grid, consultez Configurer des règles d’acheminement pour le MQTT Broker Event Grid. Vous pouvez utiliser des règles d’acheminement pour router les messages vers différentes rubriques en fonction du nom de la rubrique ou pour filtrer les messages en fonction du contenu du message.