Introduction aux Architectures Serverless avec AWS Lambda et API Gateway
Dans le cadre de notre cours "Maîtriser le Développement Web sur AWS : Déploiement, Scalabilité et Services Cloud", cette leçon vous introduira à l'une des architectures les plus révolutionnaires et les plus pertinentes du développement web moderne : l'architecture serverless. Nous explorerons comment AWS Lambda et Amazon API Gateway, deux services AWS fondamentaux, permettent de construire des applications hautement scalables, résilientes et économiques sans se soucier de la gestion des serveurs sous-jacents.
1. Comprendre l'Architecture Serverless
L'approche serverless (ou "sans serveur") est un modèle d'exécution dans le cloud où le fournisseur de cloud (comme AWS) gère entièrement l'infrastructure serveur, vous permettant de vous concentrer uniquement sur votre code. Ne vous y trompez pas : il y a toujours des serveurs qui exécutent votre code ! La différence majeure est que vous n'avez pas à les provisionner, les configurer, les patcher ou les scaler.
1.1 Qu'est-ce que le Serverless ?
Le serverless représente un changement de paradigme dans la façon dont nous pensons au déploiement et à l'exploitation des applications. Au lieu de déployer une application monolithique ou un ensemble de microservices sur des serveurs ou des conteneurs que vous gérez, vous déployez des fonctions individuelles qui s'exécutent en réponse à des événements.
Avantages Clés du Serverless :
- Scalabilité Automatique : Vos fonctions scalent automatiquement en fonction de la charge, de zéro à des milliers d'exécutions simultanées, sans configuration manuelle.
- Coût Optimisé (Pay-per-Execution) : Vous ne payez que pour la durée d'exécution de votre code et la quantité de ressources consommées. Pas de frais pour les serveurs inactifs.
- Maintenance Réduite : Plus besoin de gérer les systèmes d'exploitation, les patchs de sécurité ou la maintenance de l'infrastructure. C'est la responsabilité du fournisseur cloud.
- Rapidité de Déploiement : Les fonctions sont souvent plus petites et plus ciblées, ce qui peut accélérer les cycles de développement et de déploiement.
- Haute Disponibilité Intégrée : Les plateformes serverless sont conçues pour être résilientes et tolérantes aux pannes par nature.
Comparaison rapide :
- Serveurs Traditionnels (VMs) : Vous gérez tout : OS, runtime, application, scaling. Coût fixe élevé.
- Conteneurs (Docker, Kubernetes) : Vous gérez le runtime et l'application dans des conteneurs. Kubernetes gère l'orchestration et le scaling des conteneurs, mais vous devez gérer le cluster Kubernetes. Coût basé sur l'utilisation des ressources du cluster.
- Serverless (FaaS) : Vous gérez uniquement l'application (le code). Le fournisseur gère tout le reste. Coût basé sur l'exécution réelle.
1.2 Les Piliers du Serverless sur AWS
Sur AWS, le serverless s'articule autour de plusieurs services :
- Function-as-a-Service (FaaS) : AWS Lambda. C'est le cœur de l'exécution du code serverless.
- Backend-as-a-Service (BaaS) : Des services entièrement gérés comme :
- Amazon DynamoDB : Base de données NoSQL serverless.
- Amazon S3 : Stockage d'objets scalable et serverless.
- Amazon API Gateway : Pour la création et la gestion d'APIs.
- Amazon SQS/SNS : Services de messagerie serverless.
- AWS Step Functions : Orchestration de workflows serverless.
- Amazon Cognito : Gestion de l'identité et de l'accès utilisateur serverless.
Dans cette leçon, nous nous concentrerons sur le duo le plus courant et le plus puissant pour le développement web : AWS Lambda et Amazon API Gateway.
2. AWS Lambda - Le Cœur du Serverless
AWS Lambda est un service de calcul serverless qui vous permet d'exécuter du code sans provisionner ni gérer de serveurs. Il exécute votre code uniquement lorsque cela est nécessaire et se met automatiquement à l'échelle, de quelques requêtes par jour à des milliers par seconde.
2.1 Qu'est-ce qu'AWS Lambda ?
En termes simples, AWS Lambda est une fonction que vous déployez dans le cloud. Cette fonction est "déclenchée" par divers événements. Un événement peut être :
- Une requête HTTP entrante (via API Gateway).
- Un fichier téléchargé dans un bucket S3.
- Un enregistrement ajouté à une base de données DynamoDB.
- Un message dans une file d'attente SQS.
- Une tâche planifiée (comme un Cron job).
Lambda prend en charge plusieurs langages de programmation, notamment Node.js, Python, Java, C#, Go, Ruby, et même des runtimes personnalisés.
2.2 Comment fonctionne Lambda ?
Le fonctionnement de Lambda repose sur un modèle événementiel et des conteneurs d'exécution éphémères :
- Déclencheur (Trigger) : Un événement se produit (ex: requête HTTP).
- Invocation : Le service Lambda reçoit l'événement et invoque votre fonction.
- Conteneur d'exécution : Si aucune instance "chaude" de votre fonction n'est disponible, Lambda provisionne un environnement d'exécution (un conteneur léger) et y charge votre code. C'est ce qu'on appelle un cold start. Si une instance est déjà "chaude" (d'une invocation précédente), elle est réutilisée (warm start).
- Exécution du Code : Votre code s'exécute dans cet environnement, traitant l'événement.
- Réponse : Votre fonction renvoie une réponse.
- Mise à l'échelle : Si plusieurs événements arrivent simultanément, Lambda crée et gère plusieurs instances de votre fonction en parallèle.
Concepts clés :
- Fonction Lambda : Votre code déployé sur AWS.
- Déclencheur (Trigger) : Le service ou l'événement qui invoque votre fonction.
- Environnement d'exécution (Runtime) : Le langage de programmation et les dépendances nécessaires à l'exécution de votre code.
- Rôle IAM : Chaque fonction Lambda est associée à un rôle AWS IAM qui définit les permissions dont elle dispose pour interagir avec d'autres services AWS (ex: lire un fichier sur S3, écrire dans DynamoDB).
2.3 Avantages d'AWS Lambda
- Paiement à l'usage (Pay-per-Execution) : Vous êtes facturé en fonction du nombre de requêtes et de la durée d'exécution de votre code, par intervalles de 1 ms. Il existe un niveau gratuit généreux.
- Scalabilité Automatique : Lambda gère la mise à l'échelle pour vous, sans configuration.
- Haute Disponibilité : Votre code est exécuté sur une infrastructure hautement disponible et tolérante aux pannes.
- Réduction de l'overhead opérationnel : Moins de temps passé à gérer les infrastructures, plus de temps à développer des fonctionnalités.
2.4 Quand utiliser Lambda ?
Lambda est idéal pour une multitude de cas d'utilisation :
- APIs RESTful et backends mobiles : Créer des microservices et des points d'extrémité d'API qui traitent les requêtes HTTP.
- Traitement de données en temps réel : Répondre aux téléchargements de fichiers dans S3, traiter des flux de données depuis Kinesis ou DynamoDB Streams.
- Tâches planifiées (Cron jobs) : Exécuter du code à intervalles réguliers pour des tâches de maintenance, des rapports, etc.
- Bots et chatbots : Gérer les interactions des utilisateurs.
- Intégrations de services : Connecter différents services AWS ou tiers.
3. Amazon API Gateway - L'Entrée de Vos Fonctions Lambda
Si Lambda est le cerveau de votre application serverless, Amazon API Gateway en est la porte d'entrée. C'est un service entièrement géré qui permet aux développeurs de créer, publier, maintenir, surveiller et sécuriser facilement des API REST, HTTP et WebSocket à n'importe quelle échelle.
3.1 Qu'est-ce qu'API Gateway ?
API Gateway agit comme un "guichet unique" pour vos applications front-end (web, mobile, IoT) afin qu'elles puissent interagir avec vos services backend, y compris vos fonctions Lambda. Il fournit une interface HTTP pour vos fonctions, gérant les requêtes entrantes et transmettant les réponses.
3.2 Fonctionnalités Clés d'API Gateway
- Gestion des requêtes HTTP : Définir des points d'extrémité (
/utilisateurs), des méthodes HTTP (GET,POST,PUT,DELETE). - Intégration avec les backends : Connecter facilement à des fonctions Lambda, des points d'extrémité HTTP, des services AWS (ex: DynamoDB), ou des actions Step Functions.
- Authentification et Autorisation : Sécuriser vos APIs avec des mécanismes comme IAM, Amazon Cognito, ou des Lambda Authorizers personnalisés.
- Throttling et Cache : Protéger votre backend contre les surcharges en limitant le nombre de requêtes et améliorer la latence avec la mise en cache des réponses.
- Transformation des requêtes/réponses : Mapper les requêtes entrantes et les réponses sortantes vers des formats adaptés à votre backend et à vos clients.
- Versioning des API : Gérer différentes versions de votre API (
/v1,/v2) et les environnements de déploiement (développement, staging, production). - Surveillance et journalisation : Intégration avec Amazon CloudWatch pour surveiller les performances de l'API et journaliser les requêtes.
- CORS (Cross-Origin Resource Sharing) : Gérer facilement les politiques CORS pour les applications web.
3.3 Comment API Gateway s'intègre avec Lambda ?
L'intégration d'API Gateway avec Lambda est extrêmement puissante et flexible :
- Requête Client : Un client (navigateur web, application mobile) envoie une requête HTTP à un point d'extrémité d'API Gateway (ex:
GET https://xyz.execute-api.region.amazonaws.com/dev/hello). - Réception par API Gateway : API Gateway reçoit la requête, l'analyse (méthode, chemin, headers, corps).
- Appel Lambda : API Gateway mappe la requête entrante à votre fonction Lambda cible et l'invoque. L'objet
eventpassé à Lambda contient toutes les informations de la requête HTTP. - Exécution Lambda : Votre fonction Lambda traite l'événement, exécute sa logique métier et renvoie une réponse.
- Réponse API Gateway : API Gateway reçoit la réponse de Lambda, la transforme si nécessaire, et la renvoie au client sous forme de réponse HTTP standard.
Cette intégration permet de construire des APIs RESTful complètes sans gérer aucun serveur.
4. Architecture Serverless Typique (Lambda + API Gateway)
Une architecture serverless courante pour une application web ou mobile utilise Lambda et API Gateway comme éléments centraux :
graph LR
A[Client Web/Mobile] -->|Requête HTTP| B(Amazon API Gateway)
B -->|Invoque avec événement| C(AWS Lambda Fonction)
C -->|Accède si besoin| D[Amazon DynamoDB]
C -->|Accède si besoin| E[Amazon S3]
C -->|Accède si besoin| F[Autres services AWS]
C -->|Renvoie une réponse| B
B -->|Réponse HTTP| A
Flux de requête détaillé :
- Un utilisateur interagit avec une application web (par exemple, un formulaire d'inscription).
- L'application envoie une requête
POST(avec les données du formulaire) à un point d'extrémité exposé par API Gateway. - API Gateway reçoit la requête, applique d'éventuels caches ou contrôles d'authentification, puis mappe la requête HTTP à un événement JSON.
- Cet événement JSON est transmis à une fonction AWS Lambda configurée comme backend pour ce point d'API.
- La fonction Lambda exécute le code fourni. Par exemple, elle pourrait :
- Valider les données du formulaire.
- Stocker les données dans une table DynamoDB.
- Envoyer une notification via SNS.
- Enregistrer des journaux dans CloudWatch Logs.
- La fonction Lambda renvoie une réponse (ex: statut
200 OK, message de succès) à API Gateway. - API Gateway prend cette réponse, la transforme en une réponse HTTP standard (avec des en-têtes, un statut HTTP, un corps JSON), et la renvoie à l'application cliente.
Ce cycle se produit sans que vous ayez à vous soucier de l'infrastructure sous-jacente qui gère la charge, la disponibilité ou la maintenance.
5. Cas Pratique - Créer une API REST simple avec Lambda et API Gateway
Nous allons créer une API simple qui, lorsqu'elle est appelée via une requête GET, renvoie un message "Hello, Serverless!". Nous allons également montrer comment elle peut prendre un paramètre name pour personnaliser le message.
5.1 Objectif
Déployer une fonction Lambda qui sert de backend à une API REST créée avec API Gateway. L'API exposera un endpoint /hello qui renverra un message personnalisé.
5.2 Étape 1 : Le Code Lambda (Node.js)
Commençons par le code de notre fonction Lambda. Nous utiliserons Node.js pour cet exemple, car c'est un choix courant pour le serverless grâce à sa légèreté et sa rapidité.
Créez un fichier nommé lambda_function.js :
// lambda_function.js
exports.handler = async (event) => {
// Affiche l'objet 'event' pour comprendre les données entrantes d'API Gateway.
// C'est utile pour le débogage dans CloudWatch Logs.
console.log('Received event:', JSON.stringify(event, null, 2));
let message = "Hello from Serverless Lambda!";
let statusCode = 200;
// L'objet 'event' contient les informations de la requête HTTP provenant d'API Gateway.
// 'queryStringParameters' contient les paramètres de requête (ex: ?name=John).
if (event.queryStringParameters && event.queryStringParameters.name) {
message = `Hello, ${event.queryStringParameters.name} from Serverless Lambda!`;
}
// 'pathParameters' contient les paramètres de chemin (ex: /hello/John).
else if (event.pathParameters && event.pathParameters.name) {
message = `Hello, ${event.pathParameters.name} from Serverless Lambda!`;
}
// La fonction Lambda doit retourner un objet avec statusCode, headers, et body
// pour qu'API Gateway puisse le transformer en une réponse HTTP valide.
const response = {
statusCode: statusCode,
headers: {
"Content-Type": "application/json",
// Permet l'accès depuis n'importe quel domaine pour les requêtes AJAX/Fetch (CORS).
// En production, il est recommandé de spécifier des domaines précis.
"Access-Control-Allow-Origin": "*",
},
body: JSON.stringify({ message: message }), // Le corps doit être une chaîne JSON.
};
return response;
};
Explication du code :
exports.handler = async (event) => { ... };: C'est le point d'entrée de notre fonction Lambda.handlerest le nom par défaut.- L'argument
eventest un objet JSON qui contient toutes les données relatives à l'événement qui a déclenché la fonction. Pour une invocation via API Gateway,eventcontient des informations sur la requête HTTP (méthode, chemin, headers, corps, paramètres de requête/chemin).
- L'argument
console.log(...): Utilisé pour déboguer. Les logs seront envoyés à Amazon CloudWatch Logs.- Le code vérifie si un paramètre
nameest présent, soit dans les query parameters (ex:/hello?name=Alice), soit dans les path parameters (ex:/hello/Alice). - L'objet
responseest formaté spécifiquement pour API Gateway. Il doit inclure :statusCode: Le code de statut HTTP (ex: 200 pour succès).headers: Un objet contenant les en-têtes HTTP de la réponse.Content-Type: application/jsonindique que le corps est du JSON.Access-Control-Allow-Origin: *est crucial pour le CORS si votre API est appelée depuis un navigateur sur un domaine différent.body: Le corps de la réponse HTTP. Il doit être une chaîne. Si vous renvoyez du JSON, vous devez utiliserJSON.stringify().
5.3 Étape 2 : Configuration API Gateway
La configuration d'API Gateway se fait généralement via la console AWS, la CLI, ou des outils IaC (Infrastructure as Code) comme AWS SAM ou AWS CDK. Pour cet exemple, nous allons décrire les étapes conceptuelles comme si vous le faisiez dans la console :
-
Créez la Fonction Lambda :
- Allez dans la console AWS Lambda.
- Créez une nouvelle fonction (
Create function). - Choisissez "Author from scratch".
- Donnez-lui un nom (ex:
MyHelloServerlessFunction). - Sélectionnez le runtime Node.js (ex:
Node.js 18.x). - Sous "Change default execution role", choisissez "Create a new role with basic Lambda permissions".
- Cliquez sur
Create function. - Copiez-collez le code
lambda_function.jsdans l'éditeur de code de la console Lambda, puisDeploy.
-
Créez une API REST dans API Gateway :
- Allez dans la console Amazon API Gateway.
- Cliquez sur
Create API. - Choisissez
REST API(non privé) et cliquez surBuild. - Donnez un nom à votre API (ex:
HelloServerlessAPI) et une description. - Laissez le "Endpoint Type" sur
Regional. - Cliquez sur
Create API.
-
Créez une Ressource et une Méthode :
- Dans votre API nouvellement créée, cliquez sur
ActionspuisCreate Resource. - Pour "Resource Name", entrez
hello. - Laissez "Resource Path" sur
/hello. - Cochez "Enable API Gateway CORS" pour faciliter les tests depuis un navigateur.
- Cliquez sur
Create Resource. - Avec la ressource
/hellosélectionnée, cliquez surActionspuisCreate Method. - Sélectionnez
GETet cliquez sur l'icône de coche. - Configuration de la Méthode GET /hello :
- "Integration type":
Lambda Function. - "Use Lambda Proxy integration": Cochez cette case. C'est crucial pour que Lambda reçoive l'objet
eventcomplet et renvoie la réponse formatée comme dans notre code. - "Lambda Region": Sélectionnez la région de votre fonction Lambda.
- "Lambda Function": Commencez à taper le nom de votre fonction (ex:
MyHelloServerlessFunction) et sélectionnez-la dans la liste. - Cliquez sur
Save. Un message vous demandera de donner la permission à API Gateway d'invoquer votre fonction Lambda ; cliquez surOK.
- "Integration type":
- Dans votre API nouvellement créée, cliquez sur
-
Déployez l'API :
- Dans API Gateway, cliquez sur
ActionspuisDeploy API. - "Deployment stage": Sélectionnez
[New Stage]. - "Stage Name": Donnez un nom (ex:
dev). - Cliquez sur
Deploy.
- Dans API Gateway, cliquez sur
Une fois déployée, API Gateway vous donnera une "Invoke URL" (ex: https://xyz123.execute-api.us-east-1.amazonaws.com/dev).
5.4 Test de l'API
Vous pouvez maintenant tester votre API :
- Ouvrez votre navigateur et accédez à l'Invoke URL complète :
https://xyz123.execute-api.us-east-1.amazonaws.com/dev/hello- Vous devriez voir :
{"message":"Hello from Serverless Lambda!"}
- Vous devriez voir :
- Testez avec un paramètre de requête :
https://xyz123.execute-api.us-east-1.amazonaws.com/dev/hello?name=Professeur- Vous devriez voir :
{"message":"Hello, Professeur from Serverless Lambda!"}
- Vous devriez voir :
- Pour tester avec un paramètre de chemin (nécessite une petite modification dans API Gateway) :
- Dans API Gateway, sélectionnez la ressource
/hello. - Cliquez sur
Actions>Create Resource. - Pour "Resource Name", entrez
{name}(avec les accolades). Le "Resource Path" devrait être/hello/{name}. - Créez une méthode
GETpour cette nouvelle ressource/hello/{name}, et configurez-la exactement comme la précédente (intégration Lambda Proxy avecMyHelloServerlessFunction). - Redéployez l'API vers le stage
dev. - Testez :
https://xyz123.execute-api.us-east-1.amazonaws.com/dev/hello/Etudiant- Vous devriez voir :
{"message":"Hello, Etudiant from Serverless Lambda!"}
- Vous devriez voir :
- Dans API Gateway, sélectionnez la ressource
Félicitations ! Vous avez déployé votre première API serverless fonctionnelle sur AWS, utilisant Lambda comme backend et API Gateway comme façade.
6. Conclusion et Résumé
Au cours de cette leçon, nous avons exploré les fondements des architectures serverless sur AWS, en mettant l'accent sur deux services clés : AWS Lambda et Amazon API Gateway.
Nous avons appris que :
- Le serverless permet de développer et de déployer des applications sans avoir à gérer l'infrastructure serveur, offrant des avantages significatifs en termes de scalabilité, de coût (paiement à l'usage) et de maintenance réduite.
- AWS Lambda est le service FaaS d'AWS, exécutant votre code en réponse à des événements, avec une mise à l'échelle automatique.
- Amazon API Gateway agit comme un point d'entrée géré pour vos API, routant les requêtes HTTP vers vos fonctions Lambda et gérant la sécurité, le cache, et les transformations.
- L'intégration de Lambda et API Gateway est la pierre angulaire pour construire des microservices et des API RESTful hautement performantes et économiques.
Ce modèle d'architecture est idéal pour les applications modernes qui nécessitent une grande élasticité et une gestion opérationnelle minimale. C'est une compétence essentielle pour tout développeur web cherchant à maîtriser le cloud AWS.
Prochaines Étapes :
- Explorez d'autres déclencheurs pour Lambda (S3, DynamoDB Streams, SQS).
- Apprenez à sécuriser vos API avec des mécanismes d'authentification (Cognito, Lambda Authorizers).
- Utilisez des frameworks de développement serverless (comme AWS SAM ou Serverless Framework) pour automatiser le déploiement de vos fonctions Lambda et de vos APIs Gateway.
- Intégrez d'autres services serverless comme DynamoDB pour une base de données NoSQL.
Le monde du serverless est vaste et en constante évolution. Ce n'est qu'un début, mais vous avez maintenant les bases solides pour construire des applications modernes et efficaces sur AWS.