Partager via


Tutoriel : Pont MQTT bidirectionnel vers Azure Event Grid

Important

Opérations Azure IoT Préversion avec Azure Arc est actuellement en préversion. Vous ne devez pas utiliser ce logiciel en préversion dans des environnements de production.

Vous devrez déployer une nouvelle installation d’Azure IoT Operations lorsqu’une version généralement disponible sera disponible. Vous ne pourrez pas mettre à niveau une installation en préversion.

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 configurer un pont MQTT bidirectionnel entre un répartiteur Azure IoT Operations MQTT et Azure Event Grid. Pour simplifier le didacticiel, utilisez les paramètres par défaut pour le répartiteur Azure IoT Operations MQTT et les points de terminaison Azure Event Grid, et aucune transformation n’est appliquée.

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 à Opérations Azure IoT MQTT de créer 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 à Opérations Azure IoT l’accès à l’espace de rubrique Event Grid

À l’aide d’Azure CLI, recherchez l’ID de principal de l’extension Opérations Azure IoT Arc. La commande stocke l’ID du principal dans une variable pour une utilisation ultérieure.

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

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é à Opérations Azure IoT MQTT 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

Comprendre le point de terminaison de flux de données de l’agent MQTT Opérations Azure IoT par défaut

Par défaut, Opérations Azure IoT déploie un agent MQTT ainsi qu’un point de terminaison de flux de données de l’agent MQTT. Le point de terminaison de flux de données de l’agent MQTT est utilisé pour se connecter à l’agent MQTT. La configuration par défaut utilise le jeton de compte de service intégré pour l’authentification. Le point de terminaison est nommé default et est disponible dans le même espace de noms que les opérations Azure IoT. Le point de terminaison est utilisé comme source pour les flux de données que vous créez dans les étapes suivantes.

Pour en savoir plus sur le point de terminaison de flux de données de l’agent MQTT par défaut, consultez Point de terminaison de l’agent MQTT local Opérations Azure IoT.

Créer un point de terminaison de flux de données Azure Event Grid

Créer un point d’arrivée de flux de données pour Azure Event Grid. Ce point de terminaison est la destination du flux de données qui envoie des messages à Azure Event Grid. Remplacez <EVENT_GRID_HOSTNAME> par le nom d’hôte MQTT récupéré à l’étape précédente. Incluez le numéro de port 8883.

Le flux de données et les points de terminaison de flux de données Azure Event Grid peuvent être déployés en tant que ressources Azure standard, car ils disposent d’implémentations de fournisseur de ressources Azure (RP). Ce fichier de modèle Bicep tiré du tutoriel sur les flux de données de pont MQTT déploie les flux de données et points de terminaison de flux de données nécessaires.

Téléchargez le fichier sur votre ordinateur local et veillez à remplacer les valeurs pour customLocationName, aioInstanceName, eventGridHostName avec les vôtres.

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-09-15-preview' existing = {
  name: aioInstanceName
}
resource remoteMqttBrokerDataflowEndpoint 'Microsoft.IoTOperations/instances/dataflowEndpoints@2024-09-15-preview' = {
  parent: aioInstance
  name: 'eventgrid'
  extendedLocation: {
    name: customLocation.id
    type: 'CustomLocation'
  }
  properties: {
    endpointType: 'Mqtt'
    mqttSettings: {
      host: eventGridHostName
      authentication: {
        method: 'SystemAssignedManagedIdentity'
        systemAssignedManagedIdentitySettings: {}
      }
      tls: {
        mode: 'Enabled'
      }
    }
  }
}

Ensuite, exécutez la commande suivante dans votre terminal. Remplacez <FILE> par le nom du fichier Bicep que vous avez téléchargé.

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

