Partager via


Didacticiel : 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 préversion. 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 didacticiel, vous allez configurer un pont MQTT bidirectionnel entre un MQTT broker d’Opérations Azure IoT et Azure Event Grid. Pour simplifier le didacticiel, utilisez les paramètres par défaut du MQTT broker d’Opérations Azure IoT et des points de terminaison Azure Event Grid, sans appliquer de transformation.

Prérequis

Définir des variables d’environnement

Connectez-vous 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 Azure Event Grid et un espace de rubrique 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 le 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 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, une invite s’affiche pour vous demander si vous voulez l’installer. Sélectionnez Y pour installer l’extension.

En définissant 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 de sessions clientes maximales permet à Opérations Azure IoT MQTT de lancer plusieurs instances tout en restant connecté. 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 sensor/#.

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

En utilisant le caractère générique # dans le modèle de rubrique, vous pouvez publier sur n’importe quelle rubrique dans l’espace de rubrique sensor. Par exemple, sensor/temperature ou sensor/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 de 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 pour identity.principalId, qui est une valeur GUID avec le format suivant :

aaaaaaaa-bbbb-cccc-1111-222222222222

Ensuite, utilisez Azure CLI pour attribuer les 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 à l’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 le 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

Notez 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éez un point de terminaison 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 comme des ressources Azure standard, car ils possèdent des implémentations du fournisseurs de ressources Azure (RP). Ce fichier Bicep à partir de fichier Bicep pour le flux de données MQTT-bridge Tutorial déploie les points de terminaison de flux de données et de flux de données nécessaires.

Téléchargez le fichier sur votre ordinateur local et veillez à remplacer les valeurs de customLocationName, aioInstanceName, et eventGridHostName par 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 afin d’utiliser l’identité managée de l’extension Opérations Azure IoT pour s’authentifier auprès du MQTT broker 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 les 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 MQTT broker Event Grid requiert TLS, le paramètre tls est activé. Il n’est pas nécessaire de fournir un certificat d’autorité de certification approuvée, car le MQTT broker Event Grid utilise une autorité de certification largement approuvée.

Créer des flux de données

Créez deux flux de données avec le point de terminaison du MQTT broker d’Opérations Azure IoT comme source et le point de terminaison Azure Event Grid comme destination, et inversement. Il n’est pas nécessaire de configurer de 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: 'sensor/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('sensor/#')
        }
      }
      {
        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 de 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 pouvez :

  • Utiliser le MQTT broker Event Grid comme broker distant
  • Utiliser le MQTT broker local d’Opérations Azure IoT comme broker local
  • Utiliser TLS pour les brokers distant et local
  • Utiliser l’identité managée affectée par le système pour l’authentification auprès du broker distant
  • Utiliser le compte de service Kubernetes pour l’authentification auprès du broker local
  • Utiliser le mappage de rubriques pour mapper la rubrique tutorial/local à la rubrique sensor/aio sur le broker distant
  • Utiliser le mappage de rubriques pour mapper la rubrique sensor/# sur le broker distant à la rubrique tutorial/cloud sur le broker local

Remarque

Par défaut, Opérations Azure IoT déploie un MQTT broker ainsi qu’un point de terminaison de flux de données du MQTT broker. Le point de terminaison de flux de données du MQTT broker permet de se connecter au MQTT broker. La configuration par défaut utilise le jeton du 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 qu’Opérations Azure IoT. Le point de terminaison est utilisé comme source pour le flux de données créé dans ce didacticiel. Pour en savoir plus sur le point de terminaison par défaut du flux de données du MQTT broker, consultez Opérations Azure IoT - Point de terminaison par défaut du MQTT broker local.

Lorsque vous publiez sur la rubrique tutorial/local du MQTT broker local d’Opérations Azure IoT, le message est transféré à la rubrique sensor/aio du MQTT broker distant Event Grid. Ensuite, le message est retransféré vers la rubrique tutorial/cloud (car la rubrique générique sensor/# la capture) sur le MQTT broker local d’Opérations Azure IoT. De la même manière, lorsque vous publiez sur la rubrique sensor/aio du MQTT broker Event Grid distant, le message est transféré vers la rubrique tutorial/cloud sur le MQTT broker local d’Opérations Azure IoT.

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 qu’Opérations Azure IoT.

Actuellement, Bicep ne s’applique pas pour déployer un 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 broker 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 s’exécuter et ouvrez une nouvelle fenêtre de terminal.

Publiez des messages MQTT vers 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 sur 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.

Client null sending CONNECT
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received CONNACK (0)
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 sending SUBSCRIBE (Mid: 1, Topic: tutorial/#, QoS: 0, Options: 0x00)
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received SUBACK
Subscribed (mid: 1): 0
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 sending PINGREQ
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PINGRESP
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'tutorial/local', ... (52 bytes))
This message goes all the way to the cloud and back!
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'tutorial/local', ... (52 bytes))
This message goes all the way to the cloud and back!
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'tutorial/local', ... (52 bytes))
This message goes all the way to the cloud and back!
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'tutorial/local', ... (52 bytes))
This message goes all the way to the cloud and back!
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'tutorial/local', ... (52 bytes))
This message goes all the way to the cloud and back!
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 sending PINGREQ
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PINGRESP

Ici, vous voyez que les messages sont publiés sur le broker local d’Opérations Azure IoT dans la rubrique tutorial/local, transférés vers le MQTT broker Event Grid, puis retransférés vers le broker local d’Opérations Azure IoT sur la rubrique tutorial/cloud. Les messages sont ensuite remis à l’abonné. Dans cet exemple, le temps aller-retour est d’environ 80 ms.

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

Vous pouvez également consulter 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 avec succès. Vous devriez voir le nombre de messages publiés et remis augmenter à mesure que vous publiez des messages sur le broker local d’Opérations Azure IoT.

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

Conseil

Vous pouvez vérifier les configurations des flux de données, de la QoS et des routes de messages avec l’extension CLIaz iot ops check --detail-level 2.

Étapes suivantes

Dans ce didacticiel, vous avez appris à configurer Opérations Azure IoT pour un pont MQTT bidirectionnel avec le MQTT broker Azure Event Grid. À la prochaine étape, vous allez explorer les scénarios suivants :