AWS IoT – Connexion avec le guide assisté

AWS IoT possède un guide en ligne qui permet de connecter très rapidement une « device » au service en ligne du géant américain. Nous allons le passer en revue ensemble.

Parcourons le guide ensemble :

Rendez-vous dans la partie « Onboard » d’AWS IoT et cliquez sur « Get Started »:

AWS IoT guide d'installationNous voici lancés dans le tutoriel en ligne, cliquez de nouveau sur « Get Started »:

Le tutoriel d'AWS IoT

Choisissez votre environnement de travail, ici nous choisirons MacosX et nous utiliserons Node.js

Nous trvaillons avec MacosX et Node.js

Définissons un nom pour notre projet, nous avons choisis Tutoriel

Nous nommons notre projet "tutoriel"

Nous voici maintenant sur la page qui permet de downloader notre « Kit » de connexion. Vous êtes obligé de le downloader pour accéder à l’étape suivante.

Le kit de connexion est prêt pour le téléchargement

Nous atteignons un page qui nous donne les différentes commandes que nous devons lancer pour permettre de mettre en route la première connexion.

Les commandes a mettre dans le terminal pour faire fonctionner le kit

Et voilà, notre « Kit » est créé est actif, fermons cette page et allons un peu voir ce que nous avons downloadé:

Le kit est créé et actif, bravo!

On trouve un script shell que nous allons exécuter et notre certificat ainsi que sa clé publique et privée.

Screen Shot 2018-01-01 at 19.06.56.png

Lorsque nous lançons le script, ce dernier s’occupe d’installer toutes les dépendances dans le répertoire ainsi que d’établir la première connexion.

sh ./start.sh
...
Running pub/sub sample application...
connect

En effet, si on retourne dans le dossier après l’exécution du script, nous pouvons voir que plusieurs éléments ont été ajoutés:

Screen Shot 2018-01-01 at 19.10.43.png

Cela ne nous mène pas bien loin, mais le guide s’occupe de toute la configuration côté AWS, ce qui permet de voir par après ce qui a été créé et comment. On peut aussi repartir de ce certificat pour directement écrire du code. Un petit boilerplate pratique pour démarrer avec AWS IoT.

Si vous voulez créer ces éléments à la main, vous pouvez lire notre autre article sur le sujet : Connexion de la première device avec Node.js

AWS IoT – Connexion de la première device avec Node.js

Lors de son édition 2015 de son événement « re:Invent », AWS a dévoilé un nouvel outil dédié à nos devices électroniques IoT. L’outil est un système basé sur le modèle « PUB/SUB » (publisher, subscriber) qui vient avec un SDK complet, des connexions cryptées, des dashboards, et plus… La technologie derrière tout cela est MQTT. Découvrons tout cela avec un exemple simple en créant une application simple en Node.js (utilisable sur raspberryPi et Beaglebone par exemple).

1. Créons notre premier projet

Pour pouvoir publier ou recevoir des messages, nous avons besoin de créer notre premier projet sur la plateforme d’AWS. Comme nous sommes dans le domaine de l’internet of things, AWS a décidé de nommer cette section : « things ». Respectons cette originalité de haut niveau en appelant notre nouveau projet : Tutoriel.

Lorsque vous cliquez sur « Get Started », vous arrivez sur un page vous proposant trois solutions guidées, nous allons choisir de réaliser les étapes par nous-mêmes, cliquez sur le logo « AWS IoT » en haut à gauche.

Bienvenue dans l'AWS IoT Console
Cliquez sur le logo « AWS IoT » en haut à gauche
Dirigez-vous vers "Register a thing"
Dirigez-vous vers « Register a thing »
Allons dans la section "Create a single thing"
Allons dans la section « Create a single thing »
Nous décidons d'apeller notre premier projet
Appelez votre projet Tutoriel et cliquez sur « Next »