Ici, la méthode d’authentification est définie sur SystemAssignedManagedIdentity pour utiliser l’identité managée de l’extension Opérations Azure IoT pour s’authentifier auprès du répartiteur MQTT Event Grid. Ce paramètre fonctionne, car l’extension Opérations Azure IoT dispose des autorisations nécessaires pour publier et s’abonner à l’espace de rubrique Event Grid configuré via des rôles RBAC Azure. Notez qu’aucun secret, tel que le nom d’utilisateur ou le mot de passe, n’est nécessaire dans la configuration.

Étant donné que le répartiteur MQTT Event Grid nécessite TLS, le paramètre tls est activé. Il n’est pas nécessaire de fournir un certificat d’autorité de certification approuvé, car le répartiteur MQTT Event Grid utilise une autorité de certification largement approuvée.

Créer des dataflows

Créez deux flux de données avec le point de terminaison du répartiteur Opérations Azure IoT MQTT en tant que source et point de terminaison Azure Event Grid comme destination, et vice versa. Aucun besoin de configurer la transformation.

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-09-15-preview' existing = {
  name: aioInstanceName
}
resource defaultDataflowProfile 'Microsoft.IoTOperations/instances/dataflowProfiles@2024-09-15-preview' existing = {
  parent: aioInstance
  name: 'default'
}
resource dataflow_1 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-09-15-preview' = {
  parent: defaultDataflowProfile
  name: 'local-to-remote'
  extendedLocation: {
    name: customLocation.id
    type: 'CustomLocation'
  }
  properties: {
    mode: 'Enabled'
    operations: [
      {
        operationType: 'Source'
        sourceSettings: {
          endpointRef: 'default'
          dataSources: array('tutorial/local')
        }
      }
      {
        operationType: 'Destination'
        destinationSettings: {
          endpointRef: remoteMqttBrokerDataflowEndpoint.name
          dataDestination: 'telemetry/aio'
        }
      }
    ]
  }
} 
resource dataflow_2 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-09-15-preview' = {
  parent: defaultDataflowProfile
  name: 'remote-to-local'
  extendedLocation: {
    name: customLocation.id
    type: 'CustomLocation'
  }
  properties: {
    mode: 'Enabled'
    operations: [
      {
        operationType: 'Source'
        sourceSettings: {
          endpointRef: remoteMqttBrokerDataflowEndpoint.name
          dataSources: array('telemetry/#')
        }
      }
      {
        operationType: 'Destination'
        destinationSettings: {
          endpointRef: 'default'
          dataDestination: 'tutorial/cloud'
        }
      }
    ]
  }
} 

Comme pour le point de terminaison du flux de données, exécutez la commande suivante dans votre terminal :

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

Ensemble, les deux flux de données forment un pont MQTT, où vous :

  • Utiliser MQTT Broker Event Grid comme répartiteur distant
  • Utilisez le répartiteur Opérations Azure IoT MQTT 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/aio 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 le tutorial/localsujet du courtier Opérations Azure IoT MQTT local, le message est relié au telemetry/aio sujet du courtier MQTT Event Grid distant. Ensuite, le message est renvoyé au tutorial/cloud sujet (car le telemetry/# sujet à caractère générique la capture) sur le répartiteur Opérations Azure IoT MQTT locales. De même, lorsque vous publiez sur le telemetry/aio sujet du courtier MQTT Event Grid distant, le message est relié au tutorial/cloud sujet du courtier Opérations Azure IoT MQTT local.

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 Opérations Azure IoT. Dans un nouveau fichier nommé client.yaml, spécifiez le déploiement du client :

Actuellement, bicep ne s’applique pas au déploiement du client MQTT.

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 Opérations Azure IoT sur l’espace de rubrique tutorial/# avec 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)

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

Afficher les messages dans l’abonné

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

Ici, vous voyez que les messages sont publiés sur le répartiteur Opérations Azure IoT local dans la rubrique tutorial/local , pontés vers MQTT Broker Event Grid, puis renvoyés au répartiteur Opérations Azure IoT 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 Opérations Azure IoT 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 flux de données, 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 Opérations Azure IoT 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 Opérations Azure IoT 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.