Tutoriel : Pont MQTT bidirectionnel vers Azure Event Grid
Important
Cette page inclut des instructions pour la gestion des composants Azure IoT Operations à l’aide des manifestes de déploiement Kubernetes, qui sont en version préliminaire. Cette fonctionnalité est fournie avec plusieurs limitations et ne doit pas être utilisée pour les charges de travail 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 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
- Opérations Azure IoT. Consultez Déployer Opérations Azure IoT.
- Profil de flux de données. Voir Configurer un profil de flux de données.
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}"
Si l’extension eventgrid
n’est pas installée, il vous est demandé si vous voulez l’installer. Sélectionnez Y
pour installer l’extension.
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
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-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'
}
}
}
}
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-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'
}
}
]
}
}
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 rubriquetelemetry/aio
sur le répartiteur distant - Utilisez le mappage de rubriques pour mapper la rubrique
telemetry/#
sur le répartiteur distant à la rubriquetutorial/cloud
sur le répartiteur local
Remarque
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 créés dans ce tutoriel. 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.
Lorsque vous publiez sur le tutorial/local
sujet 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.
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
, commetelemetry/temperature
outelemetry/humidity
. Tous ces messages sont liés à la rubriquetutorial/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.