NodeJS, Cloud, tout ça ...

Présentation

Depuis quelques semaines, je “travaille” sur NodeJS pour tester ce que cela peut donner dans un projet. L’idée étant comme d’habitude d’avoir une vision des concepts sans aller (malheureusement) jusqu’à l’expertise …

L’objectif du jour est de voir comment je pourrais héberger une application NodeJS dans le cloud … Pourquoi ? Parce que !

Lecture, recherche & co

Liens

Comme pour chaque journée de ce type, cela commence par de la lecture :). Les différents liens :

AWS - Amazon

Juste une petite note sur un point que j’ai pas du bien comprendre :

Les coûts s’élèveront généralement à environ 27,42 USD/mois dans les limites de l’offre gratuite d’AWS.

L’offre gratuite à donc un coût ? :)

Grâce à l’application de calcul, je pense que l’option gratuite intègre en fait un mode par réduction mais j’aime bien être mauvaise langue :)

Azure

Dans le même sens, Azure demande un numéro de carte pour créer un compte. On va faire confiance à Micro$oft …

Base de données

Présentation

Les différents services proposent des systèmes de stockage de données. Mais comme l’idée c’est éventuellement de tester différents et que j’ai pas envié à chaque fois de remplir la base, je vais passer par un autre système : https://mlab.com/ (qui finalement lui stocke sur le cloud).

Pourquoi MLab ?

Honnêtement, le choix … a été fait de manière … un peu arbitraire :). En fait, c’est la plateforme qui a été présentée dans plusieurs tutoriaux donc.

Je sais qu’il existe une plateforme proposée directement par les créateurs de MongoDB : MongoDB Atlas. Mais bon … pas bien vu la différence …

Création du compte

La création du compte est comme toutes les créations de compte : simple :). Il faut juste bien faire attention à sélectionner “Sand Box” pour ne pas avoir des frais tout de suite :). Je suis parti sur Amazon …

Le reste c’est vraiment du clic-clic mais au bout, j’obtiens une chaîne de connexion vers ma “base de données” mongodb : mongodb://:@ds117965.mlab.com:17965/. A noter que pour accéder à la base, il faut créer un compte spécifique différent de celui qui gère mLab.

Mise en place

Dernière chose : il faut mettre en place dans l’application, le lien vers cette base de données ! Pour anticiper un peu les choses, j’ai créer un fichier de config pour la production qui contient les éléments suivants :

const crypto = require('crypto').randomBytes(256).toString('hex');

const config = {
    app: {
        PORT: process.env.PORT || 3000
        , secret: crypto
    }
    , db: {
        uri: process.env.MOGODB || 'mongo:27017'
        , user: ''
        , pwd: ''
        , name: process.env.DATABASE
    }
}

module.exports = config;

En regardant, les différentes documentations, j’ai vu qu’il était possible de créer des variables de paramétrages qui doivent ensuite permettre d’être exploité dans l’application. Ainsi, j’évite d’avoir mes mots de passes dans le fichier de config …

Tests

Mise en place d’une commande spécifique : "build:prod": "NODE_ENV=prod MOGODB=':@ds117965.mlab.com:17965' DATABASE= PORT=3000 supervisor app.js", et après un enregistrement et une saisie :

Bilan

Honnêtement, je me disais que cela allait être simple et force est de constater que cela l’a été. Bon, il reste à déployer cela sur une plateforme Cloud. Par contre, j’espère ne pas avoir trop besoin de manipuler la base car ce n’est pas hyper simple avec l’interface de mLab. Heureusement, je peux configurer et accéder depuis l’application Robo3T …

Heroku

Pour commencer, je vais essayer de déployer l’application sur la plateforme Heroku. J’ai trouvé que c’était à priori, la plateforme la plus simple mais bon … je peux me tromper. Pour commencer, j’ai vraiment fait au plus simple en suivant le guide présent ici :

  • Création d’un compte (il faut des comptes et des mots de passes),
  • Installation d’un CLI (c’est la mode ça aussi, les cli…),
  • J’ai pas cloné l’application : j’ai la mienne. D’ailleurs avant d’aller plus loin, je vais cloner mon appli dans un autre répertoire histoire de voir si j’ai pas des fichiers en trop
  • Initialisé l’application : heroku create et récupéré les infos sur les urls. A noter que cela met directement à jour la conf git pour intégrer un repo distant,
  • Pousser le code : git push heroku master.

Le dernier point permet d’avoir une trace du déploiement et j’ai déjà détecté un ou deux “soucis” : Resolving node version 6.x... & This app may not specify any way to start a node process. Pour corriger ce point, il faut préciser dans package.json :

"engines" : {
   "node" : ">=8.5.0" 
   , "npm" : ">=5.3.0"
},
  • Lancement en sélectionnant bien le mode free : heroku ps:scale web=1 ,
  • Ouverture de la page : BOUM !!

Bon pour le moment, pas de panique. Je pense que le souci vient d’un souci de config car je n’ai pas paramétré la chaîne de connexion etc… Effectivement, après la configuration des variables, les choses marchent beaucoup mieux :

La dernière chose que je voulais faire : pouvoir publier sans pour autant être obligé de saisir un login / mot de passe. C’est assez simple et les docs sont ici :

La boulette

Alors comment dire : la boulette! Pour tester, le passage par l’environnement pour la configuation, j’ai voulu tester en mettant une commande supplémentaire dans package.json. Que j’ai bien gentillement commité ! Bravo ! Allez, c’est parti pour un changement de mot de passe.

Azure

Début

Ayant un collègue qui ne jure que par Azure donc bon … on va essayer !

Mise en place

Comme pour Heroku, il existe une page qui décrit les premières actions à réaliser pour déployer une application web. Je vais gentiment suivre les indications :).

  • Création d’un compte (nan mais sérieux : j’ai combien de compte ?)
  • Accès au Shell : c’est un peu long …
  • Création d’un compte de déploiement. Le résultat est un peu déconcertant car tous les champs sont à null …
  • Création d’un groupe de ressources : si j’ai bien compris, c’est un conteneur qui permet de regrouper différents outils proposer dans la plateforme
  • Création d’un plan pour la future application. Ici, on ne crée pas encore l’application mais le “plan” que l’on met dans le groupe et qui définit les ressources que l’on souhaite utiliser.
  • Création de l’application : la on va créer l’application …
  • Configuration pour le déploiment …
  • Push et test : mini Boom :)

Encore une fois, j’ai pas configuré les variables de configuration. Une fois cela fait : l’application fonctionne bien et je retrouve bien mes données.

Bilan

J’étais peut-être fatigué mais j’ai trouvé le déploiement azure fastidieux … C’était long et la commande Shell a planté plusieurs fois …

Amazon

Pas eu le temps …

Bilan

J’ai une application déployée de manière simultanée sur deux environnements différents mais avec la même base de données. Les deux plateformes sont fonctionnelles mais je trouve Heroku plus simple de prise en main mais je pense qu’on doit pouvoir aller plus loin avec Azure. Bon maintenant, faut que je surveille le trafic :D !