Pour que la connexion entre notre device et les serveurs d’AWS soit cryptée (sans que cela soit le sujet de cet article, vous voulez que cela soit crypté 😉 ), vous avez besoin d’un certificat de cryptage. Nous allons utiliser ici la génération automatique fournie par AWS.

Nous allons générer le certificat automatiquement
Cliquez sur « Create Certificate »
Téléchargeons les certificats de sécurité
Téléchargez les 4 certificats de sécurité et activez le certificat avec le bouton « Activate »

!!! Downloadez-les maintenant, car vous ne pourrez plus downloader les clefs par la suite !!!

N’oubliez pas non plus de downloader le Certificat Racine (appelé Root CA Certificate) pour pouvoir créer une connexion TLS avec le serveur d’AWS. Celui-ci est disponible sur le site de Symantec en suivant le lien sur la page.

Nettoyons un peu et renommons/déplaçons nos certificats dans le dossier de notre projet (je les mets dans un dossier certs). Si vous voulez pouvoir utiliser les exemples de codes ci-dessous, respectez le nommage suivant :

certs/certificate.pem.crt
certs/private.pem.key
certs/public.pem.key
certs/root-CA.pem

Nous créerons une policy plus tard
Pour le moment, il n’y a pas de policies, cliquez sur « Register Thing »

Screen Shot 2017-12-27 at 15.18.33.png

Vous avez maintenant une « Thing » nommée Tutoriel

2. Créons une police de sécurité

Rendons-nous dans la section « Secure > Policies » à fin de créer une police de sécurité pour notre certificat TLS. En effet, sans cette police, le certificat ne sera autorisé à ne faire aucune action sur les serveurs d’AWS.

Créons une police de sécurité
Cliquez sur « Create a policy »

Screen Shot 2017-12-30 at 12.55.41.png

Nommez votre police (je l’ai nommée Tutoriel) et complétez les sections pour autoriser la connexion sur toutes les ressources (*) mais j’ai décidé de limiter les actions Publish, Subscribe et Receive au topic TopicDeTest.

La police peut aussi s’écrire sous la forme d’un JSON :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:Subscribe",
      "Resource": "arn:aws:iot:eu-west-1:xxxxxxxxxxxx:topicfilter/TopicDeTest"
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Receive",
        "iot:Publish"
      ],
      "Resource": "arn:aws:iot:eu-west-1:xxxxxxxxxxxx:topic/TopicDeTest"
    },
    {
      "Effect": "Allow",
      "Action": "iot:Connect",
      "Resource": "*"
    }
  ]
}

Plus d’informations ici

Lorsque la police est créée, il nous faut l’attacher au certificat que nous avons précédemment généré.

Attachons une police de sécurité au certificat
Cliquez sur « Attach Policy » sur le menu contextuel de notre certificat
Selectionnez la police précédement créée
Sélectionnez la police précédemment créée

Maintenant, du côté d’AWS, tout est prêt, attaquons-nous à l’écriture du code pour interagir avec le serveur.

3. Écrivons du code !

La première étape de l’écriture du code est d’installer le SDK qu’AWS fournit pour l’utilisation du service IoT.

# npm i aws-iot-device-sdk

Créons un fichier nommé test.js à la racine du projet et importons le SDK:

const awsIot = require('aws-iot-device-sdk');

Nous devons tout d’abord déclarer notre « device ». Pour cela, nous allons créer un objet device comme ceci:

const device = awsIot.device({
  keyPath: './certs/private.pem.key',
  certPath: './certs/certificate.pem.crt',
  caPath: './certs/root-CA.pem',
  clientId: 'Tutoriel',
  host: 'a3luqi52ym1wdc.iot.eu-west-1.amazonaws.com'
});

Les valeurs de keyPathcertPath et caPath pointent vers les éléments du certificat que vous avez précédemment downloadés.

Le clientId doit être unique pour chaque device au sein de votre compte AWS !! Ici, pour les besoins de l’article, nous allons faire simple et mettre notre id à ‘Tutoriel’, mais pour faire les choses correctement, nous devrions utiliser un id unique.

