Tutoriel : Créer une hiérarchie d’appareils IoT Edge

S’applique à :Coche IoT Edge 1.4 IoT Edge 1.4

Important

IoT Edge 1.4 est la version prise en charge. Si vous utilisez une version antérieure, consultez l’article Mettre à jour IoT Edge.

Vous pouvez déployer des nœuds Azure IoT Edge sur des réseaux organisés en couches hiérarchiques. Chaque couche d’une hiérarchie est un appareil de passerelle qui gère les messages et les requêtes des appareils situés dans la couche du dessous. Cette configuration est également appelée périphérie imbriquée.

Vous pouvez structurer une hiérarchie d’appareils de sorte que seule la couche supérieure soit connectée au cloud, et que les couches inférieures puissent uniquement communiquer avec les couches en amont et en aval adjacentes. Cette structure en couches réseau est la base de la plupart des réseaux industriels qui respectent la norme ISA-95.

Ce tutoriel vous guide dans la création d’une hiérarchie d’appareils IoT Edge, le déploiement de conteneurs de runtime IoT Edge sur vos appareils et la configuration locale de vos appareils. Vous effectuez les tâches suivantes :

  • Créer et définir les relations dans une hiérarchie d’appareils IoT Edge.
  • Configurer le runtime IoT Edge sur les appareils de votre hiérarchie.
  • Installer des certificats cohérents dans votre hiérarchie d’appareils.
  • Ajouter des charges de travail aux appareils de votre hiérarchie.
  • Utiliser le module Proxy d’API IoT Edge pour router en toute sécurité le trafic HTTP sur un port unique à partir de vos appareils de couche inférieure.

Conseil

Ce tutoriel comprend un mélange d’étapes manuelles et automatisées pour fournir une présentation des fonctionnalités IoT Edge imbriquées.

Si vous souhaitez une présentation entièrement automatisée de la configuration d’une hiérarchie d’appareils IoT Edge, suivez l’exemple Azure IoT Edge pour IoT industriel scripté. Ce scénario scripté déploie des machines virtuelles Azure en tant qu’appareils préconfigurés pour simuler un environnement de fabrique.

Si vous souhaitez examiner en détail les étapes manuelles de création et de gestion d’une hiérarchie d’appareils IoT Edge, veuillez consulter le guide pratique sur les hiérarchies d’appareils de passerelle IoT Edge.

Dans ce tutoriel, les couches réseau suivantes sont définies :

  • Couche supérieure : les appareils IoT Edge de cette couche peuvent se connecter directement au cloud.

  • Couches inférieures : les appareils IOT Edge se trouvant dans des couches en dessous de la couche supérieure ne peuvent pas se connecter directement au cloud. Ils doivent passer par un ou plusieurs appareils IoT Edge intermédiaires pour envoyer et recevoir des données.

Ce tutoriel utilise une hiérarchie à deux appareils pour des raisons de simplicité. L’appareil de couche supérieure représente un appareil dans la couche supérieure de la hiérarchie qui peut se connecter directement au cloud. Cet appareil est également s’appelle l’appareil parent. L’appareil de couche inférieure représente un appareil dans la couche inférieure de la hiérarchie ne peut pas se connecter directement au cloud. Vous pouvez ajouter d’autres appareils pour représenter votre environnement de production, selon les besoins. Les appareils dans les couches inférieures s’appellent appareils enfants.

Structure de la hiérarchie du tutoriel, avec deux appareils : l’appareil de couche supérieure et l’appareil de couche inférieure

Notes

Un appareil enfant peut être un appareil en aval ou un appareil de passerelle dans une topologie imbriquée.

Prérequis

