Partager via


Tutoriel : Développer des modules IoT Edge à l’aide de Visual Studio Code

s’applique à :IoT Edge 1.5 coche IoT Edge 1.5

Important

IoT Edge 1.5 LTS est la version prise en charge. IoT Edge 1.4 LTS est en fin de vie depuis le 12 novembre 2024. Si vous utilisez une version antérieure, consultez Mettre à jour IoT Edge.

Ce tutoriel vous montre comment développer et déployer votre code sur un appareil IoT Edge. Les modules Azure IoT Edge vous permettent de déployer du code qui exécute votre logique métier directement sur votre appareil IoT Edge. Dans le guide de démarrage rapide Déployer du code sur un appareil Linux, vous avez créé un appareil IoT Edge et déployé un module à partir de la Place de marché Azure.

Cet article décrit les étapes de deux outils de développement IoT Edge :

  • Ligne de commande (CLI) de l’outil de développement Azure IoT Edge, qui est recommandée pour le développement.
  • Outils Azure IoT Edge pour l’extension Visual Studio Code , qui est en mode maintenance.

Utilisez le bouton sélecteur d’outils au début de cet article pour choisir votre outil.

Dans ce tutoriel, vous allez apprendre à :

  • Configurer votre ordinateur de développement
  • Utiliser les outils IoT Edge pour créer un projet
  • Générez votre projet en tant que conteneur Docker et stockez-le dans un registre de conteneurs Azure
  • Déployer votre code sur un appareil IoT Edge

Le module IoT Edge que vous créez dans ce tutoriel filtre les données de température générées par votre appareil. Il envoie des messages en amont uniquement si la température est supérieure à un seuil défini. Ce type d’analyse à la périphérie permet de réduire la quantité de données envoyées et stockées dans le cloud.

Prérequis

Une machine de développement :

  • Utilisez votre propre ordinateur ou une machine virtuelle.
  • Assurez-vous que votre machine de développement prend en charge la virtualisation imbriquée pour exécuter un moteur de conteneur.
  • Vous pouvez utiliser la plupart des systèmes d’exploitation qui exécutent un moteur de conteneur pour développer des modules IoT Edge pour les appareils Linux. Ce tutoriel utilise un ordinateur Windows, mais il souligne les différences connues sur macOS ou Linux.
  • Installer Visual Studio Code
  • Installez Azure CLI.

Un appareil Azure IoT Edge :

Ressources cloud :

Si vous ne disposez pas d’un compte Azure, créez-en un gratuitement avant de commencer.

Conseil

Pour obtenir des conseils sur le débogage interactif dans Visual Studio Code ou Visual Studio 2022 :

Ce didacticiel décrit les étapes de développement pour Visual Studio Code.

Concepts clés

Ce tutoriel décrit le développement d’un module IoT Edge. Un module IoT Edge est un conteneur avec du code exécutable. Déployez un ou plusieurs modules sur un appareil IoT Edge. Les modules effectuent des tâches spécifiques telles que l’ingestion de données à partir de capteurs, le nettoyage et l’analyse des données, ou l’envoi de messages à un IoT Hub. Pour plus d’informations, consultez Comprendre les modules Azure IoT Edge.

Lorsque vous développez des modules IoT Edge, comprenez la différence entre l’ordinateur de développement et l’appareil IoT Edge cible où le module se déploie. Le conteneur que vous générez pour contenir votre code de module doit correspondre au système d’exploitation de l’appareil cible. Par exemple, le scénario le plus courant consiste à développer un module sur un ordinateur Windows pour cibler un appareil Linux exécutant IoT Edge. Dans ce cas, le système d’exploitation conteneur est Linux. À mesure que vous parcourez ce tutoriel, gardez à l’esprit la différence entre le système d’exploitation de l’ordinateur de développement et le système d’exploitation conteneur.

Conseil

Si vous utilisez IoT Edge pour Linux sur Windows, l’appareil cible dans votre scénario est la machine virtuelle Linux, et non l’hôte Windows.

Ce tutoriel cible les appareils exécutant IoT Edge avec des conteneurs Linux. Utilisez votre système d’exploitation préféré tant que votre machine de développement exécute des conteneurs Linux. Visual Studio Code est recommandé pour le développement avec des conteneurs Linux. Ce didacticiel l’utilise donc. Vous pouvez aussi bien utiliser Visual Studio, bien qu’il existe des différences de prise en charge entre les deux outils.

Le tableau suivant répertorie les scénarios de développement pris en charge pour les conteneurs Linux dans Visual Studio Code et Visual Studio.

Visual Studio Code Visual Studio 2019/2022
Architecture des appareils Linux Linux AMD64
Linux ARM32v7
Linux ARM64
Linux AMD64
Linux ARM32
Linux ARM64
Services Azure Azure Functions
Azure Stream Analytics
Azure Machine Learning
Langues C
C#
Java
Node.js
Python
C
C#
Plus d’informations Azure IoT Edge pour Visual Studio Code Azure IoT Edge Tools pour Visual Studio 2019
Outils Azure IoT Edge pour Visual Studio 2022

