Tutoriel : Développer des modules IoT Edge avec des conteneurs Linux à l’aide d’IoT Edge pour Linux sur Windows

S’applique à :IoT Edge 1.4 checkmark 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.

Ce tutoriel décrit le développement, le débogage et le déploiement de votre propre code sur un appareil IoT Edge à l’aide d’IoT Edge pour Linux sur Windows et Visual Studio 2022. Vous découvrirez le scénario de développement le plus courant pour les solutions IoT Edge en déployant un module C# sur un appareil Linux. Vous allez déployer et déboguer un module Azure IoT Edge personnalisé s’exécutant dans un conteneur Linux sur Windows (EFLOW). Même si vous prévoyez d’utiliser un autre langage ou de déployer un service Azure, ce didacticiel est également utile pour en savoir plus sur les outils de développement et les concepts.

Cet article comprend des étapes pour deux outils de développement IoT Edge :

  • L’interface de ligne de commande (CLI) est l’outil préféré pour le développement.
  • Outils Azure IoT Edge pour l’extension Visual Studio . L’extension est en mode maintenance.

Utilisez le bouton sélecteur d’outils au début de cet article pour sélectionner la version de l’outil.

Dans ce tutoriel, vous allez apprendre à :

  • Configurer votre machine de développement
  • Utiliser les outils IoT Edge pour Visual Studio Code afin de créer un projet
  • Générer votre projet sous forme de conteneur et le stocker dans un registre de conteneurs Azure
  • Déployer votre code sur un appareil IoT Edge

Prérequis

Cet article part du principe que vous utilisez un ordinateur exécutant Windows pour le développement. Sur les ordinateurs Windows, vous pouvez développer des modules Windows ou Linux. Ce tutoriel vous guide tout au long du développement de conteneurs Linux, à l’aide d’IoT Edge pour Linux sur Windows pour la génération et le déploiement des modules.

Une fois que votre Visual Studio 2022 est prêt, vous avez également besoin des outils et composants suivants :

  • Téléchargez et installez Azure IoT Edge Tools à partir de du Visual Studio Marketplace. Vous pouvez utiliser l’extension Azure IoT Edge Tools pour créer et créer votre solution IoT Edge. L’outil de développement préféré est l’outil de développement En ligne de commande (CLI) Azure IoT Edge Dev Tool. L’extension inclut les modèles de projet Azure IoT Edge utilisés pour créer le projet Visual Studio. Actuellement, vous avez besoin de l’extension installée quel que soit l’outil de développement que vous utilisez.

    Important

    L’extension Azure IoT Edge Tools pour VS 2022 est en mode maintenance. L’outil de développement préféré est l’outil de développement En ligne de commande (CLI) Azure IoT Edge Dev Tool.

    Conseil

    Si vous utilisez Visual Studio 2019, téléchargez et installez Azure IoT Edge Tools pour VS 2019 à partir de la Place de marché Visual Studio.

Ressources cloud :

  • Un hub IoT de niveau gratuit ou standard dans Azure.

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

Concepts clés

Ce tutoriel présente le développement d’un module IoT Edge. Un module IoT Edge, ou parfois simplement module dans sa forme abrégée, est un conteneur avec du code exécutable. Vous pouvez déployer un ou plusieurs modules sur un appareil IoT Edge. Les modules effectuent des tâches spécifiques comme l’ingestion de données provenant de capteurs, le nettoyage et l’analyse de données ou encore l’envoi de messages à un hub IoT. Pour plus d’informations, consultez Présentation des modules Azure IoT Edge.

Lors du développement d’un module IoT Edge, il est important de comprendre la différence entre la machine de développement et l’appareil IoT Edge cible où le module sera finalement déployé. Le conteneur que vous générez pour le stockage du code du module doit correspondre au système d’exploitation (OS) de l’appareil cible. Par exemple, le scénario le plus courant est le développement d’un module sur un ordinateur Windows avec l’intention de cibler un appareil Linux exécutant IoT Edge. Dans ce cas, le système d’exploitation du conteneur est Linux. À mesure que vous parcourez ce tutoriel, gardez à l’esprit la différence entre système d’exploitation de la machine de développement et système d’exploitation du conteneur. Pour ce tutoriel, vous allez utiliser votre hôte Windows pour le développement et la machine virtuelle IoT Edge pour Linux sur Windows (EFLOW) pour la création et le déploiement des modules.