Pour créer une hiérarchie d’appareils IoT Edge, vous devez disposer de ce qui suit :

  • Un ordinateur (Windows ou Linux) avec une connectivité Internet

  • Un compte Azure avec un abonnement valide. Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

  • Un hub IoT de niveau gratuit ou standard dans Azure

  • Interpréteur de commandes Bash dans Azure Cloud Shell utilisant Azure CLI avec l’extension Azure IoT installée. Ce tutoriel utilise Azure Cloud Shell. Pour afficher vos versions actuelles des modules et extensions Azure CLI, exécutez la commande az version.

  • Deux appareils Linux pour configurer votre hiérarchie. Si vous n’avez pas d’appareils disponibles, vous pouvez créer des machines virtuelles Azure pour chaque appareil de votre hiérarchie à l’aide du modèle Resource Manager Azure IoT Edge. IoT Edge version 1.4 est préinstallée avec ce modèle Resource Manager. Si vous installez IoT Edge sur vos propres appareils, veuillez consulter la rubrique Installer Azure IoT Edge pour Linux ou Mettre à jour IoT Edge.

  • Pour simplifier la communication réseau entre les appareils, les machines virtuelles doivent se trouver sur le même réseau virtuel ou utiliser l’appairage de réseaux virtuels.

  • Vérifiez que les ports suivants sont ouverts en entrée pour tous les appareils, à l’exception de l’appareil de la couche la plus basse : 443, 5671, 8883 :

    • 443 : Utilisé entre les hubs de périphérie parent et enfant pour les appels d’API REST et pour extraire des images conteneur Docker.
    • 5671, 8883 : Utilisé pour AMQP et MQTT.

    Pour plus d’informations, consultez Guide pratique pour ouvrir des ports sur une machine virtuelle avec le portail Azure.

    Conseil

    Dans la mesure où vous utilisez le descripteur SSH et le FQDN (nom de domaine complet) ou l’adresse IP de chaque machine virtuelle pour le processus de configuration dans les étapes à venir, gardez une trace de ces informations. Vous trouverez l’adresse IP et le FQDN sur le Portail Azure. Pour l’adresse IP, accédez à votre liste de machines virtuelles, puis notez le contenu du champ Adresse IP publique. Pour le FQDN, accédez à la page de présentation de chaque machine virtuelle, puis recherchez le champ Nom DNS. Pour le descripteur SSH, accédez à la page de connexion de chaque machine virtuelle.

Créer votre hiérarchie d’appareils IoT Edge

Les appareils IoT Edge composent les couches de votre hiérarchie. Ce tutoriel crée une hiérarchie de deux appareils IoT Edge : l’appareil de couche supérieure, et l’appareil de couche inférieure. Vous pouvez créer d’autres appareils en aval selon les besoins.

Pour créer et configurer votre hiérarchie des appareils IoT Edge, vous utilisez la commande az iot edge devices create Azure CLI. Cet outil simplifie la configuration de la hiérarchie en automatisant et en condensant plusieurs étapes :

  • Créer des appareils dans votre IoT Hub
  • Définit des relations parent-enfant pour autoriser la communication entre les appareils
  • Applique le manifeste de déploiement à chaque appareil
  • Génère une chaîne de certificats pour chaque appareil afin d’établir une communication sécurisée entre eux
  • Génère des fichiers config pour chaque appareil

Créer une configuration d’appareil

