Tutoriel : Déployer des fonctions Azure comme modules IoT Edge

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.

Vous pouvez utiliser Azure Functions pour déployer un code qui implémente votre logique métier directement sur vos appareils Azure IoT Edge. Ce tutoriel vous guide dans la création et le déploiement d’une fonction Azure qui filtre des données de capteur sur l’appareil IoT Edge simulé. Vous utilisez l’appareil IoT Edge que vous avez créé dans les guides de démarrage rapide. Dans ce tutoriel, vous allez apprendre à :

  • Utilisez Visual Studio Code pour créer une fonction Azure.
  • Utiliser Visual Studio Code et Docker pour créer une image Docker et la publier dans un registre de conteneurs.
  • Déployez le module du registre de conteneurs sur votre appareil IoT Edge.
  • Affichez les données filtrées.

Diagram of function architecture, showing how to stage and deploy a function module.

La fonction Azure que vous créez dans ce tutoriel filtre les données de température générées par votre appareil. La fonction envoie uniquement des messages en amont au hub Azure IoT quand la température dépasse un seuil spécifié.

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

Prérequis

Avant de commencer ce tutoriel, exécutez le tutoriel de configuration de votre environnement de développement pour le développement de conteneur Linux : Développer des modules Azure IoT Edge avec Visual Studio Code. Ce tutoriel vous permet d’obtenir les prérequis suivants :

Pour développer un module IoT Edge avec Azure Functions, installez des éléments prérequis supplémentaires sur votre machine de développement :

Créer un projet Function

L’extension Azure IoT Edge pour Visual Studio Code, que vous avez installée conformément aux prérequis, offre des fonctionnalités de gestion ainsi que certains modèles de code. Dans cette section, vous allez utiliser Visual Studio Code pour créer une solution IoT Edge contenant une fonction Azure.

Création d'un projet

Procédez comme suit pour créer un modèle de solution de fonction C# personnalisable.

  1. Ouvrez Visual Studio Code sur votre ordinateur de développement.

  2. Ouvrez la palette de commandes Visual Studio Code en sélectionnant Affichage>Palette de commandes.

  3. Dans la palette de commandes, ajoutez, puis exécutez la commande Azure IoT Edge : nouvelle solution IoT Edge. Suivez ces invites dans la palette de commandes pour créer votre solution :

    • Sélectionnez un dossier : choisissez l’emplacement sur votre machine de développement pour que Visual Studio Code crée les fichiers de la solution.
    • Indiquez un nom de solution : ajoutez un nom descriptif pour votre solution, par exemple FunctionSolution, ou acceptez le nom par défaut.|
    • Sélectionnez un modèle de module : choisissez Azure Functions - C#.
    • Fournir un nom de module | Nommez votre module CSharpFunction.
    • Indiquez un référentiel d’images Docker pour le module. Un référentiel d’images comprend le nom de votre registre de conteneurs et celui de votre image conteneur. Votre image conteneur est préremplie depuis la dernière étape. Remplacez localhost:5000 par la valeur de Serveur de connexion provenant de votre registre de conteneurs Azure. Vous pouvez récupérer le serveur de connexion depuis la page Vue d’ensemble de votre registre de conteneurs dans le Portail Azure. La chaîne finale ressemble à <nom de registre>.azurecr.io/csharpfunction.

    Screenshot showing where to add your Docker image repository name in Visual Studio Code.

Ajouter les informations d’identification de votre registre

Le fichier d’environnement de votre solution 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 privées sur votre appareil IoT Edge.

L’extension IoT Edge dans Visual Studio Code tente d’extraire d’Azure vos informations d’identification de registre de conteneurs, puis de les insérer dans le fichier d’environnement. Vérifiez si vos informations d’identification sont déjà dans le fichier. Si ce n’est pas le cas, veuillez les ajouter maintenant :

  1. Dans l’Explorateur Visual Studio Code, ouvrez le fichier .env.
  2. Mettre à jour les champs avec les valeurs de nom d’utilisateur et de mot de passe que vous avez copiées à partir de votre registre de conteneurs Azure. Vous pouvez les retrouver en accédant à votre registre de conteneurs dans Azure, puis en consultant la page Paramètres>Clés d’accès.
  3. Enregistrez ce fichier.

