Fonctions Lambda Python
Le générateur de fonction Lambda Python permet d’ajouter une fonction lambda à un projet Python existant.
Ce générateur crée un nouveau gestionnaire de fonction lambda Python avec une configuration d’infrastructure AWS CDK. Le backend généré utilise AWS Lambda pour un déploiement serverless, avec une validation de types optionnelle via le Parser d’AWS Lambda Powertools. Il configure AWS Lambda Powertools pour l’observabilité, incluant la journalisation, le tracing AWS X-Ray et les métriques CloudWatch.
Utilisation
Générer une fonction Lambda
Vous pouvez générer une nouvelle fonction Lambda de deux manières :
- Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
- Ouvrez la console Nx dans VSCode
- Cliquez sur
Generate (UI)
dans la section "Common Nx Commands" - Recherchez
@aws/nx-plugin - py#lambda-function
- Remplissez les paramètres requis
- Cliquez sur
Generate
pnpm nx g @aws/nx-plugin:py#lambda-function
yarn nx g @aws/nx-plugin:py#lambda-function
npx nx g @aws/nx-plugin:py#lambda-function
bunx nx g @aws/nx-plugin:py#lambda-function
Vous pouvez également effectuer une simulation pour voir quels fichiers seraient modifiés
pnpm nx g @aws/nx-plugin:py#lambda-function --dry-run
yarn nx g @aws/nx-plugin:py#lambda-function --dry-run
npx nx g @aws/nx-plugin:py#lambda-function --dry-run
bunx nx g @aws/nx-plugin:py#lambda-function --dry-run
Options
Paramètre | Type | Par défaut | Description |
---|---|---|---|
project Requis | string | - | The project to add the lambda function to |
functionName Requis | string | - | The name of the function to add |
functionPath | string | - | The path within the project source directory to add the function to |
eventSource Requis | string | Any | Optional event source model to use for the lambda function |
Résultat du générateur
Le générateur ajoutera les fichiers suivants à votre projet :
Répertoire<module-name>
- <lambda-function>.py Implémentation de la fonction
Le générateur crée également des constructs CDK pour déployer votre fonction, situés dans le répertoire packages/common/constructs
.
Si l’option functionPath
est spécifiée, le générateur ajoutera les fichiers nécessaires au chemin indiqué :
Répertoire<module-name>
Répertoire<custom-path>
- <function-name>.py Implémentation de la fonction
Implémentation de votre fonction
L’implémentation principale se trouve dans <function-name>.py
. Voici un exemple :
import os
from aws_lambda_powertools import Logger, Metrics, Tracerfrom aws_lambda_powertools.metrics import MetricUnitfrom aws_lambda_powertools.utilities.parser import event_parserfrom aws_lambda_powertools.utilities.parser.models import EventBridgeModelfrom aws_lambda_powertools.utilities.typing import LambdaContext
os.environ["POWERTOOLS_METRICS_NAMESPACE"] = "Foo"os.environ["POWERTOOLS_SERVICE_NAME"] = "Foo"
logger: Logger = Logger()metrics: Metrics = Metrics()tracer: Tracer = Tracer()
@tracer.capture_lambda_handler@metrics.log_metrics@event_parser(model=EventBridgeModel)def lambda_handler(event: EventBridgeModel, context: LambdaContext): logger.info("Received event", extra={"event": event.model_dump() }) metrics.add_metric(name="InvocationCount", unit=MetricUnit.Count, value=1)
try: # TODO: Implémenter metrics.add_metric(name="SuccessCount", unit=MetricUnit.Count, value=1) # TODO: Implémenter la réponse en cas de succès si nécessaire except Exception as e: logger.exception(e) metrics.add_metric(name="ErrorCount", unit=MetricUnit.Count, value=1) # TODO: Implémenter la réponse en cas d'erreur si nécessaire
Le générateur configure automatiquement plusieurs fonctionnalités :
- Intégration d’AWS Lambda Powertools pour l’observabilité
- Collecte de métriques
- Validation de types avec
@event_parser
Observabilité avec AWS Lambda Powertools
Journalisation
Le générateur configure la journalisation structurée avec AWS Lambda Powertools.
def lambda_handler(event: EventBridgeModel, context: LambdaContext): logger.info("Received event", extra={"event": event.model_dump()})
Il est recommandé de définir un identifiant de corrélation pour chaque requête unique afin de faciliter le débogage et le monitoring. Consultez la documentation aws powertools logger pour les bonnes pratiques.
Le logger inclut automatiquement :
- Les requêtes d’événements
- Les informations de contexte Lambda
- Les indicateurs de cold start
Tracing
Le tracing AWS X-Ray est configuré automatiquement. Vous pouvez ajouter des sous-segments personnalisés :
def lambda_handler(event: EventBridgeModel, context: LambdaContext): # Crée un nouveau sous-segment with tracer.provider.in_subsegment("function-subsegment"): # Votre logique ici return ....
Métriques
Les métriques CloudWatch sont collectées automatiquement pour chaque requête. Vous pouvez ajouter des métriques personnalisées :
def lambda_handler(event: EventBridgeModel, context: LambdaContext): metrics.add_metric(name="NewMetric", unit=MetricUnit.Count, value=1) return ...
Les métriques par défaut incluent :
- Nombre d’invocations
- Taux de succès/échec
- Métriques de cold start
Validation de types
Si vous avez choisi une eventSource
lors de la génération, votre fonction utilise @event_parser
d’AWS Lambda Powertools. Exemple :
@event_parser(model=EventBridgeModel)def lambda_handler(event: EventBridgeModel, context: LambdaContext): event.detail_type # <- typage fort avec autocomplétion IDE
Ceci permet de définir des modèles de données avec Pydantic, similaire à Fast API.
Pour des données personnalisées dans un événement (ex: flux DynamoDB ou événement EventBridge), utilisez Envelopes pour assurer le typage.
Si vous ne souhaitez pas typer votre événement, sélectionnez Any
comme eventSource
.
Déploiement de votre fonction
Le générateur crée un construct CDK dans common/constructs
pour déployer votre fonction. Utilisez-le dans une application CDK :
import { MyProjectMyFunction } from ':my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { // Ajoute la fonction à votre stack const fn = new MyProjectMyFunction(this, 'MyFunction'); }}
Ceci configure :
- La fonction AWS Lambda
- Le groupe de logs CloudWatch
- La configuration du tracing X-Ray
- L’espace de noms des métriques CloudWatch
La fonction peut ensuite être utilisée comme cible pour n’importe quelle source d’événement lambda.
Assurez-vous que la source d’événement correspond à l’option eventSource
sélectionnée pour un traitement correct.
L’exemple suivant montre comment invoquer votre fonction selon un planning avec Event Bridge :
import { EventPattern, Rule, Schedule } from 'aws-cdk-lib/aws-events';import { LambdaFunction } from 'aws-cdk-lib/aws-events-targets';import { MyProjectMyFunction } from ':my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { // Ajoute la fonction à votre stack const fn = new MyProjectMyFunction(this, 'MyFunction');
// Configure une règle EventBridge const eventRule = new Rule(this, 'MyFunctionScheduleRule', { schedule: Schedule.cron({ minute: '15' }), targets: [new LambdaFunction(fn)], }); }}