Vous créez un groupe d’appareils de périphérie imbriquée contenant un appareil parent avec un appareil enfant. Dans ce tutoriel, nous utilisons des exemples de manifestes de déploiement de base. Pour obtenir d’autres exemples de scénarios, passez en revue les exemples de modèles de configuration.

  1. Avant d’utiliser la commande az iot edge devices create, vous devez définir le manifeste de déploiement pour des appareils de couche supérieure et inférieure. Téléchargez l’exemple de fichier deploymentTopLayer.json sur votre ordinateur local.

    Le manifeste de déploiement d’appareil de couche supérieure définit le module proxy d’API IoT Edge et déclare l’itinéraire de l’appareil de couche inférieure vers IoT Hub.

  2. Téléchargez l’exemple de fichier deploymentLowerLayer.json sur votre ordinateur local.

    Le manifeste de déploiement d’appareil de couche inférieure inclut le module du capteur de température simulé et déclare l’itinéraire vers l’appareil de couche supérieure. Vous pouvez voir dans la section systemModules que les modules runtime sont définis pour extraire à partir de $amont:443 au lieu de mcr.microsoft.com. L’appareil de couche inférieure envoie des demandes d’image Docker au module Proxy d’API IoT Edge sur le port 443, car il ne peut pas tirer directement les images du cloud. L’autre module déployé sur l’appareil de couche inférieure, le module Simulated Temperature Sensor, effectue également sa demande d’image auprès de $upstream:443.

    Pour obtenir plus d’informations sur la création d’un manifeste de déploiement de couche inférieure, consultez Connecter des appareils Azure IoT Edge pour créer une hiérarchie.

  3. Dans Azure Cloud Shell, utilisez la commande az iot edge devices create Azure CLI pour créer des appareils dans IoT Hub et des bundles de configuration pour chaque appareil de votre hiérarchie. Remplacez les espaces réservés suivant par les valeurs appropriées :

    Espace réservé Description
    <hub-name> Nom de votre IoT Hub
    <config-bundle-output-path> Le chemin d’accès au dossier dans lequel vous souhaitez enregistrer les bundles de configuration.
    <parent-device-name> Nom de l’ID d’appareil parent de couche supérieure.
    <parent-deployment-manifest> Fichier manifeste de déploiement de l’appareil parent.
    <parent-fqdn-or-ip> Nom de domaine complet ou adresse IP de l’appareil parent.
    <child-device-name> Nom d’ID d’appareil enfant de couche inférieure.
    <child-deployment-manifest> Fichier manifeste de déploiement de l’appareil enfant.
    <child-fqdn-or-ip> Nom de domaine complet ou adresse IP de l’appareil enfant.
    az iot edge devices create \
       --hub-name <hub-name> \
       --output-path <config-bundle-output-path> \
       --default-edge-agent "mcr.microsoft.com/azureiotedge-agent:1.4" \
       --device id=<parent-device-name> \
          deployment=<parent-deployment-manifest> \
          hostname=<parent-fqdn-or-ip> \
       --device id=child-1 \
          parent=parent-1 \
          deployment=<child-deployment-manifest> \
          hostname=<child-fqdn-or-ip>
    

    Par exemple, la commande suivante crée une hiérarchie de deux appareils IoT Edge dans IoT Hub. Un appareil de couche supérieure nommé parent-1 et un appareil de couche inférieure nommé child-1*. La commande enregistre les bundles de configuration pour chaque appareil dans le répertoire de sortie. La commande génère également des certificats de test auto-signés et les inclut dans le bundle de configuration. Les bundles de configuration sont installés sur chaque appareil à l’aide d’un script d’installation.

    az iot edge devices create \
       --hub-name my-iot-hub \
       --output-path ./output \
       --default-edge-agent "mcr.microsoft.com/azureiotedge-agent:1.4" \
       --device id=parent-1 \
          deployment=./deploymentTopLayer.json \
          hostname=10.0.0.4 \
       --device id=child-1 \
          parent=parent-1 \
          deployment=./deploymentLowerLayer.json \
          hostname=10.1.0.4
    

Après exécution la commande, vous trouverez les bundles de configuration d’appareil dans le répertoire de sortie. Par exemple :

PS C:\nested-edge\output> dir

   Directory: C:\nested-edge\output

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           4/10/2023  4:12 PM           7192 child-1.tgz
-a---           4/10/2023  4:12 PM           6851 parent-1.tgz

Vous pouvez utiliser vos propres certificats et clés passés en tant qu’arguments à la commande ou créer une hiérarchie d’appareils plus complexe. Si vous souhaitez obtenir plus d’informations sur la création d’appareils imbriqués en utilisant la commande az, consultez az iot edge devices create. Si vous ne savez pas comment les certificats sont utilisés dans un scénario de passerelle, consultez la section relative aux certificats du guide pratique.

Dans ce tutoriel, vous utilisez des arguments inline pour créer les appareils et les bundles de configuration. Vous pouvez également utiliser un fichier de configuration au format YAML ou JSON. Pour obtenir un exemple de fichier de configuration, consultez l’exemple sample_devices_config.yaml.

Configurer le runtime IoT Edge