Installer le moteur de conteneur

Les modules IoT Edge sont empaquetés en tant que conteneurs. Vous avez donc besoin d’un système de gestion de conteneurs compatible Docker sur votre ordinateur de développement pour les générer et les gérer. Docker Desktop est un choix populaire pour le développement, car il offre une prise en charge forte des fonctionnalités. Docker Desktop sur Windows vous permet de basculer entre les conteneurs Linux et les conteneurs Windows, afin de pouvoir développer des modules pour différents types d’appareils IoT Edge.

Utilisez la documentation Docker pour installer Docker sur votre ordinateur de développement :

Configurer des outils

Installez l’outil de développement Azure IoT Edge basé sur Python pour créer votre solution IoT Edge. Deux options s'offrent à vous :

Important

Les outils Azure IoT Edge pour l’extension Visual Studio Code sont 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.

Utilisez les extensions IoT pour Visual Studio Code pour développer des modules IoT Edge. Ces extensions offrent des modèles de projet, automatisent la création du manifeste de déploiement et vous permettent de surveiller et de gérer les appareils IoT Edge. Dans cette section, vous installez Visual Studio Code et l’extension IoT, puis configurez votre compte Azure pour gérer les ressources IoT Hub à partir de Visual Studio Code.

  1. Installez l’extension Azure IoT Edge .

  2. Installez l’extension Azure IoT Hub .

  3. Après avoir installé les extensions, ouvrez la palette de commandes en sélectionnant Afficher> lapalette de commandes.

  4. Dans la palette de commandes, recherchez et sélectionnez Azure IoT Hub : sélectionnez IoT Hub. Suivez les invites pour sélectionner votre abonnement Azure et IoT Hub.

  5. Ouvrez la section Explorateur de Visual Studio Code en sélectionnant l’icône dans la barre d’activité ou en sélectionnant View>Explorer.

  6. En bas de la section Explorateur, développez le menu Azure IoT Hub / Appareils réduit. Vous voyez les appareils et les appareils IoT Edge associés à IoT Hub que vous avez sélectionnés via la palette de commandes.

Installer des outils spécifiques au langage

Installez des outils spécifiques à votre langage de développement :

Créer un registre de conteneur

Dans ce tutoriel, vous utilisez les extensions Azure IoT Edge et Azure IoT Hub pour générer un module et créer une image conteneur à partir des fichiers. Ensuite, vous envoyez cette image à un registre qui stocke et gère vos images. Enfin, déployez votre image à partir de votre registre de façon à l’exécuter sur votre appareil IoT Edge.

Important

L’extension Azure IoT Edge Visual Studio Code est en mode maintenance.

Vous pouvez utiliser n’importe quel registre Docker pour stocker vos images conteneur. Deux services de Registre Docker populaires sont Azure Container Registry et Docker Hub. Ce didacticiel utilise Azure Container Registry.

Si vous ne disposez pas d’un registre de conteneurs, suivez ces étapes pour en créer un dans Azure :

  1. Dans le portail Azure, sélectionnez Créer une ressource>Conteneurs>Registre de conteneurs.

  2. Fournissez les valeurs suivantes qui sont nécessaires pour créer votre registre de conteneurs :

    Champ Valeur
    Abonnement Sélectionnez un abonnement dans la liste déroulante.
    groupe de ressources Utilisez le même groupe de ressources pour toutes les ressources de test que vous créez dans le cadre des tutoriels et guides de démarrage rapide IoT Edge. Par exemple, IoTEdgeResources.
    Nom du registre Fournissez un nom unique.
    Emplacement Choisissez un emplacement proche de vous.
    Référence (SKU) Sélectionnez De base.
  3. Sélectionnez Vérifier + créer, puis Créer.

  4. Sélectionnez votre nouveau registre de conteneurs dans la section Ressources de votre page d’accueil du portail Azure pour l’ouvrir.

  5. Dans le volet gauche de votre registre de conteneurs, sélectionnez Clés d’accès dans le menu situé sous Paramètres.

    Capture d’écran de l’emplacement du menu Clés d’accès.

  6. Activez l’utilisateur administrateur avec le bouton bascule et affichez le nom d’utilisateur et le mot de passe de votre registre de conteneurs.

  7. Copiez les valeurs du serveur de connexion, du nom d’utilisateur et du mot de passe , puis enregistrez-les quelque part de façon pratique. Vous utilisez ces valeurs dans le tutoriel pour permettre l’accès au registre de conteneurs.

Créer un projet de module

L’extension Azure IoT Edge offre des modèles de projet pour tous les langages de module IoT Edge pris en charge dans Visual Studio Code. Ces modèles incluent tous les fichiers et le code dont vous avez besoin pour déployer un module de travail pour tester IoT Edge ou vous donner un point de départ pour personnaliser le modèle avec votre propre logique métier.