Ce tutoriel cible les appareils exécutant IoT Edge avec des conteneurs Linux. Vous pouvez utiliser le système d’exploitation de votre choix, à condition que votre machine de développement exécute des conteneurs Linux. Nous vous recommandons d’utiliser Visual Studio pour développer avec des conteneurs Linux. C’est donc ce que ce tutoriel utilise. Vous pouvez aussi bien utiliser Visual Studio Code, bien qu’il existe des différences de prise en charge entre les deux outils. Pour plus d’informations, consultez Développer des modules Azure IoT Edge à l’aide de Visual Studio Code.

Configurer docker-cli et la connexion à distance au moteur Docker

Les modules IoT Edge étant empaquetés en tant que conteneurs, vous avez besoin d’un moteur de conteneur sur votre machine de développement pour les générer et les gérer. La machine virtuelle EFLOW contient déjà une instance du moteur Docker. Ce didacticiel vous montre donc comment vous connecter à distance à partir de l’ordinateur développeur Windows à l’instance Docker de machine virtuelle EFLOW. Grâce à cela, nous supprimons la dépendance envers Docker Desktop for Windows.

La première étape consiste à configurer dockr-cli sur la machine de développement Windows pour être en mesure de se connecter au moteur Docker distant.

  1. Téléchargez la version docker.exe précompilée de docker-cli à partir de docker-cli Chocolatey. Vous pouvez également télécharger le projet cli officiel à partir de docker/cli GitHub et le compiler en suivant les instructions du dépôt.
  2. Extrayez docker.exe dans un répertoire sur votre machine de développement, par exemple C:\Docker\bin.
  3. Ouvrez À propos de votre PC ->Infos System ->Paramètres système avancés.
  4. Sélectionnez Avancé ->Variables d’environnement ->. Sous Variables utilisateur, vérifiez Chemin.
  5. Modifiez la variable Chemin et ajoutez l’emplacement de docker.exe.
  6. Ouvrez une session PowerShell avec élévation de privilèges.
  7. Vérifiez que Docker CLI est accessible à l’aide de la commande
    docker --version
    

Si tout a été correctement configuré, la commande précédente doit générer la version de Docker, par exemple Docker version 20.10.12, build e91ed57.

La deuxième étape consiste à configurer le moteur Docker de la machine virtuelle EFLOW pour qu’il accepte les connexions externes, et à ajouter les règles de pare-feu appropriées.

Avertissement

