Fonctions Serverless en TypeScript : travail avancé avec AWS Lambda

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Fonctions Serverless en TypeScript : niveau avancé dans AWS Lambda

\n\n

L'architecture serverless est devenue la norme de facto pour la création d'applications évolutives et économiques. AWS Lambda est l'un des services les plus populaires pour implémenter des fonctions sans serveur. Si la syntaxe de base et les déclencheurs (API Gateway, S3, DynamoDB) sont déjà maîtrisés, il est temps de passer aux techniques avancées. Dans cet article, nous examinerons les aspects clés du développement professionnel de fonctions Lambda en TypeScript : de l'optimisation du démarrage à froid à l'intégration avec VPC et l'utilisation de modèles complexes.

\n\n

1. Optimisation du démarrage à froid et gestion de la mémoire

\n\n

Le démarrage à froid (cold start) est le principal ennemi des performances des applications serverless. Avec TypeScript, ce problème est aggravé par l'étape de compilation. Examinons trois méthodes principales pour y remédier.

\n\n

1.1. Réduction de la taille du package de déploiement

\n

Utilisez esbuild pour la compilation au lieu du tsc standard. Il effectue le tree-shaking et la minification, ce qui réduit la taille du bundle de 5 à 10 fois. Exemple de configuration pour serverless.yml :

\n\n
plugins:\n  - serverless-esbuild\ncustom:\n  esbuild:\n    bundle: true\n    minify: true\n    sourcemap: false\n    target: 'node18'\n    exclude: ['aws-sdk'] # Le SDK est déjà présent dans l'environnement Lambda
\n\n

1.2. Utilisation de Provisioned Concurrency

\n

Pour les fonctions critiques en termes de latence (par exemple, traitant des requêtes API), configurez Provisioned Concurrency. Cela maintient un nombre défini de conteneurs "chauds" constamment actifs :

\n\n
functions:\n  apiHandler:\n    handler: src/handler.apiHandler\n    provisionedConcurrency: 5 # Toujours 5 instances prêtes
\n\n

1.3. Optimisation des imports et du code

\n

Évitez les bibliothèques "lourdes" à l'intérieur de la fonction. Par exemple, au lieu d'importer aws-sdk v3 en entier, importez uniquement les clients nécessaires :

\n\n
// Mauvais : import * as AWS from 'aws-sdk';\n// Bon :\nimport { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';
\n\n

2. Travail avec Lambda Layers et les dépendances

\n\n

Les Lambda Layers permettent d'extraire le code commun et les dépendances (par exemple, ORM, validateurs) en dehors de la fonction. Cela accélère le déploiement et réduit la taille de chaque package individuel.

\n\n

2.1. Création d'une couche avec des utilitaires communs

\n

La structure du projet peut ressembler à ceci :

\n\n
project/\n├── layers/\n│   └── common/\n│       └── nodejs/\n│           ├── package.json\n│           └── node_modules/\n├── functions/\n│   ├── createUser.ts\n│   └── getUser.ts\n└── serverless.yml
\n\n

Dans serverless.yml, nous connectons la couche :

\n\n
layers:\n  commonLibs:\n    path: layers/common\n    compatibleRuntimes:\n      - nodejs18.x\nfunctions:\n  createUser:\n    handler: functions/createUser.handler\n    layers:\n      - { Ref: CommonLibsLambdaLayer }
\n\n

2.2. Typage pour les couches

\n

Pour que TypeScript "voie" les types de la couche, créez un tsconfig.json avec des chemins :

\n\n
{\n  "compilerOptions": {\n    "paths": {\n      "@common/*": ["layers/common/nodejs/*"]\n    }\n  }\n}
\n\n

Maintenant, dans la fonction, vous pouvez écrire :

\n
import { validateEmail } from '@common/validators';
\n\n

3. Travail avec VPC et sécurité

\n\n

Les fonctions Lambda fonctionnant à l'intérieur d'un VPC perdent l'accès à l'internet public (sauf si une passerelle NAT est configurée). Cela est critique pour la connexion à RDS, ElastiCache ou des API privées.

\n\n

3.1. Configuration de Lambda dans un VPC

\n

Configuration via serverless.yml :

\n\n
provider:\n  vpc:\n    securityGroupIds:\n      - sg-12345\n    subnetIds:\n      - subnet-abc\n      - subnet-def\n\nfunctions:\n  dbHandler:\n    handler: src/db.handler\n    vpc: true # hérite des paramètres du fournisseur
\n\n

3.2. Modèle "Thin Handler" pour les connexions

\n

L

Blogs

Book Recommendations