Créer un modèle de projet

L’outil de développement IoT Edge simplifie le développement Azure IoT Edge avec des commandes pilotées par des variables d’environnement. Il vous aide à démarrer avec le développement IoT Edge à l’aide du conteneur de développement IoT Edge et de la structure de solution IoT Edge qui inclut un module par défaut et tous les fichiers de configuration requis.

  1. Créez un répertoire pour votre solution sur le chemin souhaité. Accédez à votre iotedgesolution répertoire.

    mkdir c:\dev\iotedgesolution
    cd c:\dev\iotedgesolution
    
  2. Utilisez la commande init de la solution iotedgedev pour créer une solution et configurer votre Hub Azure IoT dans le langage de développement de votre choix.

    iotedgedev solution init --template csharp
    

Le script init de la solution iotedgedev vous invite à effectuer plusieurs étapes, notamment :

  • Authentification auprès d’Azure
  • Choisir un abonnement Azure
  • Choisir ou créer un groupe de ressources
  • Choisir ou créer un hub IoT Azure
  • Choisir ou créer un appareil Azure IoT Edge

Utilisez Visual Studio Code et l’extension Azure IoT Edge . Commencez par créer une solution, puis générez le premier module dans cette solution. Chaque solution peut inclure plusieurs modules.

  1. Sélectionnez Afficher>Palette de commandes.
  2. Dans la palette de commandes, entrez et exécutez la commande Azure IoT Edge : Nouvelle solution IoT Edge.
  3. Accédez au dossier dans lequel vous souhaitez créer la nouvelle solution, puis sélectionnez Sélectionner un dossier.
  4. Entrez un nom pour votre solution.
  5. Sélectionnez un modèle de module correspondant à votre langage de développement préféré. Il s'agira du premier module de la solution.
  6. Entrez un nom pour votre module. Choisissez un nom qui est unique dans le registre de conteneurs.
  7. Entrez le nom du référentiel d’images du module. Visual Studio Code remplit automatiquement le nom du module avec localhost :5000/<votre nom> de 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 ressemble à <nom du registre>.azurecr.io. Remplacez uniquement la partie localhost :5000 de la chaîne afin que le résultat final ressemble < au nom> du registre.azurecr.io/ <nom> du module.

À partir des informations que vous avez fournies, Visual Studio Code crée une solution IoT Edge, puis la charge dans une nouvelle fenêtre.

Après avoir créé la solution, ces fichiers principaux se trouvent dans la solution :

  • Le dossier .vscode inclut le fichier de configuration launch.json.

  • Le dossier modules contient des sous-dossiers pour chaque module. Dans chaque sous-dossier, le fichier module.json contrôle la façon dont les modules sont générés et déployés.

  • Le fichier .env répertorie vos variables d’environnement. La variable d’environnement pour le registre de conteneurs est localhost :5000 par défaut.

  • Deux fichiers de déploiement de module, deployment.template.json et deployment.debug.template.json, répertorient les modules à déployer sur votre appareil. Par défaut, la liste inclut les modules système IoT Edge (edgeAgent et edgeHub) et des exemples de modules tels que :

    Notes

    Les modules exacts installés peuvent dépendre de votre langue de choix.

Définir la version du runtime IoT Edge

La dernière version stable du module système IoT Edge est la version 1.5. Définissez vos modules système sur la version 1.5.

  1. Dans Visual Studio Code, ouvrez deployment.template.json fichier manifeste de déploiement. Le manifeste de déploiement est un document JSON qui décrit les modules à configurer 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.5 du runtime IoT Edge, modifiez les lignes suivantes dans le fichier manifeste de déploiement :

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

Fournir vos informations d’identification de registre à l’agent IoT Edge

Le fichier d’environnement stocke les informations d’identification de votre registre de conteneurs et les partage avec le runtime IoT Edge. Le runtime a besoin de ces informations d’identification pour extraire vos images conteneur sur l’appareil IoT Edge.

L’extension IoT Edge tente d’extraire d’Azure vos informations d’identification de registre de conteneurs et de les insérer dans le fichier d’environnement.

Notes

Le fichier d’environnement est créé uniquement si vous fournissez un référentiel d’images pour le module. Si vous avez accepté les valeurs localhost par défaut pour tester et déboguer localement, vous n’avez pas besoin de déclarer des variables d’environnement.