L’exposition du moteur Docker aux connexions externes peut augmenter les risques de sécurité. Cette configuration ne doit être utilisée qu’à des fins de développement. Veillez à rétablir les paramètres par défaut de la configuration une fois le développement terminé.

  1. Ouvrez une session PowerShell avec élévation de privilèges, puis exécutez les commandes suivantes.

    # Configure the EFLOW virtual machine Docker engine to accept external connections, and add the appropriate firewall rules.
    Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    
    # Create a copy of the EFLOW VM _docker.service_ in the system folder.
    Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    
    # Replace the service execution line to listen for external connections.
    Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g'  /etc/systemd/system/docker.service"
    
    # Reload the EFLOW VM services configurations.
    Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    
    # Reload the Docker engine service.
    Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    
    # Check that the Docker engine is listening to external connections.
    Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    

    Voici un exemple de sortie.

    PS C:\> # Configure the EFLOW virtual machine Docker engine to accept external connections, and add the appropriate firewall rules.
    PS C:\> Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    PS C:\>
    PS C:\> # Create a copy of the EFLOW VM docker.service in the system folder.
    PS C:\> Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Replace the service execution line to listen for external connections.
    PS C:\> Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g' /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Reload the EFLOW VM services configurations.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    PS C:\>
    PS C:\> # Reload the Docker engine service.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    PS C:\>
    PS C:\> # Check that the Docker engine is listening to external connections.
    PS C:\> Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    tcp6       0      0 :::2375                 :::*                    LISTEN      2790/dockerd
    
  2. La dernière étape consiste à tester la connexion Docker au moteur Docker de la machine virtuelle EFLOW. Tout d’abord, vous avez besoin de l’adresse IP de la machine virtuelle EFLOW.

    Get-EflowVmAddr
    

    Conseil

    Si la machine virtuelle EFLOW a été déployée sans adresse IP statique, l’adresse IP peut changer suite à un redémarrage du système d’exploitation de l’hôte Windows ou à une modification réseau. Vérifiez que vous utilisez l’adresse IP de machine virtuelle EFLOW correcte chaque fois que vous souhaitez établir une connexion au moteur Docker distant.

    Voici un exemple de sortie.

    PS C:\> Get-EflowVmAddr
    [03/15/2022 15:22:30] Querying IP and MAC addresses from virtual machine (DESKTOP-J1842A1-EFLOW)
     - Virtual machine MAC: 00:15:5d:6f:da:78
     - Virtual machine IP : 172.31.24.105 retrieved directly from virtual machine
    00:15:5d:6f:da:78
    172.31.24.105 
    
  3. En se servant de l’adresse IP obtenue, connectez-vous au moteur Docker de la machine virtuelle EFLOW et exécutez l’exemple de connecter Hello-World. Remplacez <EFLOW-VM-IP> par l’adresse IP de la machine virtuelle EFLOW obtenue à l’étape précédente.

    docker -H tcp://<EFLOW-VM-IP>:2375 run --rm hello-world
    

    Le conteneur devrait se télécharger, s’exécuter et générer la sortie suivante.

    PS C:\> docker -H tcp://172.31.24.105:2375 run --rm hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    2db29710123e: Pull complete
    Digest: sha256:4c5f3db4f8a54eb1e017c385f683a2de6e06f75be442dc32698c9bbe6c861edd
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    

Créer un projet Azure IoT Edge

Le modèle de projet IoT Edge dans Visual Studio crée une solution qui peut être déployée sur des appareils IoT Edge. Vous commencez par créer une solution Azure IoT Edge, puis vous y générez le premier module. Chaque solution IoT Edge peut contenir plusieurs modules.

Important

La structure de projet IoT Edge créée par Visual Studio n’est pas la même que celle de Visual Studio Code.

Actuellement, l’interface CLI de l’outil de développement Azure IoT Edge ne prend pas en charge la création du type de projet Visual Studio. Vous devez utiliser l’extension Visual Studio IoT Edge pour créer le projet Visual Studio.

  1. Dans Visual Studio, créez un projet.

  2. Sur la page Créer un projet, recherchez Azure IoT Edge. Sélectionnez le projet correspondant à la plateforme (module Linux IoT Edge) et l’architecture de votre appareil IoT Edge, puis sélectionnez Suivant.

    Create New Project

  3. Dans la page Configurer votre nouveau projet, entrez un nom pour votre projet, spécifiez l’emplacement, puis sélectionnez Créer.

  4. Dans la fenêtre Ajouter un module, sélectionnez le type de module que vous souhaitez développer. Vous pouvez également sélectionner Module existant pour ajouter un module de IOT Edge existant à votre déploiement. Spécifiez le nom de votre module et son référentiel d’images.

  5. Dans Url du dépôt, indiquez le nom du référentiel d’images du module. Par défaut, Visual Studio nomme le module localhost:5000/<nom de votre module>. Remplacez-le par vos propres informations de registre. Utilisez localhost si vous utilisez un registre Docker local pour les tests. Si vous utilisez Azure Container Registry, utilisez le serveur de connexion à partir des paramètres de votre registre. Le serveur de connexion se présente comme suit : <nom du registre>.azurecr.io. Remplacez uniquement la partie localhost:5000 de la chaîne afin d’obtenir le résultat final suivant : <nom du registre>.azurecr.io/ <nom de votre module> .

  6. Sélectionnez Ajouter pour ajouter votre module au projet.

    Screenshot of adding how to add an application and module to Visual Studio solution

    Remarque

    Si vous disposez d’un projet IoT Edge existant, vous pouvez modifier l’URL du référentiel en ouvrant le fichier module.json. L’URL du référentiel se trouve dans la propriété repositorydu fichier JSON.

