Fonctions Serverless en TypeScript : Guide complet sur AWS Lambda
L'architecture serverless a révolutionné l'approche du développement backend. Au lieu de gérer des serveurs, les développeurs peuvent se concentrer uniquement sur la logique métier. AWS Lambda est l'un des services les plus populaires pour exécuter des fonctions serverless. Dans ce guide, nous allons détailler la création, la configuration et le déploiement de fonctions Lambda en TypeScript — des concepts de base aux solutions de production.
Pourquoi TypeScript pour AWS Lambda ?
TypeScript ajoute un typage statique à JavaScript, ce qui est crucial pour les fonctions serverless :
- Sécurité des types — prévient les erreurs à la compilation
- Autocomplétion — l'IDE suggère les méthodes de l'AWS SDK
- Lisibilité — les interfaces et les types documentent la structure des données
- Évolutivité — plus facile de maintenir le code à mesure que le projet grandit
Configuration du projet
1. Initialisation et installation des dépendances
Créez un nouveau projet et installez les packages nécessaires :
mkdir my-lambda-projectcd my-lambda-projectnpm init -y
npm install @types/aws-lambda aws-sdknpm install -D typescript ts-node @types/node2. Configuration de TypeScript
Créez le fichier tsconfig.json :
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "lib": ["ES2020"], "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, "declaration": true, "declarationMap": true, "sourceMap": true }, "include": ["src/**/*"], "exclude": ["node_modules", "dist"]}Création de votre première fonction Lambda
Structure de base du handler
Créez le fichier src/handler.ts :
import { Handler, APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda';
interface UserData { userId: string; name: string; email: string;}
export const handler: Handler<APIGatewayProxyEvent, APIGatewayProxyResult> = async (event) => { try { // Analyse du corps de la requête const body: UserData = JSON.parse(event.body || '{}'); // Validation if (!body.userId || !body.name) { return { statusCode: 400, headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify({ error: 'Champs obligatoires manquants' }) }; }
// Logique métier const result = { id: body.userId, displayName: body.name.toUpperCase(), createdAt: new Date().toISOString() };
return { statusCode: 200, headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify(result) }; } catch (error) { console.error('Erreur lors du traitement de la requête :', error); return { statusCode: 500, body: JSON.stringify({ error: 'Erreur interne du serveur' }) }; }};Gestion de l'environnement et des secrets
Utilisez les variables d'environnement pour la configuration :
import { Handler } from 'aws-lambda';
interface Config { DB_TABLE: string; MAX_RETRIES: number;}
export const handler: Handler = async (event) => { const config: Config = { DB_TABLE: process.env.DB_TABLE || 'table-par-défaut', MAX_RETRIES: parseInt(process.env.MAX_RETRIES || '3', 10) };
// Utilisez AWS Secrets Manager ou Parameter Store // pour les données sensibles return { statusCode: 200, body: JSON.stringify({ table: config.DB_TABLE }) };};