Azure Logic App – Insérer des données dans SQL Azure et CosmosDB

Dans un article précédent j’utilisais Azure SQL Edge et Azure Data Sync pour remonter des informations issues de ma station météo vers une base de données SQL Azure. Ce scénario est un typique du monde IoT où un certain grand nombre de données issues de capteurs multiples sont poussés sur une base de données quelconque avant d’être analysées, éventuellement par une IA, en vue de détecter des problèmes, faire de la maintenance prédictive, etc …

Dans ce billet, donc, j’abordais l’outil de « programmation » Node-Red pour insérer les données dans Azure SQL Edge. Mais l’histoire n’était pas complète. Je souhaitais aussi que la ces données soient exportées vers des sites internet spécialisés (WeatherCloud, WeatherUnderground, …). J’ai donc utilisé les API de ces sites afin de pousser les données via des URL, comme c’est le cas ci-dessous.

Les heures passant, j’ai remarqué que le Rapsberry sur lequel était installé Azure SQL Edge souffrait de problèmes mémoire. De fait, la solution ne fonctionnait plus. J’ai commandé un modèle pourvu de 8GB de RAM afin de vérifier le comportement. Mai dans l’intervalle je souhaitais une solution simple à mettre en œuvre qui me permette de continuer à publier ces données dans Azure SQL Server. J’aurais très bien pu utiliser un node MSSQL. Cela fonctionne, je m’en sers pas ailleurs, en parallèle d’une insertion dans InfluxDB.

Mais, tant qu’à utiliser des service Azure, autant chercher des solutions alternatives. Rapidement l’envie de jouer avec les Logic Apps est venue.

Un déclencheur de type Request HTTP permet de capter exactement la même URL que celle utilisée pour les autres sites Météo. Il en reste alors qu’à écrire les données dans Azure SQL. Extrêmement simple …

J’ai donc utilisé le market place pour rechercher le service Logic App. Aucune difficulté lors de la création. Un nom, un groupe de ressources, une localisation géographique. Une fois la ressource créée, lorsque l’on passe en mode Design, il nous est proposé des templates, ainsi que des triggers afin de débuter notre application.

Je choisis donc le trigger HTTP request. Par défaut, le composant est configuré pour des requêtes de type POST. Sachant que je souhaite passer les valeurs en paramètre de l’URL, pas simplicité, il suffit de cliquer sur la combo « Add New Parameter », puis sélectionner la case à cocher « Method ». La validation se fait en cliquant … ailleurs, sur le canevas. OK, je vous l’accorde, ce n’est pas un modèle d’ergonomie évident à la première utilisation.

Une fois fait, la combo Method vous propose plusieurs choix, dont GET, que vous sélectionnez et validez.

Note : Pas d’affolement si au niveau du Design du composant, « HTTP POST URL » est encore affiché, il faut sauvegarder afin que cela soit modifié. Notez également, que l’URL de votre application n’est générée qu’après al sauvegarde.

Afin de vérifier que nous sommes capables de lire les données passées en paramètre, nous allons simplement utiliser une nouvelle étape de type HTTP Response. Pour cela, cliquez sur le bouton « New Step » qui apparait sur le canevas, dans la zone de recherche saisissez « response » et selectionnez le composant HTTP Response.

Le principe des Logic Apps, tout comme Node-Red ou même SSIS consiste à faire transiter un flux de données entre les différentes composants. Il suffit donc à présent de piocher la valeur de notre paramètre dans le flux. Lorsque vous cliquer sur « Enter response content » une fenêtre apparait vous proposant des éléments déjà connus et des fonctions telle que TriggerOutputs(). Nous aurions pu utiliser un Body de type JSON sur l’étape précédente et ainsi avoir accès aux différentes valeurs directement ou presque. Dans notre cas, il suffit d’utiliser une simple ligne de code dans la zone de saisie Body: @triggerOutputs()[‘queries’][‘temp’] , temp étant le nom du paramètre dans l’URL.

Vous pouvez aussi utiliser la fenêtre d’ajout de contenu dynamique, cliquer sur Expression, rechercher « triggerOutput » et saisir le reste de la commande [‘queries’][‘temp’].

Sauvegardez, et notez que l’URL est a présent disponible.

Afin de tester, copiez cette URL, ajoutez un paramètre (par exemple &temp=28.5) et testez depuis un navigateur. Vous devez recevoir en réponse une page Web vous présentant la valeur du paramètre.

Reste maintenant à insérer cette valeur dans Azure SQL Databases. POur cela on peut soit supprimer le composant HTTP Response et ajouter un composant SQL Server, soit ajouter une branche parallèle, notez le plus qui apparait sur la flèche de liaison entre les composants. Saisissez les informations d’authentifications (Azure AD, authentification SQL), le nom de votre server, de votre base de données.

Ensuite choisissez une opération de type Insert row (v2). Si tout se passe bien, vous devez pouvoir sélectionner le serveur et la base sélectionnés précédemment. Les tables de votre base doivent êtres elles aussi visible dans la liste. Et une fois la table sélectionnée, la liste des champs doit apparaitre. Pour ma part le DeviceID correspond à un de capteur de température que je possède. Pour les besoins de cette démo je vais arbitrairement utiliser un ID « factice ». La colonne Value est renseignée a l’aide du même code que précédemment : @triggerOutputs()[‘queries’][‘temp’]. Il n’y a plus qu’à sauvegarder et tester.

La page « Run History » de votre Logic App vous permet d’accéder aux informations relatives à l’exécution de votre App, la durée et le résultat. Ici tout est coché en vert, il semble donc que l’insert se soit fait correctement dans la table, ce que nous pouvons vérifier avec un simple SELECT.

Mais pourquoi proposer une solution aussi alambiquée alors qu’il était possible de faire un insert directement depuis Node-Red ? En fait, la station météo fournit, en plus de la température, des informations sur la force et la direction du vent, les précipitations, la pression atmosphérique, l’index UV, …. Toutes informations serait assez simples à stocker en NoSQL, sous forme d’un document JSON, non ? Et c’est là le fin mot de l’histoire. Profiter d’une seule URL pour insérer dans SQL Server et CosmosDB.

Here we go ! je vous laisse créer votre serveur CosmosDB, votre base et votre collection. Pour ma part, pas de clé de partition naturelle, je vais donc ventiler les données via une simple fonction Random, élément partition. Je commence par créer une variable également nommée partition initialisée par une valeur aléatoire rand(0,9). J’ai ensuite choisi de composer mon document XML au travers d’un composant spécifique afin d’appliquer quelques transformations aux données, des divisions par 10 dues au format d’entrée des sites Météo. Ensuite, j’ajoute un composant « Create or Update document » CosmosDB avec la sortie « Outputs » du composant précédent. il ne faut pas oublier d’ajouter le paramètre Partition key avec la valeur calculée précédemment.

Modifions le flux Node-Red afin de faire appel à l’URL de la Logic App.

Vérifions à présent si les données sont bien enregistrées dans CosmosDB …

Yes … tout est à présent inséré dans Azure SQL Database et CosmosDB.

Avec un peu d’habitude, il est aisé de se dispenser de la couche graphique de design d’une Logic App. Le code généré est clair et simple à lire. Visual Studio ou Visual Studio Code sont parfaitement outillés pour se passer avantageusement du portail.

D’autant plus qu’une version Designer est disponible…

Enjoy

A propos Christophe

Consultant SQL Server Formateur certifié Microsoft MVP SQL Server MCM/MCSM SQL Server
Cet article a été publié dans Azure, Azure Logic App, CosmosDB, SQL Azure. Ajoutez ce permalien à vos favoris.

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s