Outre l’approvisionnement de vos appareils, les étapes de configuration établissent une communication approuvée entre les appareils dans votre hiérarchie à l’aide des certificats que vous avez créés précédemment. Les étapes commencent également à établir la structure réseau de votre hiérarchie. L’appareil de couche supérieure conserve la connectivité Internet, ce qui lui permet d’extraire des images pour son runtime à partir du cloud, tandis que les appareils de couche inférieure passent par l’appareil de couche supérieure pour accéder à ces images.

Pour configurer le runtime IoT Edge, vous devez appliquer les bundles de configuration à vos appareils. Les configurations de l’appareil de couche supérieure et d’un appareil de couche inférieure étant différentes, veillez à appliquer le bon fichier config à chaque appareil.

  1. Copiez chaque fichier d’archive du bundle de configuration sur son appareil correspondant. Vous pouvez utiliser un lecteur USB, un service comme Azure Key Vault ou une fonction comme Copie de fichiers sécurisée. Choisissez l’une de ces méthodes qui correspondent le mieux à votre scénario.

    Par exemple, pour envoyer le bundle de configuration parent-1 au répertoire de base sur la machine virtuelle parent-1, vous pouvez utiliser une commande semblable à l’exemple suivant :

    scp ./output/parent-1.tgz admin@parent-1-vm.westus.cloudapp.azure.com:~
    
  2. Sur chaque appareil, extrayez l’archive du bundle de configuration. Par exemple, utilisez la commande tar pour extraire le fichier d’archive parent-1 :

    tar -xzf ./parent-1.tgz
    
  3. Définissez l’autorisation d’exécution pour le script d’installation.

    chmod +x install.sh
    
  4. Sur chaque appareil, appliquez le bundle de configurations avec l’autorisation racine :

    sudo ./install.sh
    

    L’installation des bundles de configurations entraîne la mise à jour des fichiers config.toml sur votre appareil et le redémarrage automatique de tous les services IoT Edge

    Si vous souhaitez examiner de plus près les modifications apportées au fichier config de votre appareil, veuillez consulter la section Configurer des appareils Azure IoT Edge ensemble pour créer une hiérarchie.

Pour vérifier que vos appareils sont correctement configurés, exécutez les vérifications de configuration et de connectivité sur vos appareils.

sudo iotedge check
admin@child-1-vm:~$ sudo iotedge check

Configuration checks (aziot-identity-service)
---------------------------------------------
√ keyd configuration is well-formed - OK
√ certd configuration is well-formed - OK
√ tpmd configuration is well-formed - OK
√ identityd configuration is well-formed - OK
√ daemon configurations up-to-date with config.toml - OK
√ identityd config toml file specifies a valid hostname - OK
√ host time is close to reference time - OK
√ preloaded certificates are valid - OK
√ keyd is running - OK
√ certd is running - OK
√ identityd is running - OK
√ read all preloaded certificates from the Certificates Service - OK
√ read all preloaded key pairs from the Keys Service - OK
√ check all EST server URLs utilize HTTPS - OK
√ ensure all preloaded certificates match preloaded private keys with the same ID - OK

Connectivity checks (aziot-identity-service)
--------------------------------------------
√ host can connect to and perform TLS handshake with iothub AMQP port - OK
√ host can connect to and perform TLS handshake with iothub HTTPS / WebSockets port - OK
√ host can connect to and perform TLS handshake with iothub MQTT port - OK

Configuration checks
--------------------
√ aziot-edged configuration is well-formed - OK
√ configuration up-to-date with config.toml - OK
√ container engine is installed and functional - OK
√ configuration has correct parent_hostname - OK
√ configuration has correct URIs for daemon mgmt endpoint - OK
√ container time is close to host time - OK
‼ DNS server - Warning
    Container engine is not configured with DNS server setting, which may impact connectivity to IoT Hub.
    Please see https://aka.ms/iotedge-prod-checklist-dns for best practices.
    You can ignore this warning if you are setting DNS server per module in the Edge deployment.