Vous disposez maintenant d’un projet IoT Edge et d’un module IoT Edge dans votre solution Visual Studio.

Structure de projet

Dans votre solution, il existe deux dossiers au niveau du projet, notamment un dossier de projet principal et un dossier de module unique. Par exemple, vous pouvez avoir un dossier de projet principal nommé AzureIotEdgeApp1 et un dossier de module nommé IotEdgeModule1. Le dossier principal du projet contient votre manifeste de déploiement.

Le dossier du module contient un fichier pour le code de votre module, nommé Program.cs ou main.c selon le langage que vous avez choisi. Ce dossier contient également un fichier nommé module.json décrivant les métadonnées de votre module. Différents fichiers Docker fournissent les informations nécessaires pour générer votre module en tant que conteneur Windows ou Linux.

Manifeste de déploiement de votre projet

Le manifeste de déploiement que vous modifiez est nommé deployment.debug.template.json. Ce fichier est un modèle de manifeste de déploiement IoT Edge définissant tous les modules qui s’exécuteront sur un appareil, ainsi que la façon dont ils communiqueront les uns avec les autres. Pour plus d’informations sur les manifestes de déploiement, consultez Découvrir comment déployer des modules et établir des routes.

Si vous ouvrez ce modèle de déploiement, vous constatez que les deux modules de runtime, edgeAgent et edgeHub, sont inclus, ainsi que le module personnalisé que vous avez créé dans ce projet Visual Studio. Un quatrième module nommé SimulatedTemperatureSensor est également inclus. Ce module par défaut génère des données simulées que vous pouvez utiliser pour tester vos modules, ou les supprimer s’ils ne sont pas nécessaires. Pour voir comment fonctionne le capteur de température simulé, consultez le code source SimulatedTemperatureSensor.csproj.

Définir la version du runtime IoT Edge