L’host se trouve dans le détail de notre « Thing » dans la section « Interact »:

Voici la valeur de notre host
Dans la section « HTTPS » se situe la valeur d’host que nous devons donner à notre objet

Maintenant que nous avons notre objet device, nous allons écrire une simple portion de code qui réagit à l’événement qui est généré lorsque la connexion avec les serveurs d’AWS IoT est établie:

device.on('connect', () => {
  console.log('connected');
});

À cette étape-ci, si nous lançons notre application, nous verrons qu’elle se connecte correctement aux serveurs d’AWS IoT.

# node test.js
connected

OK, c’est un bon début, maintenant, réalisons quelque chose de plus intéressant.

AWS IoT nous offre un service de queues de messaging qui nous permet de publier des messages sur des « topics » ainsi que de nous inscrire à ces « topics » pour recevoir des messages.

Inscrivons-nous à notre premier « topic »:

device.on('connect', () => {
  console.log('connected');
  device.subscribe('TopicDeTest', (error, result) => {
    console.log(result);
  });
});

Si nous exécutons l’application, nous recevons la confirmation que nous sommes correctement inscrits au « topic »TopicDeTest (que nous avons choisi précédemment).

# node test.js
connected
[ { topic: 'TopicDeTest', qos: 0 } ]

Maintenant que nous sommes correctement inscrits à notre « topic », il ne nous reste plus qu’à recevoir des messages. Pour cela, nous allons mettre en place un « listener » sur l’événement message de notre object device.

Nous loggerons à chaque fois que nous recevrons un message sur TopicDeTest.

device.on('message', (topic, payload) => {
  console.log('message', topic, payload.toString());
});

Nous lançons l’application et la laissons en attente, ensuite nous nous rendons sur l’interface d’AWS IoT pour publier un message sur le « topic »:

Publions un message depuis AWS IoT
Dans la section « Publish », renseignez le topic TopicDeTest et cliquez sur « Publish to topic »

Si tout fonctionne correctement, nous recevons le message du côté de l’application :

# node test.js
connected
message TopicDeTest {
  "message": "Hello from AWS IoT console"
}

Parfait! Nous avons échangé notre premier message! Mais dans un seul sens. AWS IoT vers notre « device ». Essayons maintenant l’autre sens.

Nous allons écrire une portion de code pour publier un message lorsque la connexion est effective.

device.on('connect', () => {
  console.log('connected');
  device.subscribe('TopicDeTest', (error, result) => {
    console.log(result);
  });

  device.publish('TopicDeTest', JSON.stringify({
    test_data: 2
  }));
});

Avant de lancer notre application, allons mettre en place le « listener » du côté d’AWS:

Abonnons nous au topic
Dans la section « Subscribe », entrez le « topic » TopicDeTest et cliquez sur « Subscribe to topic »

Lorsque nous lançons l’application, nous recevons le message en retour (comme nous sommes aussi abonnés au même « topic »)

# node test.js
connected
[ { topic: 'TopicDeTest', qos: 0 } ]
message TopicDeTest {"test_data":2}

Et nous recevons notre message du côté AWS IoT :

Screen Shot 2017-12-30 at 13.43.41.png

Nous avons échangé des messages dans les deux sens !!

Nous voici arrivés à la fin de ce tutoriel. Ceci est une introduction très basique à l’utilisation d’AWS IoT, mais l’article donne une bonne vue sur le système « Publish/Subscribe » que nous offre ce service. Avec ces bases, on peut facilement itérer pour par-exemple:

  • Stocker des valeurs depuis des senseurs
  • Allumer une led depuis un serveur web

Le repo github du SDK contient aussi de bons exemples.

Les sources du tutoriel peuvent être trouvées ici : https://github.com/lacavediy/aws-iot-connexion-de-la-premiere-device-avec-node-js

Si vous voulez vous faciliter la tâche et créer ces éléments avec le guide assisté d’AWS, vous pouvez lire notre autre article sur le sujet : Connexion de la première device avec Node.js