30 Apr 2019, 06:20

AWS IoT button, tu cliques, tu déploies ! #Tutoriel

Pourquoi cette idée ?

Je me suis souvent demandé quand peut-on considérer qu’on est mature au niveau de son workflow de déploiement. Beaucoup de réponses existent, le nombre de déploiement, le ratio de succès etc… Mais bon, les KPIs (key performance indicator) c’est pas la solution la plus fun. J’ai donc cherché une autre solution, moins conventionnelle. Et je me suis dit que mettre un bouton physique au milieu du bureau permettant à n’importe qui de déclencher un pipeline de déploiement, était une preuve suffisante et assez fun pour être mise en place sur mon blog. Vous vous en doutez si vous lisez ces lignes, je vais expliquer comment j’ai fait et comment faire la même chose !

L’heure des choix

La première tâche fut de trouver un bouton physique me permettant de déclencher une action et répondant à quelques caractéristiques, être indépendant de mon téléphone ou ordinateur, couter moins de 50€. J’ai fait quelques recherches et au vu de la stack de mon blog (AWS et Gitlab), j’ai très rapidement décidé d’acheter la solution d’AWS : AWS IoT Entreprise. Peu cher, il est totalement compatible avec la solution IoT Internet of Things d’AWS, il nécessite uniquement une connexion wifi. Le seul gros défaut étant la pile qu’il n’est pas remplaçable, mais assez endurante pour que je passe à l’achat (~3000 clics).

Voilà une petite photo du bouton (avec le guide plus que sommaire qui vous renvoie vers la documentation d’AWS) :

Le bouton AWS

Passage à l’action

Pour le fonctionnement ça va être assez simple, le bouton va au clic déclancher l’API AWS IoT qui va executer une Lambda afin de lancer la pipeline Gitlab CI (grâce à l’API REST). Globalement on peut schématiser cela comme ci-dessous :

Schéma de la solution

La mise en place est rapide et bien documentée (Documentation Amazon). Mais je vais vous la détailler globalement.

Une fois que vous avez reçu votre bouton, la première étape est de le configurer afin qu’il accède au wifi afin d’interagir avec l’API AWS. Le plus simple pour ça est d’utiliser l’application Android / Appel 1-Click. Il suffira ensuite de vous connecter sur l’application et de scanner le code barre présent sur la boite, ensuite vous aurez juste à ajouter l’appareil et lui donner les informations du wifi. C’est aussi à partir de cette application que vous pouvez mettre à jour le firmware du bouton.

Une fois le bouton paramétré il faudra l’associer à votre compte AWS (à partir de là l’application n’est plus nécessaire). Il faudra juste vous rendre dans le service managé “IoT 1-Click” et entrer le numéro de série du bouton, il vous sera demandé de cliquer une fois sur le bouton pour valider l’association. Celui-ci va ensuite apparaitre dans l’interface AWS, en désactivé dans un premier temps il ne restera qu’à le sélectionner et faire activer.

Une fois le bouton enregistré, j’ai créé le token REST permettant de lancer le pipeline de déploiement Gitlab. Pour cela dans le projet Gitlab, je me suis rendu dans : “Settings => CI / CD => Pipeline triggers” et il a suffit de donner un nom et d’ajouter ce nouveau déclencheur. Il vous donne ensuite un token qu’il vous faut conserver pour déclencher la pipeline et quelques exemples.

Ensuite j’ai créé une fonction Lambda, il s’agit d’un service permettant d’executer un code donné à la volé. L’execution de celui-ci peut-être déclanché par d’autres services AWS ou encore par l’API. Le code est assez simple et a uniquement pour but d’effectuer une requète POST sur API Gitlab. Pour cela j’ai écrit le code suivant (en Python 3) :

import urllib.request, urllib.parse, os

def lambda_handler(event, context):

    data = {
        'token' : os.environ['TOKEN'],
        'ref' : os.environ['REF']
    }

    data = bytes( urllib.parse.urlencode( data ).encode() )
    handler = urllib.request.urlopen( 'https://gitlab_URL.com/api/v4/projects/5/trigger/pipeline', data );

Le code est relativement simple, il récupère le token (généré précédemment) et la ref (tag ou branche) qui ont été placées dans des variables d’environnement avant de les envoyer au travers d’une requête POST à mon instance Gitlab. A ce stade on a notre bouton enregistré sur AWS, une Lambda qui peut à la demande déclenger une pipeline Gitlab à l’aide de l’API REST. Il ne reste qu’à faire le lien et pour cela nous allons retourner sur AWS IoT 1-Click.

Il vous suffit alors dans le service de créer un nouveau projet, de le nommer et ensuite il vous demandera ce que vous souhaitez déclencher au clic, vous avez plusieurs choix : envoyer un SMS, un mail ou lancer une Lambda. L’on choisi donc d’executer la Lambda précédemment créée.

Et voilà c’est tout ! À chaque clic désormais le bouton va exécuter la Lambda qui va lancer une pipeline Gitlab afin de déployer le blog DamyR.fr

Inutile donc indispensable ?

Au-delà du côté fun du projet, je pense que c’est une bonne introduction à l’IoT avec le cloud AWS. Et bon on va pas se le cacher, mais déployer à tout moment son site d’un clic de bouton sur son bureau c’est assez classe ;)