‼ production readiness: logs policy - Warning
    Container engine is not configured to rotate module logs which may cause it run out of disk space.
    Please see https://aka.ms/iotedge-prod-checklist-logs for best practices.
    You can ignore this warning if you are setting log policy per module in the Edge deployment.
‼ production readiness: Edge Agent's storage directory is persisted on the host filesystem - Warning
    The edgeAgent module is not configured to persist its /tmp/edgeAgent directory on the host filesystem.
    Data might be lost if the module is deleted or updated.
    Please see https://aka.ms/iotedge-storage-host for best practices.
‼ production readiness: Edge Hub's storage directory is persisted on the host filesystem - Warning
    The edgeHub module is not configured to persist its /tmp/edgeHub directory on the host filesystem.
    Data might be lost if the module is deleted or updated.
    Please see https://aka.ms/iotedge-storage-host for best practices.
√ Agent image is valid and can be pulled from upstream - OK
√ proxy settings are consistent in aziot-edged, aziot-identityd, moby daemon and config.toml - OK

Connectivity checks
-------------------
√ container on the default network can connect to upstream AMQP port - OK
√ container on the default network can connect to upstream HTTPS / WebSockets port - OK
√ container on the IoT Edge module network can connect to upstream AMQP port - OK
√ container on the IoT Edge module network can connect to upstream HTTPS / WebSockets port - OK
30 check(s) succeeded.
4 check(s) raised warnings. Re-run with --verbose for more details.
2 check(s) were skipped due to errors from other checks. Re-run with --verbose for more details.

Sur l’appareil de couche supérieure, attendez-vous à voir une sortie avec plusieurs évaluations réussies. Vous pouvez voir des avertissements concernant les stratégies de journaux et, en fonction de votre réseau, les stratégies DNS.

Déploiement de module d’appareil

Le déploiement de module pour vos appareils a été appliqué lors de la création des appareils dans IoT Hub. La commande az iot edge devices create a appliqué les fichiers JSON de déploiement pour les appareils de couche supérieure et inférieure. Une fois ces déploiements effectués, l’appareil de couche inférieure utilise le module Proxy d’API IoT Edge pour extraire les images nécessaires.

En plus des modules de runtime Agent IoT Edge et Hub IoT Edge, l’appareil de couche supérieure reçoit les modules Registre Docker et Proxy d’API IoT Edge.

Le module Registre Docker pointe vers un registre Azure Container Registry existant. Dans ce cas, REGISTRY_PROXY_REMOTEURL pointe vers Microsoft Container Registry. Par défaut, le registre Docker écoute sur le port 5000.

Le module Proxy d’API IoT Edge route les requêtes HTTP vers d’autres modules, ce qui permet aux appareils de couche inférieure de tirer (pull) des images conteneur ou de pousser (push) des objets blob vers le stockage. Dans ce tutoriel, il communique sur le port 443 et est configuré pour envoyer des demandes de tirage (pull requests) d’images conteneur Docker à votre module Registre Docker sur le port 5000. De plus, toutes les demandes de chargement du service Stockage Blob sont routées vers le module AzureBlobStorageonIoTEdge sur le port 11002. Pour plus d’informations sur le module Proxy d’API IoT Edge et sur sa configuration, consultez le guide pratique du module.

Pour découvrir comment créer un déploiement comme celui-ci via le portail Azure ou Azure Cloud Shell, consultez la section consacrée aux appareils de couche supérieure dans le guide pratique.

Vous pouvez voir l’état des modules à l’aide de la commande :

az iot hub module-twin show --device-id <edge-device-id> --module-id '$edgeAgent' --hub-name <iot-hub-name> --query "properties.reported.[systemModules, modules]"

Cette commande renvoie toutes les propriétés edgeAgent signalées. Voici quelques exemples utiles pour superviser l’état de l’appareil : état du runtime, heure de début du runtime, heure de la dernière sortie du runtime, nombre de redémarrages du runtime.

Vous pouvez également voir l’état des modules sur le portail Azure. Accédez à la section Appareils de votre hub IoT pour voir les appareils et les modules.

