Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
S’applique à :
IoT Edge 1.4
Important
IoT Edge 1.5 LTS et IoT Edge 1.4 sont des versions prises en charge. Si vous utilisez une version antérieure, consultez Mettre à jour IoT Edge.
Déployez un module SQL Server pour stocker des données sur un appareil exécutant Azure IoT Edge avec des conteneurs Linux.
Utilisez Azure IoT Edge et SQL Server pour stocker et interroger des données à la périphérie. Azure IoT Edge dispose de fonctionnalités de stockage de base pour mettre en cache les messages si un appareil est hors connexion, puis les transférer lorsque la connexion est rétablie. Toutefois, vous souhaiterez peut-être des fonctionnalités de stockage plus avancées, telles que la possibilité d’interroger des données localement. Vos appareils IoT Edge peuvent utiliser des bases de données locales pour effectuer des calculs plus complexes sans avoir à maintenir une connexion à IoT Hub.
Cet article fournit des instructions pour le déploiement d’une base de données SQL Server sur un appareil IoT Edge. Azure Functions, exécuté sur l’appareil IoT Edge, structure les données entrantes, puis les envoie à la base de données. Les étapes décrites dans cet article peuvent également être appliquées à d’autres bases de données qui fonctionnent dans des conteneurs, comme MySQL ou PostgreSQL.
Dans ce tutoriel, vous allez apprendre à :
- Utiliser Visual Studio Code pour créer une fonction Azure
- Déployer une base de données SQL sur votre appareil IoT Edge
- Utiliser Visual Studio Code pour générer des modules et les déployer sur votre appareil IoT Edge
- Afficher les données générées
Si vous n’avez pas de compte Azure, créez un compte gratuit avant de commencer.
Prerequisites
Avant de commencer ce tutoriel, vous devez avoir suivi le tutoriel précédent pour configurer votre environnement de développement pour le développement de conteneurs Linux : développer des modules Azure IoT Edge à l’aide de Visual Studio Code. En effectuant ce didacticiel, vous devez disposer des conditions préalables suivantes :
- IoT Hub de niveau gratuit ou standard dans Azure.
- Un appareil AMD64 exécutant Azure IoT Edge avec des conteneurs Linux. Vous pouvez utiliser les guides de démarrage rapide pour configurer un appareil Linux ou un appareil Windows.
- Les appareils ARM, comme Raspberry Pis, ne peuvent pas exécuter SQL Server. Si vous souhaitez utiliser SQL sur un appareil ARM, vous pouvez utiliser Azure SQL Edge.
- Un registre de conteneurs, tel qu’Azure Container Registry.
- Visual Studio Code configuré avec les extensions Azure IoT Edge et Azure IoT Hub . Les outils Azure IoT Edge pour l’extension Visual Studio Code sont en mode maintenance.
- Téléchargez et installez un système de gestion de conteneurs compatible Docker sur votre ordinateur de développement. Configurez-le pour exécuter des conteneurs Linux.
Ce tutoriel utilise un module Azure Functions pour envoyer des données à SQL Server. Pour développer un module IoT Edge avec Azure Functions, installez les prérequis supplémentaires suivants sur votre machine de développement :
- C# pour l’extension Visual Studio Code (alimenté par OmniSharp) pour Visual Studio Code.
- KIT SDK .NET Core.
Créer un projet de fonction
Pour envoyer des données dans une base de données, vous avez besoin d’un module capable de structurer les données correctement, puis de les stocker dans une table.
Créer un projet
Les étapes suivantes vous montrent comment créer une fonction IoT Edge à l’aide de Visual Studio Code et de l’extension Azure IoT Edge.
Ouvrez Visual Studio Code.
Ouvrez la palette de commandes Visual Studio Code en sélectionnant Lapalette de commandesAfficher>.
Dans la palette de commandes, tapez et exécutez la commande Azure IoT Edge : Nouvelle solution IoT Edge. Dans la palette de commandes, fournissez les informations suivantes pour créer votre solution :
Terrain Valeur Sélectionner un dossier Choisissez l’emplacement sur votre ordinateur de développement pour Visual Studio Code pour créer les fichiers de solution. Fournir un nom de solution Entrez un nom descriptif pour votre solution, comme SqlSolution, ou acceptez la valeur par défaut. Sélectionner un modèle de module Choisissez Azure Functions - C#. Fournir un nom de module Nommez votre module sqlFunction. Fournir le référentiel d’images Docker pour le module Un référentiel d’images inclut le nom de votre registre de conteneurs et le nom de votre image conteneur. Votre image conteneur est préremplies à partir de la dernière étape. Remplacez localhost :5000 par la valeur du serveur de connexion à partir de votre registre de conteneurs Azure. Vous pouvez récupérer le serveur de connexion à partir de la page Vue d’ensemble de votre registre de conteneurs dans le portail Azure.
La chaîne finale ressemble à <name.azurecr.io/sqlfunction> de Registre.La fenêtre Visual Studio Code charge votre espace de travail de solution IoT Edge.
Ajouter vos informations d’identification de Registre
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 privées sur l’appareil IoT Edge.
L’extension IoT Edge tente d’extraire les informations d’identification de votre registre de conteneurs à partir d’Azure et de les remplir dans le fichier d’environnement. Vérifiez si vos informations d’identification sont déjà incluses. Si ce n’est pas le cas, ajoutez-les maintenant :
- Dans l’Explorateur Visual Studio Code, ouvrez le fichier .env.
- Mettez à 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.
- Enregistrez ce fichier.
Note
Ce didacticiel utilise les informations d’identification de connexion d’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 une option d’authentification avec privilèges minimum, comme les principaux de service. Pour plus d’informations, consultez Gérer l’accès à votre registre de conteneurs.
Sélectionner votre architecture cible
Vous devez sélectionner l’architecture que vous ciblez avec chaque solution, car le conteneur est généré et exécuté différemment pour chaque type d’architecture. La valeur par défaut est Linux AMD64.
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.
Dans la palette de commandes, sélectionnez l’architecture cible dans la liste des options. Pour ce tutoriel, nous utilisons une machine virtuelle Ubuntu en tant qu’appareil IoT Edge. Par conséquent, nous conserverons l’amd64 par défaut.
Mettre à jour le module avec du code personnalisé
Dans l’Explorateur Visual Studio Code, ouvrez les modules>sqlFunction sqlFunction.csproj>.
Recherchez le groupe de références de package et ajoutez-en un nouveau pour inclure SqlClient.
<PackageReference Include="System.Data.SqlClient" Version="4.5.1"/>Enregistrez le fichier sqlFunction.csproj .
Ouvrez le fichier sqlFunction.cs .
Remplacez l’intégralité du contenu du fichier par le code suivant :
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; using Sql = System.Data.SqlClient; namespace Functions.Samples { public static class sqlFunction { [FunctionName("sqlFunction")] 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); //Store the data in SQL db const string str = "<sql connection string>"; using (Sql.SqlConnection conn = new Sql.SqlConnection(str)) { conn.Open(); var insertMachineTemperature = "INSERT INTO MeasurementsDB.dbo.TemperatureMeasurements VALUES (CONVERT(DATETIME2,'" + messageBody.timeCreated + "', 127), 'machine', " + messageBody.machine.temperature + ");"; var insertAmbientTemperature = "INSERT INTO MeasurementsDB.dbo.TemperatureMeasurements VALUES (CONVERT(DATETIME2,'" + messageBody.timeCreated + "', 127), 'ambient', " + messageBody.ambient.temperature + ");"; using (Sql.SqlCommand cmd = new Sql.SqlCommand(insertMachineTemperature + "\n" + insertAmbientTemperature, conn)) { //Execute the command and log the # rows affected. var rows = await cmd.ExecuteNonQueryAsync(); logger.LogInformation($"{rows} rows were updated"); } } 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;} } }À la ligne 35, remplacez la <chaîne> de connexion sql par la chaîne suivante. La propriété source de données fait référence au conteneur SQL Server, qui n’existe pas encore. Vous allez le créer avec le nom SQL dans la section suivante. Choisissez un mot de passe fort pour le mot clé Password .
Data Source=tcp:sql,1433;Initial Catalog=MeasurementsDB;User Id=SA;Password=<YOUR-STRONG-PASSWORD>;TrustServerCertificate=False;Connection Timeout=30;Enregistrez le fichier sqlFunction.cs .
Ajouter le conteneur SQL Server
Un manifeste de déploiement déclare les modules que le runtime IoT Edge installera sur votre appareil IoT Edge. Vous avez fourni le code pour créer un module de fonction personnalisé dans la section précédente, mais le module SQL Server est déjà généré et disponible dans le Registre Microsoft Artifact. Vous devez simplement indiquer au runtime IoT Edge de l’inclure, puis le configurer sur votre appareil.
Dans Visual Studio Code, ouvrez la palette de commandes en sélectionnant Afficher> lapalette de commandes.
Dans la palette de commandes, tapez et exécutez la commande Azure IoT Edge : ajouter un module IoT Edge. Dans la palette de commandes, fournissez les informations suivantes pour ajouter un nouveau module :
Terrain Valeur Sélectionner un fichier de modèle de déploiement La palette de commandes met en évidence le fichier deployment.template.json dans votre dossier de solution actuel. Sélectionnez ce fichier. Sélectionner un modèle de module Sélectionnez Le module existant (entrez l’URL complète de l’image). Fournir un nom de module Entrez sql. Ce nom correspond au nom du conteneur déclaré dans la chaîne de connexion dans le fichier sqlFunction.cs. Fournir une image Docker pour le module Entrez l’URI suivant pour extraire l’image conteneur SQL Server à partir du Registre Microsoft Artifact. Pour les images basées sur Ubuntu, utilisez mcr.microsoft.com/mssql/server:latest. Pour les images basées sur Red Hat Enterprise Linux (RHEL), utilisezmcr.microsoft.com/mssql/rhel/server:latest.L’image conteneur Azure SQL Edge est une version légère et conteneurisée de SQL Server qui peut s’exécuter sur des appareils IoT Edge. Il est optimisé pour les scénarios de périphérie et peut s’exécuter sur des appareils ARM et AMD64.
Dans votre dossier de solution, ouvrez le fichier deployment.template.json .
Recherchez la section modules . Vous devriez voir trois modules. Le module SimulatedTemperatureSensor est inclus par défaut dans les nouvelles solutions et fournit des données de test à utiliser avec vos autres modules. Le module sqlFunction est le module que vous avez créé et mis à jour initialement avec le nouveau code. Enfin, le module sql a été importé à partir du Registre Microsoft Artifact.
Conseil / Astuce
Le module SQL Server est fourni avec un mot de passe par défaut défini dans les variables d’environnement du manifeste de déploiement. Chaque fois que vous créez un conteneur SQL Server dans un environnement de production, vous devez modifier le mot de passe administrateur système par défaut.
Fermez le fichier deployment.template.json .
Créer votre solution IoT Edge
Dans les sections précédentes, vous avez créé une solution avec un module, puis ajouté un autre au modèle de manifeste de déploiement. Le module SQL Server est hébergé publiquement par Microsoft, mais vous devez conteneuriser le code dans le module Functions. Dans cette section, vous générez la solution, créez des images conteneur pour le module sqlFunction et envoyez l’image à votre registre de conteneurs.
Dans Visual Studio Code, ouvrez le terminal intégré en sélectionnant Afficher> leterminal.
Connectez-vous à votre registre de conteneurs dans Visual Studio Code pour pouvoir envoyer vos images à votre registre. Utilisez les mêmes informations d’identification Azure Container Registry (ACR) que celles que vous avez ajoutées au fichier .env. Entrez la commande suivante dans le terminal intégré :
docker login -u <ACR username> -p <ACR password> <ACR login server>Vous pouvez voir un avertissement de sécurité qui recommande l’utilisation du paramètre --password-stdin. Bien que son utilisation soit en dehors de l’étendue de cet article, nous vous recommandons de suivre cette bonne pratique. Pour plus d’informations, consultez la référence de commande docker login .
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 build et push démarre 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, qui est généré à partir d’informations dans le modèle de déploiement et d’autres fichiers de solution. Ensuite, il s’exécute
docker buildpour générer l’image conteneur en fonction du fichier dockerfile approprié pour votre architecture cible. Ensuite, il s’exécutedocker pushpour envoyer (push) le référentiel d’images à votre registre de conteneurs.Ce processus peut prendre plusieurs minutes la première fois, mais est plus rapide la prochaine fois que vous exécutez les commandes.
Vous pouvez vérifier que le module sqlFunction a été envoyé (push) à votre registre de conteneurs. Dans le portail Azure, accédez à votre registre de conteneurs. Sélectionnez les référentiels et recherchez sqlFunction. Les deux autres modules, SimulatedTemperatureSensor et sql, ne seront pas envoyés (push) à votre registre de conteneurs, car leurs référentiels se trouvent déjà dans les registres Microsoft.
Déployer la solution sur un appareil
Vous pouvez définir des modules sur un appareil via IoT Hub, mais vous pouvez également accéder à votre IoT Hub et à vos appareils via Visual Studio Code. Dans cette section, vous configurez l’accès à votre IoT Hub, puis utilisez Visual Studio Code pour déployer votre solution sur votre appareil IoT Edge.
Dans l’Explorateur Visual Studio Code, sous la section Azure IoT Hub , développez Appareils pour afficher votre liste d’appareils IoT.
Cliquez avec le bouton droit sur l’appareil que vous souhaitez cibler avec votre déploiement, puis sélectionnez Créer un déploiement pour un seul appareil.
Sélectionnez le fichier deployment.amd64.json dans le dossier de configuration , puis cliquez sur Sélectionner le manifeste de déploiement Edge. N’utilisez pas le fichier deployment.template.json.
Sous votre appareil, développez Modules pour afficher la liste des modules déployés et en cours d’exécution. Cliquez sur le bouton Actualiser. Vous devez voir les nouveaux modules sql et sqlFunction s’exécutant avec le module SimulatedTemperatureSensor et les $edgeAgent et $edgeHub.
Vous pouvez également vérifier que tous les modules sont opérationnels sur votre appareil. Sur votre appareil IoT Edge, exécutez la commande suivante pour afficher l’état des modules.
iotedge listLe démarrage des modules peut prendre quelques minutes. Le runtime IoT Edge doit recevoir son nouveau manifeste de déploiement, extraire les images de module du runtime de conteneur, puis démarrer chaque nouveau module.
Créer la base de données SQL
Lorsque vous appliquez le manifeste de déploiement à votre appareil, vous obtenez trois modules en cours d’exécution. Le module SimulatedTemperatureSensor génère des données d’environnement simulées. Le module sqlFunction prend les données et les met en forme pour une base de données. Cette section vous guide tout au long de la configuration de la base de données SQL pour stocker les données de température.
Exécutez les commandes suivantes sur votre appareil IoT Edge. Ces commandes se connectent au module sql s’exécutant sur votre appareil et créent une base de données et une table pour contenir les données de température qui lui sont envoyées. Remplacez <YOUR-STRONG-PASSWORD> par le mot de passe fort que vous avez choisi dans votre chaîne de connexion.
Dans un outil en ligne de commande sur votre appareil IoT Edge, connectez-vous à votre base de données.
sudo docker exec -it sql bashOuvrez l’outil de commande SQL.
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YOUR-STRONG-PASSWORD>'Créez votre base de données :
CREATE DATABASE MeasurementsDB ON (NAME = MeasurementsDB, FILENAME = '/var/opt/mssql/measurementsdb.mdf') GODéfinissez votre table.
CREATE TABLE MeasurementsDB.dbo.TemperatureMeasurements (measurementTime DATETIME2, location NVARCHAR(50), temperature FLOAT) GO
Vous pouvez personnaliser votre fichier Docker SQL Server pour configurer automatiquement votre serveur SQL Server à déployer sur plusieurs appareils IoT Edge. Pour plus d’informations, consultez le projet de démonstration de conteneur Microsoft SQL Server.
Afficher les données locales
Une fois votre table créée, le module sqlFunction commence à stocker des données dans une base de données SQL Server 2017 locale sur votre appareil IoT Edge.
À partir de l’outil de commande SQL, exécutez la commande suivante pour afficher vos données de table mises en forme :
SELECT * FROM MeasurementsDB.dbo.TemperatureMeasurements
GO
Nettoyer les ressources
Si vous envisagez de passer à l’article recommandé suivant, vous pouvez conserver 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 qu’un appareil de test.
Sinon, vous pouvez supprimer les configurations locales et les ressources Azure que vous avez créées dans cet article pour éviter les frais.
Supprimer des 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 :
Connectez-vous au portail Azure, puis sélectionnez Groupes de ressources.
Sélectionnez le nom du groupe de ressources qui contient vos ressources de test IoT Edge.
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 supprimer uniquement certaines d’entre elles, vous pouvez cliquer sur chaque ressource pour les supprimer individuellement.
Dans ce tutoriel, vous avez créé un module Azure Functions qui contient du code pour filtrer les données brutes générées par votre appareil IoT Edge. Lorsque vous êtes prêt à créer vos propres modules, vous pouvez en savoir plus sur le développement de modules Azure IoT Edge à l’aide de Visual Studio Code.
Étapes suivantes
Si vous souhaitez essayer une autre méthode de stockage en périphérie, découvrez comment utiliser Stockage Blob Azure sur IoT Edge.