Actuellement, la dernière version stable est la version 1.4. Vous devez mettre à jour la version IoT Edge runtime vers la dernière version stable ou la version que vous souhaitez cibler pour vos appareils.

  1. Dans l’Explorateur de solutions, cliquez avec le bouton de droite sur le nom de votre projet principal, puis sélectionnez Définir la version du runtime IoT Edge.

    Screenshot of how to find and select the menu item named 'Set IoT Edge Runtime version'.

  2. Utilisez le menu déroulant pour choisir la version du runtime que vos appareils IoT Edge exécutent, puis sélectionnez OK pour enregistrer vos modifications. Si aucune modification n’a été apportée, sélectionnez Annuler pour quitter.

    Actuellement, l’extension n’inclut pas de sélection pour les dernières versions du runtime. Si vous souhaitez définir la version du runtime supérieure à 1.2, ouvrez le fichier manifeste de déploiement deployment.debug.template.json . Modifiez la version du runtime pour les images de module du runtime système edgeAgent et edgeHub. Par exemple, si vous souhaitez utiliser la version 1.4 du runtime IoT Edge, modifiez les lignes suivantes dans le fichier manifeste de déploiement :

    "systemModules": {
       "edgeAgent": {
        //...
          "image": "mcr.microsoft.com/azureiotedge-agent:1.4"
        //...
       "edgeHub": {
       //...
          "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
       //...
    
  3. Si vous avez modifié la version, générez à nouveau votre manifeste de déploiement en cliquant avec le bouton droit sur le nom de votre projet, puis sélectionnez Générer le déploiement pour IoT Edge. Cela génère un manifeste de déploiement basé sur votre modèle de déploiement et apparaît dans le dossier de configuration de votre projet Visual Studio.

  1. Ouvrez le fichier manifeste de déploiement deployment.debug.template.json . Le manifeste de déploiement est un document JSON qui décrit les modules devant être configurés sur l’appareil IoT Edge ciblé.

  2. Modifiez la version du runtime pour les images de module du runtime système edgeAgent et edgeHub. Par exemple, si vous souhaitez utiliser la version 1.4 du runtime IoT Edge, modifiez les lignes suivantes dans le fichier manifeste de déploiement :

    "systemModules": {
        "edgeAgent": {
        //...
            "image": "mcr.microsoft.com/azureiotedge-agent:1.4",
        //...
        "edgeHub": {
        //...
            "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
        //...
    

Configurer l’instance du moteur Docker distant Visual Studio 2022

Utilisez l’extension d’outils Azure IoT Edge et configurez-la pour utiliser le moteur Docker distant s’exécutant à l’intérieur de la machine virtuelle EFLOW.

  1. Sélectionnez Outils - >Outils Azure IoT Edge - >Paramètres des outils IoT Edge.

  2. Remplacez la valeur de localhost DOCKER_HOST par l’adresse IP de la machine virtuelle EFLOW. Si vous ne vous souvenez pas de l’adresse IP, utilisez l’applet de commande PowerShell EFLOW Get-EflowVmAddr pour l’obtenir. Par exemple, si l’adresse IP de la machine virtuelle EFLOW est 172.20.1.100, la nouvelle valeur doit être tcp://172.20.1.100:2375.

    Screenshot of IoT Edge Tools settings

  3. Sélectionnez OK.

Développer votre module

Lorsque vous ajoutez un nouveau module, celui-ci est fourni avec un code par défaut prêt pour génération et déploiement sur un appareil afin que vous puissiez commencer à tester sans écrire de code. Le code du module se trouve dans le dossier de celui-ci, dans un fichier nommé Program.cs (pour C#) ou main.c (pour C).

La solution par défaut est générée de façon à ce que les données simulées du module SimulatedTemperatureSensor soient acheminées vers votre module qui prend l’entrée, puis l’envoie à IoT Hub.

Lorsque vous êtes prêt à personnaliser le modèle de module avec votre propre code, utilisez les kits SDK Azure IoT Hub pour générer d’autres modules répondant aux besoins des solutions IoT, tels que la sécurité, la gestion des appareils et la fiabilité.

Générer et envoyer (push) un module unique

En général, vous voulez tester et déboguer chaque module avant de l’exécuter au sein d’une solution entière avec plusieurs modules. Étant donné que la solution sera générée ou déboguée à l’aide du moteur Docker s’exécutant à l’intérieur de la machine virtuelle EFLOW, la première étape consiste à générer et à publier le module pour activer le débogage à distance.

  1. Dans Explorateur de solutions, sélectionnez et mettez en surbrillance le dossier du projet de module (par exemple, myIotEdgeModule). Définissez le module personnalisé comme projet de démarrage. SélectionnezProjet> Définir comme projet de démarrage dans le menu.

  2. Pour déboguer le module Linux C#, nous devons mettre à jour le fichier Dockerfile.amd64.debug pour activer le service SSH. Mettez à jour le fichier Dockerfile.amd64.debug pour utiliser le modèle suivant : Dockerfile pour le module AZURE IoT Edge AMD64 C# avec prise en charge du débogage à distance.

    Remarque

    Lorsque vous choisissez Déboguer, Visual Studio utilise Dockerfile.(amd64|windows-amd64).debug pour générer des images Docker. Ceci inclut le débogueur en ligne de commande .NET Core (VSDBG) dans votre image conteneur lors de sa génération. Pour obtenir des modules IoT Edge prêts pour la production, nous vous recommandons d’utiliser la configuration Publier qui utilise Dockerfile.(amd64|windows-amd64) sans VSDBG.

    Avertissement

    Vérifiez que sur la dernière ligne du modèle ENTRYPOINT ["dotnet", "IotEdgeModule1.dll"] le nom de la DLL correspond au nom de votre projet de module IoT Edge.

    Screenshot of setting the Dockerfile template

  3. Pour établir une connexion SSH avec le module Linux, nous devons créer une clé RSA. Ouvrez une session PowerShell avec élévation de privilèges et exécutez les commandes suivantes pour créer une clé RSA. Veillez à enregistrer la clé RSA sous le même dossier de module IoT Edge, et à ce que le nom de la clé soit id_rsa.

    ssh-keygen -t RSA -b 4096 -m PEM
    

    Screenshot of how to create an SSH key

  4. Si vous utilisez un registre privé tel qu’Azure Container Registry (ACR), servez-vous de la commande Docker suivante pour vous y connecter. Vous pouvez récupérer le nom d’utilisateur et le mot de passe à partir de la page Clés d’accès de votre registre dans le Portail Azure. Si vous utilisez un registre local, vous pouvez exécuter un registre local.

    docker -H tcp://<EFLOW-VM-IP>:2375 login -u <ACR username> -p <ACR password> <ACR login server>
    
  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet de dossier, puis sélectionnez Générer et envoyer (push) les modules IoT Edge afin de générer et envoyer l’image Docker pour chaque module.

  2. Si vous utilisez un registre privé tel qu’Azure Container Registry, vous devez ajouter vos informations de connexion au registre aux paramètres de runtime figurant dans le fichier deployment.template.json. Remplacez les espaces réservés par le nom d’utilisateur, le mot de passe et le nom de registre de votre administrateur ACR réel.

          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "registry1": {
                "username": "<username>",
                "password": "<password>",
                "address": "<registry name>.azurecr.io"
              }
            }
          }
    

    Notes

    Cet article utilise les informations d’identification de l’administrateur pour Azure Container Registry, qui conviennent pour des scénarios de développement et de test. Lorsque vous êtes prêt pour les scénarios de production, nous vous recommandons d’utiliser l’option d’authentification de moindre privilège, comme les principaux de service. Pour plus d’informations, consultez Gérer l’accès au registre de conteneurs.

  3. Il est nécessaire d’exposer le port 22 pour accéder au service SSH du module. Ce tutoriel utilise 10022 comme port hôte, mais vous pouvez spécifier un autre port, qui sera utilisé comme port SSH pour se connecter au module C# Linux. Vous devez ajouter les informations de port SSH aux « createOptions » de ce paramètre de module Linux figurant dans le fichier deployment.debug.template.json.

         "createOptions": {
            "HostConfig": {
               "Privileged": true,
               "PortBindings": {
                     "22/tcp": [
                        {
                           "HostPort": "10022"
                        }
                     ]
               }
            }
         }
    
  4. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le dossier du projet, puis sélectionnez Générer le déploiement pour IoT Edge afin de générer le nouveau fichier JSON de déploiement IoT Edge.

  5. Ouvrez Cloud Explorer en cliquant sur Afficher>Cloud Explorer. Assurez-vous que vous êtes connecté à Visual Studio 2019.

  6. Dans Cloud Explorer, développez votre abonnement, recherchez votre hub Azure IoT et l’appareil Azure IoT Edge que vous voulez déployer.

  7. Cliquez avec le bouton droit sur l’appareil IoT Edge et choisissez Créer un déploiement. Accédez au manifeste de déploiement de débogage configuré pour votre plateforme qui se trouve dans le dossier config de votre solution Visual Studio, par exemple deployment.amd64.json.

Générer l’image Docker du module

Une fois que vous avez développé votre module, vous pouvez générer l’image de module à stocker dans un registre de conteneurs pour le déploiement sur votre appareil IoT Edge.

Utilisez le Dockerfile du module pour générer l’image Docker du module.

docker build --rm -f "<DockerFilePath>" -t <ImageNameAndTag> "<ContextPath>" 

Par exemple, supposons que votre interpréteur de commandes se trouve dans le répertoire de votre projet et que le nom de votre module est IotEdgeModule1. Pour générer l’image pour le registre local ou un registre de conteneurs Azure, utilisez les commandes suivantes :

# Build the image for the local registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t localhost:5000/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

# Or build the image for an Azure Container Registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

Pousser (push) l’image Docker du module

Envoyez (push) votre image de module vers le registre local ou un registre de conteneurs.

docker push <ImageName>

Par exemple :

# Push the Docker image to the local registry

docker push localhost:5000/iotedgemodule1:0.0.1-amd64

# Or push the Docker image to an Azure Container Registry
az acr login --name myacr
docker push myacr.azurecr.io/iotedgemodule1:0.0.1-amd64

Déployer le module sur l’appareil IoT Edge

Dans Visual Studio, ouvrez le fichier manifeste de déploiement deployment.debug.template.json dans le projet principal. Le manifeste de déploiement est un document JSON qui décrit les modules devant être configurés sur l’appareil IoT Edge ciblé. Avant le déploiement, vous devez mettre à jour vos informations d’identification Azure Container Registry et vos images de module avec les valeurs createOptions appropriées. Pour plus d’informations sur les valeurs createOption, consultez Guide pratique pour configurer les options de création de conteneur pour les modules IoT Edge.

  1. Si vous utilisez Azure Container Registry pour stocker votre image de module, vous devez ajouter vos informations d’identification à deployment.debug.template.json dans les paramètres edgeAgent. Par exemple,

    "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "runtime": {
          "type": "docker",
          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "myacr": {
                "username": "myacr",
                "password": "<your_acr_password>",
                "address": "myacr.azurecr.io"
              }
            }
          }
        },
    //...
    
  2. Remplacez la valeur de la propriété image par le nom de l’image de module que vous avez envoyée au registre. Par exemple, si vous avez envoyé (push) une image marquée myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 pour le module personnalisé IotEdgeModule1, remplacez la valeur de la propriété image par la valeur de balise.

  3. Ajoutez ou remplacez la valeur createOptions par du contenu stringified pour chaque système et module personnalisé dans le modèle de déploiement.

    Par exemple, les paramètres image etcreateOptions de iotEdgeModule1 sont similaires à ce qui suit :

    "IotEdgeModule1": {
    "version": "1.0.0",
    "type": "docker",
    "status": "running",
    "restartPolicy": "always",
    "settings": {
        "image": "myacr.azurecr.io/iotedgemodule1:0.0.1-amd64",
        "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    }
    

Utilisez la commande IoT Edge Azure CLI set-modules pour déployer les modules sur le hub Azure IoT. Par exemple, pour déployer les modules définis dans le fichier deployment.debug.amd64.json sur le hub IoT my-iot-hub pour l’appareil IoT Edge my-device, utilisez la commande suivante :

az iot edge set-modules --hub-name my-iot-hub --device-id my-device --content ./deployment.debug.template.json --login "HostName=my-iot-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<SharedAccessKey>"

Conseil

Vous trouverez votre chaîne de connexion IoT Hub dans le portail Azure sous Azure IoT Hub >Paramètres de sécurité>Stratégies d’accès partagé.

  1. Dans Cloud Explorer, cliquez avec le bouton droit sur votre appareil de périphérie, puis actualisez pour voir le nouveau module en cours d’exécution avec les modules $edgeAgent et $edgeHub.

Déboguer la solution

  1. Dans une session PowerShell avec élévation de privilèges, exécutez les commandes suivantes :

    1. Obtenez le moduleId en fonction du nom utilisé pour le module C# Linux. Veillez à remplacer l’espace réservé <iot-edge-module-name> par le nom de votre module.

      $moduleId = Invoke-EflowVmCommand "sudo docker ps -aqf name=<iot-edge-module-name>"
      
    2. Vérifiez que $moduleId est correct. Si la variable est vide, vérifiez que vous utilisez le nom de module correct

    3. Démarrez le service SSH à l’intérieur du conteneur Linux

      Invoke-EflowVmCommand "sudo docker exec -it -d $moduleId service ssh start"
      
    4. Ouvrez le port SSH du module sur la machine virtuelle EFLOW (ce tutoriel utilise le port 10022).

      Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 10022 -j ACCEPT"
      

    Avertissement

    Pour des raisons de sécurité, chaque fois que la machine virtuelle EFLOW redémarre, la règle de table IP est supprimée et les paramètres d’origine sont rétablis. En outre, le service SSH du module doit être redémarré manuellement.

  2. Après avoir démarré le service SSH, sélectionnez Déboguer ->Attacher au processus, définissez Type de connexion sur SSH et Cible de connexion sur l’adresse IP de votre machine virtuelle EFLOW. Si vous ne connaissez pas l’adresse IP de la machine virtuelle EFLOW, vous pouvez utiliser le cmdlet PowerShell Get-EflowVmAddr. Tout d’abord, tapez l’adresse IP, puis appuyez sur entrée. Dans la fenêtre contextuelle, entrez les configurations suivantes :

    Champ Valeur
    Nom d’hôte Utilisez l’adresse IP de la machine virtuelle EFLOW
    Port 10022 (ou celui que vous avez utilisé dans votre configuration de déploiement)
    Nom d’utilisateur root
    Type d’authentification Clé privée
    Fichier de clé privée Chemin d’accès complet au id_rsa créé à l’étape précédente
    Phrase secrète Phrase secrète utilisée pour la clé créée à l’étape précédente

    Screenshot of how to connect to a remote system

  3. Après vous être connecté au module à l’aide de SSH, vous pouvez choisir le processus et sélectionner Attacher. Pour le module C#, vous devez choisir le processus dotnet et Attacher à Managé (CoreCLR). La première fois peut prendre 10 à 20 secondes.

    Screenshot of how to attach an edge module process.

  4. Définissez un point d’arrêt pour inspecter le module.

    • Si vous développez en C#, définissez un point d’arrêt dans la fonction PipeMessage() dans ModuleBackgroundService.cs.
    • Si vous utilisez C, définissez un point d’arrêt dans la fonction InputQueue1Callback() dans InputQueue1Callback().
  5. La sortie de SimulatedTemperatureSensor doit être redirigée vers input1 du module C# Linux personnalisé. Le point d’arrêt doit être déclenché. Vous pouvez regarder les variables dans la fenêtre Variables locales de Visual Studio.

    Screenshot of how to debug a single module

  6. Appuyez sur Ctrl+F5 ou sélectionnez le bouton Arrêter pour arrêter le débogage.

Nettoyer les ressources

Si vous envisagez de passer à l’article recommandé suivant, vous pouvez conserver les ressources et configurations que vous avez créées afin de les réutiliser. Vous pouvez également continuer à utiliser le même appareil IoT Edge comme appareil de test.

Sinon, vous pouvez supprimer les ressources Azure et les configurations locales que vous avez utilisées dans cet article pour éviter les frais.

Supprimer les ressources Azure

La suppression des ressources et des groupes de ressources Azure est irréversible. Veillez à ne pas supprimer accidentellement les mauvaises ressources ou le mauvais groupe de ressources. Si vous avez créé le hub IoT à l’intérieur d’un groupe de ressources existant qui contient des ressources que vous souhaitez conserver, supprimez uniquement la ressource du hub IoT, plutôt que le groupe de ressources.

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 cliquer sur chaque ressource pour les supprimer individuellement.

Étapes suivantes

Dans ce tutoriel, vous avez configuré Visual Studio sur votre machine de développement, et déployé et débogué votre premier module IoT Edge à partir de celle-ci. Les concepts de base n’ayant plus de secret pour vous, essayez d’ajouter des fonctionnalités à un module afin qu’il puisse analyser les données transitant par son intermédiaire.