Serverless avec AWS : cas concret

Amazon Lambda


Toujours à la pointe de l'actualité sur AWS, Alexis, certifié AWS Solution Architect Professional, vous guide au travers d'un cas concret, utilisant l'API microservice avec AWS Lambda, API Gateway et Serverless.


Présentation des acteurs


- AWS Lambda

Lambda, on en a déjà parlé dans un billet précédent : A la découverte d'AWS Lambda. Il s'agit d'un service assez récent sur AWS qui permet d'héberger et d'exécuter du code sur les infrastructures AWS.

Ces fonctions peuvent être déclenchées soit à la main, via le SDK AWS, soit via d'autres sources : S3, DynamoDB, SNS, ou... API Gateway.


- API Gateway

API Gateway est un service qui permet d'exposer sur Internet un endpoint afin de pouvoir fournir une API. Ici, on va s'en servir pour déclencher des fonctions Lambda.


- Serverless

Lambda et API Gateway sont de très bons services mais assez complexes à articuler à la main. C'est pour cette raison qu'un framework spécialisé est né : Serverless.

Comme son nom l'indique, Serverless permet d'écrire une API REST en se reposant entièrement sur Lambda et API Gateway, et donc, d'avoir une infrastructure sans aucun serveur à gérer.


But du jeu

Nous allons ici écrire une API très complexe. Vraiment.

Après plusieurs heures de réunion avec nos équipes techniques et notre chef de projet, nous avons pu écrire un dossier de spécification technique vraiment touffu pour arriver à cela :

J'aimerai pouvoir envoyer une chaîne de caractère à mon API, et qu'en retour elle me renvoie cette même chaîne en majuscule. DUR.

Exemple :

input : "Osones c'est bien"
output : "OSONES C'EST BIEN"


Contactez des Experts AWS certifiés !

C'est parti

Installation de Serverless

La première étape est donc d'installer le framework Serverless. Les prérequis sont les suivants :

  • avoir installé Node.js (version pas trop vieille)
  • avoir installé et configuré aws-cli avec des accès administrateur

Pour installer Serverless, en root :

# npm -g install serverless

On peut maintenant créer notre premier projet. Serverless est un logiciel assez chouette, assez design. Une petite interface permet de rapidement configurer le projet.

$ serverless project create


Amazon Serverless

Maintenant que notre projet est créé, nous pouvons créer notre première fonction :

$ serverless function create functions/majuscule


Amazon Serverless

Par défaut, le framework va poser une fonction toute simple qui renvoie une chaîne de caractère, pour dire que tout fonctionne. Testons.

Pour tester, nous allons donc déployer notre projet sur AWS.

$ serverless dash deploy


Amazon Serverless

Là encore, Serverless nous offre une jolie interface pour déployer. Si tout se passe bien, à la fin, nous récupérons notre endpoint : https://xxxxxxxx.execute-api.eu-west-1.amazonaws.com/dev/majuscule

Nous pouvons maintenant tester. Pour cela, nous pourrions utiliser curl, mais je préfère me servir d'un petit utilitaire tout à fait sympathique, httpie

# apt-get install httpie

puis

$ http https://xxxxxxxx.execute-api.eu-west-1.amazonaws.com/dev/majuscule

ça fonctionne !


Amazon SERVERLESS LAMBDA

Développement de l'API

D'après notre cahier des charges très compliqué, on voit que notre endpoint ne doit pas être de type GET, mais bien de type POST puisque nous allons fournir des données en entrée.

Parlons tout de suite de ces données d'ailleurs. On utilisera du JSON de cette forme :

{
"input": "Bonjour le monde !"
}

Pour pouvoir tester en local notre API, nous pouvons rentrer ce JSON dans le fichier functions/majuscule/event.json.

D'ailleurs, pour tester en local, il suffit de faire :

$ serverless function run majuscule

Revenons à nos moutons. Passer de GET à POST. Ceci se fait dans le fichier de configuration de la fonction majuscule, functions/majuscule/s-function.json. Il suffit alors dans la section endpoints de remplacer GET par POST.

Maintenant, modifions notre code. Voilà l'intégralité de la fonction : (functions/majuscule/handler.js)

'use strict';

module.exports.handler = function(event, context, cb) {

var input = event.input ;
var output = {
input: input,
output: input.toUpperCase()
}

return cb(null, output);
};

C'est très compliqué n'est-ce pas ?

Testons rapidement en local :

$ serverless function run majuscule
Serverless: Running majuscule...
Serverless: -----------------
Serverless: Success! - This Response Was Returned:
Serverless: {
"input": "Bonjour le monde !",
"output": "BONJOUR LE MONDE !"
}
Serverless: Duration: 1.68 ms

Cela semble fonctionner. Nous pouvons donc déployer.

$ serverless dash deploy

et tester pour de vrai :

$ http POST https://xxxxxxx.execute-api.eu-west-1.amazonaws.com/dev/majuscule input="et si on testait ?"
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 60
Content-Type: application/json;charset=UTF-8
Date: Wed, 15 Jun 2016 12:29:48 GMT
Via: 1.1 54073dd9095b9ef12d7cdaefb0bcc12c.cloudfront.net (CloudFront)
X-Amz-Cf-Id: _nXKMvZVir73BIiA5j7VW-8MMjKBZG7A9WM-jZDUr0dhdffWWjVPfQ==
X-Cache: Miss from cloudfront
x-amzn-RequestId: d93cad48-32f4-11e6-8784-851f0fb3ffb5

{
"input": "et si on testait ?",
"output": "ET SI ON TESTAIT ?"
}

Magique non ?


Conclusion

Avec Lambda et API Gateway, AWS frappe un grand coup. Pouvoir offrir une API REST microservice (ou pas) scalable, haute-disponibilité sans avoir à gérer aucun serveur peut faire rêver.

Le framework Serverless vient mettre un peu de colle entre ces deux produits pour offrir un environnement cohérent et diablement puissant.

Nous venons là juste de survoler les possibilités immenses de Lambda couplé à API Gateway via le framework Serverless. Si vous avez des projets d'API en microservices, appelez les Experts Osones, nous saurons vous aider.



Rejoignez vous aussi la conversation !

AWS user group FR

Alexis Günst Horn

La discussion continue !

Nous attendons vos questions, remarques & mots doux sur notre Twitter :