Notes

Ce tutoriel utilise les informations d’identification de l’administrateur pour Azure Container Registry, qui sont pratiques pour les 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.

Définir l’architecture cible sur AMD64

L’exécution de modules Azure Functions sur IoT Edge est prise en charge uniquement sur les conteneurs Linux AMD64. L’architecture cible par défaut pour Visual Studio Code est Linux AMD64, mais nous allons la définir explicitement sur Linux AMD64.

  1. Ouvrez la palette de commandes, puis recherchez Azure IoT Edge: Set Default Target Platform for Edge Solution (Azure IoT Edge : définir la plateforme cible par défaut pour la solution Edge).

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

Mettre à jour le module avec du code personnalisé

Nous allons ajouter du code supplémentaire afin que votre module CSharpFunction traite les messages en périphérie avant leur transfert vers IoT Hub.

  1. Dans l’Explorateur Visual Studio Code, ouvrez modules>CSharpFunction>CSharpFunction.cs.

  2. Remplacez le contenu du fichier CSharpFunction.cs par le code suivant. Ce code reçoit les données de télémétrie concernant la température ambiante et la température de l’appareil. Il transmet uniquement le message à IoT Hub si la température de l’appareil dépasse un seuil défini.

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    using System.Threading.Tasks;
    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Extensions.EdgeHub;
    using Microsoft.Azure.WebJobs.Host;
    using Microsoft.Extensions.Logging;
    using Newtonsoft.Json;
    
    namespace Functions.Samples
    {
        public static class CSharpFunction
        {
            [FunctionName("CSharpFunction")]
            public static async Task FilterMessageAndSendMessage(
                [EdgeHubTrigger("input1")] Message messageReceived,
                [EdgeHub(OutputName = "output1")] IAsyncCollector<Message> output,
                ILogger logger)
            {
                const int temperatureThreshold = 20;
                byte[] messageBytes = messageReceived.GetBytes();
                var messageString = System.Text.Encoding.UTF8.GetString(messageBytes);
    
                if (!string.IsNullOrEmpty(messageString))
                {
                    logger.LogInformation("Info: Received one non-empty message");
                    // Get the body of the message and deserialize it.
                    var messageBody = JsonConvert.DeserializeObject<MessageBody>(messageString);
    
                    if (messageBody != null && messageBody.machine.temperature > temperatureThreshold)
                    {
                        // Send the message to the output as the temperature value is greater than the threshold.
                        using (var filteredMessage = new Message(messageBytes))
                        {
                             // Copy the properties of the original message into the new Message object.
                             foreach (KeyValuePair<string, string> prop in messageReceived.Properties)
                             {filteredMessage.Properties.Add(prop.Key, prop.Value);}
                             // Add a new property to the message to indicate it is an alert.
                             filteredMessage.Properties.Add("MessageType", "Alert");
                             // Send the message.
                             await output.AddAsync(filteredMessage);
                             logger.LogInformation("Info: Received and transferred a message with temperature above the threshold");
                        }
                    }
                }
            }
        }
        //Define the expected schema for the body of incoming messages.
        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;}
        }
    }
    
  3. Enregistrez le fichier .

Créer et envoyer (push) votre solution IoT Edge