Vérifiez si vos informations d’identification existent. Si ce n’est pas le cas, veuillez les ajouter maintenant :

  1. Si Azure Container Registry est votre registre, définissez un nom d’utilisateur et un mot de passe Azure Container Registry. Obtenez ces valeurs à partir du menuDes clés d’accès> de votre registre de conteneurs dans le portail Azure.

  2. Ouvrez le fichier .env dans votre solution de module.

  3. Ajoutez les valeurs de nom d’utilisateur et de mot de passe que vous avez copiées à partir de votre registre de conteneurs Azure. Par exemple :

    CONTAINER_REGISTRY_SERVER="myacr.azurecr.io"
    CONTAINER_REGISTRY_USERNAME="myacr"
    CONTAINER_REGISTRY_PASSWORD="<registry_password>"
    
  4. Enregistrez vos modifications dans le fichier .env .

Notes

Ce tutoriel utilise des informations d’identification d’administrateur pour Azure Container Registry qui sont pratiques pour les scénarios de développement et de test. Quand vous êtes prêt pour les scénarios de production, nous vous recommandons d’utiliser l’option d’authentification avec les privilèges minimum, comme les principaux de service ou les jetons délimités au dépôt. Pour plus d’informations, consultez Gérer l’accès à votre registre de conteneurs.

Architecture cible

Sélectionnez l’architecture que vous ciblez avec chaque solution, car cela affecte la façon dont le conteneur est généré et s’exécute. Linux AMD64 est la valeur par défaut. Pour ce tutoriel, utilisez une machine virtuelle Ubuntu comme appareil IoT Edge et conservez l’amd64 par défaut.

Si vous devez modifier l’architecture cible de votre solution, procédez comme suit.

  1. Ouvrez la palette de commandes et recherchez Azure IoT Edge : Définir la plateforme cible par défaut pour la solution Edge, ou sélectionnez l’icône de raccourci dans la barre latérale en bas de la fenêtre.

  2. Dans la palette de commandes, sélectionnez l’architecture cible dans la liste des options.

L’architecture cible est définie lorsque vous créez l’image conteneur lors d’une étape ultérieure.

Mettre à jour un module avec du code personnalisé

Chaque modèle inclut des exemples de code qui acceptent des données de capteur simulées à partir du module SimulatedTemperatureSensor et les acheminent vers ioT Hub. L’exemple de module reçoit des messages et les transmet. La fonctionnalité de pipeline montre un concept important dans IoT Edge : comment les modules communiquent entre eux.

Chaque module peut avoir plusieurs files d’attente d’entrée et de sortie déclarées dans son code. Le hub IoT Edge exécuté sur l’appareil achemine les messages de la sortie d’un module vers l’entrée d’un ou plusieurs modules. Le code spécifique permettant de déclarer des entrées et des sorties varie entre les langages, mais le concept est le même pour tous les modules. Pour plus d’informations sur le routage entre les modules, consultez Déclarer des itinéraires.

