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"
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
Maintenant que notre projet est créé, nous pouvons créer notre première fonction :
$ serverless function create functions/majuscule
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
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 !
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 !
- Questions, remarques, suggestions... Contactez-nous directement sur Twitter sur @osones !
- Pour discuter avec nous de vos projets, nous sommes disponibles directement via contact@osones.com !
- Rejoignez VOTRE groupe LinkedIn dès maintenant : Utilisateurs Francophones d'Amazon Web Services (AWS).
Alexis Günst Horn
Découvrez les derniers articles d'alter way
- Big Data & AI Paris 2024 : L'IA au cœur de toutes les transformations.
- Un retour vers l'open-source ? Vos outils DevOps préférés et leurs equivalents open-source.
- Prowler : L'outil de sécurité multi-cloud indispensable pour renforcer votre infrastructure
- Kubernetes : plateforme "star" de l'IT et levier d'innovation des entreprises
- AI_dev2024
- : DirectPV : Avoir du stockage bloc distribué facilement dans kubernetes