Dans la section précédente, vous avez créé une solution IoT Edge et modifié CSharpFunction pour filtrer les messages dans lesquels la température de machine signalée est sous le seuil acceptable. Vous devez maintenant générer la solution comme image de conteneur et l’envoyer à votre registre de conteneurs.

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

  2. Connectez-vous à Docker en entrant la commande suivante dans le terminal. Connectez-vous avec le nom d’utilisateur, le mot de passe et le serveur de connexion de votre registre de conteneurs Azure. Vous pouvez récupérer ces valeurs dans la section Clés d’accès de votre registre dans le portail Azure.

    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. Bien qu’il s’agisse de la bonne pratique recommandée pour les scénarios de production, elle n’est pas pertinente pour ce tutoriel. Pour plus d’informations, consultez les informations de référence sur docker login.

  3. Dans l’Explorateur Visual Studio Code, cliquez avec le bouton droit sur le fichier deployment.template.json et sélectionnez Build and Push IoT Edge Solution (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, elle crée un dossier dans la solution appelé config contenant le manifeste de déploiement en entier. Il est généré à partir des 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.

Afficher votre image de conteneur

Visual Studio Code génère un message de réussite quand l’image de conteneur est envoyée au registre de conteneurs. Si vous voulez confirmer la réussite de l’opération pour vous-même, vous pouvez afficher l’image dans le registre.

  1. Dans le portail Azure, accédez à votre registre Azure Container Registry.
  2. Sélectionnez Services>Référentiels.
  3. Le référentiel csharpfunction doit apparaître dans la liste. Sélectionnez ce référentiel pour afficher plus de détails.
  4. Dans la section Balises, vous devez voir la balise 0.0.1-amd64. Cette balise indique la version et la plateforme de l’image que vous avez générée. Ces valeurs sont définies dans le fichier module.json dans le dossier CSharpFunction.

Déployer et exécuter la solution

Vous pouvez utiliser le Portail Azure pour déployer votre module de fonction sur un appareil IoT Edge comme vous l’avez fait lors du démarrage rapide. Vous pouvez également déployer et surveiller des modules à partir de Visual Studio Code. Les sections suivantes utilisent les extensions Azure IoT Edge et Azure IoT Hub pour Visual Studio Code mentionnées dans les prérequis. Installez les extensions maintenant, si ce n’est pas déjà fait.

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

  2. Cliquez avec le bouton droit sur le nom de votre appareil IoT Edge, puis sélectionnez Créer un déploiement pour un seul appareil.

  3. Accédez au dossier solution qui contient la fonction CSharpFunction. Ouvrez le dossier config, sélectionnez le fichier deployment.amd64.json, puis cliquez sur Sélectionner un manifeste de déploiement Edge.

  4. Développez la section Modules sous votre appareil pour voir la liste des modules déployés et en cours d’exécution. Cliquez sur le bouton Actualiser. Vous devez voir le nouveau module CSharpFunction en cours d’exécution avec le module SimulatedTemperatureSensor ainsi que $edgeAgent et $edgeHub.

    Plusieurs minutes peuvent être nécessaires avant que les nouveaux modules n’apparaissent. Votre appareil IoT Edge doit récupérer ses nouvelles informations de déploiement dans IoT Hub, démarrer les nouveaux conteneurs, puis communiquer son état à IoT Hub.

    Screenshot showing how to view deployed modules in Visual Studio Code.

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

Vous pouvez afficher tous les messages arrivant dans votre hub IoT depuis tous vos appareils en exécutant Azure IoT Hub: Start Monitoring Built-in Event Endpoint (Démarrer la supervision du point de terminaison d’événements intégré) dans la palette de commandes. Pour cesser la surveillance des messages, exécutez la commande Azure IoT Hub: Stop Monitoring Built-in Event Endpoint (Arrêter la supervision du point de terminaison d’événements intégré) dans la palette de commandes.

Vous pouvez également filtrer pour afficher tous les messages qui arrivent dans votre hub IoT à partir d’un appareil spécifique. Cliquez avec le bouton droit sur l’appareil dans la section Azure IoT Hub>Appareils de l’Explorateur Visual Studio Code, puis sélectionnez Start Monitoring Built-in Event Endpoint (Démarrer la supervision du point de terminaison d’événements intégré).

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 créé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 créé un module de fonction Azure contenant le code pour filtrer les données brutes générées par votre appareil IoT Edge.

Passez aux tutoriels suivants pour en savoir plus sur les autres façons dont Azure IoT Edge peut vous aider à transformer des données en informations métier « en périphérie».