Afficher les données générées

Le module Capteur de température simulé que vous avez envoyé (push) génère des exemples de données d’environnement. Il envoie des messages qui incluent la température et l’humidité ambiantes, la température et la pression de la machine, ainsi qu’un horodatage.

Vous pouvez aussi afficher ces messages par le biais d’Azure Cloud Shell :

az iot hub monitor-events -n <iot-hub-name> -d <lower-layer-device-name>

Par exemple :

az iot hub monitor-events -n my-iot-hub -d child-1
{
    "event": {
        "origin": "child-1",
        "module": "simulatedTemperatureSensor",
        "interface": "",
        "component": "",
        "payload": "{\"machine\":{\"temperature\":104.29281270901808,\"pressure\":10.48905461241978},\"ambient\":{\"temperature\":21.086561171611102,\"humidity\":24},\"timeCreated\":\"2023-04-17T21:50:30.1082487Z\"}"
    }
}

Dépannage

Exécutez la commande iotedge check pour vérifier la configuration et résoudre les problèmes.

Vous pouvez exécuter iotedge check dans une hiérarchie imbriquée, même si les machines en aval n’ont pas d’accès direct à Internet.

Quand vous exécutez iotedge check à partir de la couche inférieure, le programme essaie de tirer l’image du parent via le port 443.

La valeur azureiotedge-diagnostics est extraite du registre de conteneurs lié au module registre. Dans ce tutoriel, elle est définie par défaut sur https://mcr.microsoft.com :

Nom Valeur
REGISTRY_PROXY_REMOTEURL https://mcr.microsoft.com

Si vous utilisez un registre de conteneurs privé, vérifiez que toutes les images (IoTEdgeAPIProxy, edgeAgent, edgeHub, Simulated Temperature Sensor et diagnostics) sont présentes dans le registre de conteneurs.

Si un appareil en aval a une architecture de processeur différente de l’appareil parent, vous avez besoin de l’image d’architecture appropriée. Vous pouvez utiliser un registre connecté ou spécifier l’image appropriée pour les modules edgeAgent et edgeHub dans le fichier config.toml de l’appareil en aval. Par exemple, si l’appareil parent s’exécute sur une architecture ARM32v7 et que l’appareil en aval s’exécute sur une architecture AMD64, vous devez spécifier la version et la balise d’image d’architecture correspondantes dans le fichier config.toml de l’appareil en aval.

[agent.config]
image = "$upstream:443/azureiotedge-agent:1.4.10-linux-amd64"

"systemModules": {
   "edgeAgent": {
      "settings": {
            "image": "$upstream:443/azureiotedge-agent:1.4.10-linux-amd64"
      },
   },
   "edgeHub": {
      "settings": {
            "image": "$upstream:443/azureiotedge-hub:1.4.10-linux-amd64",
      }
   }
}

Nettoyer les ressources

Vous pouvez supprimer les ressources Azure et les configurations locales que vous avez créées dans cet article pour éviter des frais.

Pour supprimer les ressources :

  1. Connectez-vous au portail Azure, puis sélectionnez Groupes de ressources.

  2. Sélectionnez le nom du groupe de ressources contenant vos ressources de test de IoT Edge.

  3. Passez en revue la liste des ressources contenues dans votre groupe de ressources. Si vous souhaitez toutes les supprimer, vous pouvez sélectionner Supprimer le groupe de ressources. Si vous souhaitez en supprimer seulement quelques-unes, vous pouvez sélectionner chaque ressource pour la supprimer individuellement.

Étapes suivantes

Dans ce tutoriel, vous avez configuré deux appareils IoT Edge en tant que passerelles et défini l’un des deux comme appareil parent de l’autre. Vous avez ensuite extrait une image conteneur sur l’appareil en aval via une passerelle à l’aide du module Proxy d’API IoT Edge. Pour en savoir plus, consultez le guide pratique sur l’utilisation du module proxy.

Si vous souhaitez en savoir plus sur l’utilisation des passerelles pour créer des couches hiérarchiques d’appareils IoT Edge, consultez l’article suivant.