L’exemple de code C# fourni avec le modèle de projet utilise la classe ModuleClient à partir du Kit de développement logiciel (SDK) IoT Hub pour .NET.

  1. Dans l’Explorateur Visual Studio Code, ouvrez les modules>filtermodule>ModuleBackgroundService.cs.

  2. Avant l’espace de noms filtermodule, ajoutez trois instructions using pour les types utilisés ultérieurement :

    using System.Collections.Generic;     // For KeyValuePair<>
    using Microsoft.Azure.Devices.Shared; // For TwinCollection
    using Newtonsoft.Json;                // For JsonConvert
    
  3. Ajoutez la variable temperatureThreshold à la classe ModuleBackgroundService . Cette variable définit la valeur que la température mesurée doit dépasser pour que les données soient envoyées au hub IoT.

    static int temperatureThreshold { get; set; } = 25;
    
  4. Ajoutez les classes MessageBody, Machine et Ambient . Ces classes définissent le schéma attendu pour le corps des messages entrants.

    class MessageBody
    {
        public Machine machine {get;set;}
        public Ambient ambient {get; set;}
        public string timeCreated {get; set;}
    }
    class Machine
    {
        public double temperature {get; set;}
        public double pressure {get; set;}
    }
    class Ambient
    {
        public double temperature {get; set;}
        public int humidity {get; set;}
    }
    
  5. Recherchez la fonction ExecuteAsync . Cette fonction crée et configure un objet ModuleClient qui permet au module de se connecter au runtime Azure IoT Edge local pour envoyer et recevoir des messages. Après avoir créé le ModuleClient, le code lit la valeur temperatureThreshold à partir des propriétés souhaitées du jumeau de module. Le code inscrit un rappel pour recevoir des messages d’un hub IoT Edge via un point de terminaison appelé input1.

    Remplacez l’appel à la méthode ProcessMessageAsync par une nouvelle méthode qui met à jour le nom du point de terminaison et la méthode appelée lorsque l’entrée arrive. Ajoutez également une méthode SetDesiredPropertyUpdateCallbackAsync pour les mises à jour des propriétés souhaitées. Pour apporter cette modification, remplacez la dernière ligne de la méthode ExecuteAsync par le code suivant :

    // Register a callback for messages that are received by the module.
    // await _moduleClient.SetInputMessageHandlerAsync("input1", PipeMessage, cancellationToken);
    
    // Read the TemperatureThreshold value from the module twin's desired properties
    var moduleTwin = await _moduleClient.GetTwinAsync();
    await OnDesiredPropertiesUpdate(moduleTwin.Properties.Desired, _moduleClient);
    
    // Attach a callback for updates to the module twin's desired properties.
    await _moduleClient.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertiesUpdate, null);
    
    // Register a callback for messages that are received by the module. Messages received on the inputFromSensor endpoint are sent to the FilterMessages method.
    await _moduleClient.SetInputMessageHandlerAsync("inputFromSensor", FilterMessages, _moduleClient);
    
  6. Ajoutez la méthode onDesiredPropertiesUpdate à la classe ModuleBackgroundService . Cette méthode reçoit des mises à jour sur les propriétés souhaitées à partir du jumeau de module et met à jour la variable temperatureThreshold pour qu’elle corresponde. Tous les modules ont leur propre module jumeau, ce qui vous permet de configurer le code exécuté à l’intérieur d’un module directement à partir du cloud.

    static Task OnDesiredPropertiesUpdate(TwinCollection desiredProperties, object userContext)
    {
        try
        {
            Console.WriteLine("Desired property change:");
            Console.WriteLine(JsonConvert.SerializeObject(desiredProperties));
    
            if (desiredProperties["TemperatureThreshold"]!=null)
                temperatureThreshold = desiredProperties["TemperatureThreshold"];
    
        }
        catch (AggregateException ex)
        {
            foreach (Exception exception in ex.InnerExceptions)
            {
                Console.WriteLine();
                Console.WriteLine("Error when receiving desired property: {0}", exception);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine();
            Console.WriteLine("Error when receiving desired property: {0}", ex.Message);
        }
        return Task.CompletedTask;
    }
    
  7. Ajoutez la méthode FilterMessages . Cette méthode est appelée chaque fois que le module reçoit un message d’IoT Edge Hub. Il filtre les messages qui signalent des températures situées sous le seuil de température défini via le double de module. Il ajoute également la propriété MessageType au message avec la valeur définie sur Alert.

    async Task<MessageResponse> FilterMessages(Message message, object userContext)
    {
        var counterValue = Interlocked.Increment(ref _counter);
        try
        {
            ModuleClient moduleClient = (ModuleClient)userContext;
            var messageBytes = message.GetBytes();
            var messageString = Encoding.UTF8.GetString(messageBytes);
            Console.WriteLine($"Received message {counterValue}: [{messageString}]");
    
            // Get the message body.
            var messageBody = JsonConvert.DeserializeObject<MessageBody>(messageString);
    
            if (messageBody != null && messageBody.machine.temperature > temperatureThreshold)
            {
                Console.WriteLine($"Machine temperature {messageBody.machine.temperature} " +
                    $"exceeds threshold {temperatureThreshold}");
                using (var filteredMessage = new Message(messageBytes))
                {
                    foreach (KeyValuePair<string, string> prop in message.Properties)
                    {
                        filteredMessage.Properties.Add(prop.Key, prop.Value);
                    }
    
                    filteredMessage.Properties.Add("MessageType", "Alert");
                    await moduleClient.SendEventAsync("output1", filteredMessage);
                }
            }
    
            // Indicate that the message treatment is completed.
            return MessageResponse.Completed;
        }
        catch (AggregateException ex)
        {
            foreach (Exception exception in ex.InnerExceptions)
            {
                Console.WriteLine();
                Console.WriteLine("Error in sample: {0}", exception);
            }
            // Indicate that the message treatment is not completed.
            var moduleClient = (ModuleClient)userContext;
            return MessageResponse.Abandoned;
        }
        catch (Exception ex)
        {
            Console.WriteLine();
            Console.WriteLine("Error in sample: {0}", ex.Message);
            // Indicate that the message treatment is not completed.
            ModuleClient moduleClient = (ModuleClient)userContext;
            return MessageResponse.Abandoned;
        }
    }
    
  8. Enregistrez le fichier ModuleBackgroundService.cs .

  9. Dans l’Explorateur Visual Studio Code, ouvrez le fichier deployment.template.json dans votre espace de travail de solution IoT Edge.

  10. Étant donné que nous avons modifié le nom du point de terminaison sur lequel le module écoute, nous devons également mettre à jour les itinéraires dans le manifeste de déploiement afin que le edgeHub envoie des messages au nouveau point de terminaison.

    Recherchez la section routes dans le module jumeau $edgeHub. Mettez à jour l’itinéraire sensorTofiltermodule pour remplacer input1 par inputFromSensor:

    "sensorTofiltermodule": "FROM /messages/modules/tempSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/filtermodule/inputs/inputFromSensor\")"
    
  11. Ajoutez le module jumeau filtermodule au manifeste de déploiement. Insérez le contenu JSON suivant en bas de la section modulesContent, après le module jumeau $edgeHub :

       "filtermodule": {
           "properties.desired":{
               "TemperatureThreshold":25
           }
       }
    
  12. Enregistrez le fichier deployment.template.json .

Générer et envoyer (push) votre solution

Vous avez mis à jour le code du module et le modèle de déploiement pour comprendre plus facilement certains concepts de déploiement clés. Maintenant, vous êtes prêt à générer votre image conteneur module, puis à l’envoyer (push) à votre registre de conteneurs.

Dans Visual Studio Code, ouvrez le fichier manifeste de déploiementdeployment.template.json . Le manifeste de déploiement décrit les modules à configurer 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 Comment configurer des options de création de conteneur pour les modules IoT Edge.

Si vous utilisez Azure Container Registry pour stocker votre image de module, ajoutez vos informations d’identification à la section modulesContent>edgeAgent>settings>registryCredentials dans deployment.template.json. Remplacez myacr par votre propre nom de Registre et indiquez votre mot de passe et votre adresse du serveur de connexion . Par exemple :

"registryCredentials": {
    "myacr": {
        "username": "myacr",
        "password": "<your_acr_password>",
        "address": "myacr.azurecr.io"
    }
}

Ajoutez ou remplacez le contenu sérialisé suivant dans la valeur createOptions pour chaque système (edgeHub et edgeAgent) et module personnalisé (filtermodule et tempSensor) listés. Modifiez les valeurs si nécessaire.

"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"

Par exemple, la configuration filtermodule doit être similaire à :

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

Générer l’image Docker du module

Ouvrez le terminal intégré Visual Studio Code en sélectionnant Terminal>New Terminal.

Utilisez la commande dotnet publish afin de générer l’image conteneur pour l’architecture Linux et amd64. Accédez au répertoire filtermodule dans votre projet et exécutez la commande dotnet publish.

dotnet publish --os linux --arch x64 /t:PublishContainer

Actuellement, le modèle d’outil iotedgedev cible .NET 7.0. Si vous souhaitez cibler une autre version de .NET, vous pouvez modifier le fichier filtermodule.csproj et modifier les valeurs TargetFramework et PackageReference . Par exemple, pour cibler .NET 8.0, votre fichier filtermodule.csproj doit ressembler à ceci :

<Project Sdk="Microsoft.NET.Sdk.Worker">
    <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Devices.Client" Version="1.42.0" />
        <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
    </ItemGroup>
</Project>

Étiquetez l’image Docker avec vos informations de registre de conteneurs, version et architecture. Remplacez myacr par votre propre nom de Registre.

docker tag filtermodule myacr.azurecr.io/filtermodule:0.0.1-amd64

Pousser (push) l’image Docker du module

Fournissez les informations d’identification du registre de conteneurs à Docker afin qu’il puisse envoyer (push) votre image du conteneur à stocker dans le registre.

  1. Connectez-vous à Docker avec les informations d’identification ACR (Azure Container Registry).

    docker login -u <ACR username> -p <ACR password> <ACR login server>
    

    Il se peut que vous receviez un avertissement de sécurité recommandant d’utiliser --password-stdin. Nous recommandons cette meilleure pratique pour les scénarios de production, mais elle sort de l’étendue de ce tutoriel. Pour plus d’informations, consultez la référence docker login.

  2. Connectez-vous à Azure Container Registry. Vous devez installer Azure CLI pour utiliser la az commande. Cette commande demande votre nom d’utilisateur et votre mot de passe trouvés dans votre registre de conteneurs dans lesclés d’accès>.

    az acr login -n <ACR registry name>
    

    Conseil

    Si vous vous déconnectez à un moment quelconque de ce tutoriel, répétez les étapes de connexion Docker et Azure Container Registry pour continuer.

  3. Poussez 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/filtermodule:0.0.1-amd64
    
    # Or push the Docker image to an Azure Container Registry. Replace myacr with your Azure Container Registry name.
    
    az acr login --name myacr
    docker push myacr.azurecr.io/filtermodule:0.0.1-amd64
    

Mettre à jour le modèle de déploiement

Mettez à jour le modèle de déploiement deployment.template.json avec l’emplacement de l’image du registre de conteneurs. Par exemple, si vous utilisez un myacr.azurecr.io Azure Container Registry et que votre image est filtermodule :0.0.1-amd64, mettez à jour la configuration filtermodule sur :

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

Dans l’Explorateur Visual Studio Code, cliquez avec le bouton droit sur le fichier deployment.template.json , puis sélectionnez Générer et envoyer (push) la solution IoT Edge.

La commande de génération et d’envoi (push) déclenche trois opérations. Tout d’abord, il crée un dossier dans la solution appelée configuration qui contient le manifeste de déploiement complet, généré à partir d’informations dans le modèle de déploiement et d’autres fichiers de solution. Ensuite, elle exécute docker build pour générer l’image de conteneur basée sur le fichier docker correspondant à votre architecture cible. Puis, elle exécute docker push pour envoyer (push) le dépôt d’images vers votre registre de conteneurs.

Ce processus peut prendre plusieurs minutes la première fois, mais il est plus rapide la prochaine fois que vous exécutez les commandes.

Facultatif : Mettre à jour le module et l’image

Si vous apportez des modifications au code de votre module, vous devez reconstruire et envoyer l’image de module à votre registre de conteneurs. Suivez les étapes de cette section pour mettre à jour la build et l’image conteneur. Vous pouvez ignorer cette section si vous n’avez apporté aucune modification au code de votre module.

Ouvrez le fichier deployment.amd64.json dans le dossier config nouvellement créé. Le nom de fichier, reflétant l’architecture cible, est ainsi différent si vous avez choisi une autre architecture.

Notez que les deux paramètres qui avaient des espaces réservés contiennent maintenant leurs valeurs appropriées. La section registryCredentials contient votre nom d’utilisateur et mot de passe de registre extraits du fichier .env . Le filtermodule a le référentiel d’images complet avec le nom, la version et la balise d’architecture à partir du fichier module.json .

  1. Ouvrez le fichier module.json dans le dossier filtermodule .

  2. Changez le numéro de version de l’image de module. Par exemple, incrémentez le numéro de version de correctif en le définissant sur "version": "0.0.2" comme si vous aviez apporté un petit correctif dans le code du module.

    Conseil

    Les versions de module activent la gestion de version, ce qui vous permet de tester les modifications sur un petit ensemble d’appareils avant de déployer des mises à jour en production. Si vous n’incrémentez pas la version du module avant d’effectuer les opérations de génération et d’envoi (push), vous remplacez le dépôt dans votre registre de conteneurs.

  3. Enregistrez vos modifications dans le fichier module.json .

Générez et envoyez (push) l’image mise à jour avec une balise de version 0.0.2 . Par exemple, pour générer, puis envoyer (push) l’image pour le registre local ou un registre de conteneurs Azure, utilisez les commandes suivantes :


# Build the container image for Linux and amd64 architecture.

dotnet publish --os linux --arch x64

# For local registry:
# Tag the image with version 0.0.2, x64 architecture, and the local registry.

docker tag filtermodule localhost:5000/filtermodule:0.0.2-amd64

# For Azure Container Registry:
# Tag the image with version 0.0.2, x64 architecture, and your container registry information. Replace **myacr** with your own registry name.

docker tag filtermodule myacr.azurecr.io/filtermodule:0.0.2-amd64

Cliquez de nouveau avec le bouton droit sur le fichier deployment.template.json , puis sélectionnez à nouveau Générer et envoyer (push) la solution IoT Edge.

Ouvrez à nouveau le fichier deployment.amd64.json . Notez que le système de génération ne crée pas de fichier lorsque vous exécutez à nouveau la commande générer et envoyer (push). Le même fichier est plutôt mis à jour pour refléter les modifications. L’image filtermodule pointe désormais vers la version 0.0.2 du conteneur.

Pour vérifier plus en détail ce que la commande build et push a fait, accédez au portail Azure et accédez à votre registre de conteneurs.

Dans votre registre de conteneurs, sélectionnez Référentiels , puis filtermodule. Vérifiez que les deux versions de l’image envoient au registre.

Capture d’écran de l’emplacement où afficher les deux versions d’image dans votre registre de conteneurs.

Dépanner

Si vous rencontrez des erreurs lors de la génération et de l’envoi (push) de votre image de module, elles sont souvent liées à la configuration de Docker sur votre machine de développement. Pour passer en revue votre configuration, effectuez les vérifications suivantes :

  • Avez-vous exécuté la commande docker login en utilisant les informations d’identification que vous avez copiées à partir de votre registre de conteneurs ? Ces informations d’identification sont différentes de celles que vous utilisez pour vous connecter à Azure.
  • Votre référentiel de conteneurs est-il correct ? A-t-il les noms de registre de conteneur et de module appropriés ? Ouvrez le fichier module.json dans le dossier filtermodule à vérifier. La valeur du référentiel doit ressembler à <nom du registre>.azurecr.io/filtermodule.
  • Si vous avez utilisé un nom différent de filtermodule pour votre module, ce nom est-il cohérent dans l’ensemble de la solution ?
  • Votre machine exécute-t-elle le même type de conteneurs que celui que vous générez ? Ce tutoriel concerne les appareils Linux IoT Edge. Visual Studio Code doit donc dire amd64 ou arm32v7 dans la barre latérale, et Docker Desktop doit exécuter des conteneurs Linux.

Déployer des modules sur un appareil

Vous avez vérifié que des images de conteneur générées sont stockées dans votre registre de conteneurs, il est donc temps de les déployer sur un appareil. Vérifiez que votre appareil IoT Edge est opérationnel.

Utilisez la commande Azure CLI set-modules IoT Edge pour déployer les modules sur Azure IoT Hub. Par exemple, pour déployer les modules définis dans le fichier deployment.template.json sur IoT Hub my-iot-hub pour l’appareil IoT Edge my-device, utilisez la commande suivante. Remplacez les valeurs de nom du hub, ID d’appareil et login dans la chaîne de connexion IoT Hub par vos propres valeurs.

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

Conseil

Recherchez votre chaîne de connexion IoT Hub, y compris la clé d’accès partagé, dans le portail Azure. Accédez à votre IoT Hub >paramètres de sécurité>Stratégies d’accès partagé>iothubowner.

  1. Dans l’Explorateur Visual Studio Code, sous la section Azure IoT Hub , développez Appareils pour afficher votre liste d’appareils IoT.

  2. Cliquez avec le bouton droit sur l’appareil IoT Edge sur lequel vous souhaitez effectuer le déploiement, puis sélectionnez Créer un déploiement pour un seul appareil.

  3. Dans l’Explorateur de fichiers, accédez au dossier de configuration , puis sélectionnez le fichier deployment.amd64.json .

    N’utilisez pas le fichier deployment.template.json qui ne contient pas les informations d’identification du registre de conteneurs ou les valeurs d’image de module. Si vous ciblez un appareil Linux ARM32, le nom du manifeste de déploiement est deployment.arm32v7.json.

  4. Sous votre appareil, ouvrez Modules pour voir la liste des modules déployés et en cours d’exécution. Sélectionnez le bouton actualiser. Vous devez voir les nouveaux modules tempSensor et filtermodule s’exécutant sur votre appareil.

    Le démarrage des modules peut prendre quelques minutes. Le runtime IoT Edge reçoit son nouveau manifeste de déploiement, extrait les images de module à partir du runtime de conteneur, puis démarre chaque nouveau module.

Afficher les messages provenant de l’appareil

L’exemple de code de module obtient des messages via sa file d’attente d’entrée et les envoie via sa file d’attente de sortie. Le manifeste de déploiement configure des itinéraires qui envoient des messages à filtermodule à partir de tempSensor, puis transfèrent les messages de filtermodule vers IoT Hub. Les extensions Azure IoT Edge et Azure IoT Hub vous permettent de voir les messages à mesure qu’ils arrivent à IoT Hub à partir de votre appareil.

  1. Dans l’Explorateur Visual Studio Code, sélectionnez l’appareil IoT Edge que vous souhaitez surveiller, puis sélectionnez Démarrer la surveillance du point de terminaison d’événement intégré.

  2. Regardez la fenêtre de sortie dans Visual Studio Code pour voir les messages arrivent à votre IoT Hub.

    Capture d’écran de la fenêtre de sortie de Visual Studio Code montrant les messages appareil-à-cloud entrants.

Afficher les modifications sur l’appareil

Pour voir ce qui se passe sur votre appareil, utilisez les commandes de cette section pour inspecter l'environnement d'exécution et les modules IoT Edge s'exécutant sur votre appareil.

Ces commandes concernent votre appareil IoT Edge, et non votre ordinateur de développement. Si vous utilisez une machine virtuelle pour votre appareil IoT Edge, connectez-vous-y maintenant. Dans Azure, accédez à la page de présentation de la machine virtuelle et sélectionnez Se connecter pour accéder à la connexion shell sécurisée.

  • Affichez tous les modules déployés sur votre appareil et vérifiez leur état :

    iotedge list
    

    Vous voyez quatre modules : les deux modules d’exécution IoT Edge, tempSensor et filtermodule. Les quatre doivent être répertoriés comme étant en cours.

  • Examinez les journaux d’activité d’un module spécifique :

    iotedge logs <module name>
    

    Les noms de module respectent la casse.

    Les logs de tempSensor et de filtermodule montrent les messages qu'ils traitent. Le module edgeAgent démarre les autres modules. Ses journaux d’activité ont donc des informations sur le manifeste de déploiement. Si un module n’est pas répertorié ou n’est pas en cours d’exécution, vérifiez les journaux edgeAgent pour les erreurs. Le module edgeHub gère la communication entre les modules et IoT Hub. Si les modules s’exécutent, mais que les messages ne sont pas arrivés à votre IoT Hub, vérifiez les journaux edgeHub pour les erreurs.

Nettoyer les ressources

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

Sinon, supprimez les configurations locales et les ressources Azure 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 a des ressources que vous souhaitez conserver, supprimez uniquement la ressource IoT Hub elle-même, et non 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 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 configurez Visual Studio Code sur votre ordinateur de développement et déployez votre premier module IoT Edge avec du code qui filtre les données brutes générées par votre appareil IoT Edge.

Passez aux didacticiels suivants pour découvrir comment Azure IoT Edge vous permet de déployer des services cloud Azure pour traiter et analyser des données en périphérie.