Traitet les demandes d’Application Load Balancer avec Lambda - AWS Lambda

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Traitet les demandes d’Application Load Balancer avec Lambda

Vous pouvez utiliser une fonction Lambda pour traiter les demandes d’un Application Load Balancer. ELB prend en charge les fonctions Lambda en tant que cible pour un Application Load Balancer. Utilisez les règles de l’équilibreur de charge pour acheminer les demandes HTTP vers une fonction, selon le chemin d’accès ou les valeurs des en-têtes. Traitez la demande et renvoyez une réponse HTTP à partir de votre fonction Lambda.

Elastic Load Balancing appelle votre fonction Lambda de façon synchrone avec un événement qui contient le corps et les métadonnées de la demande.

Exemple Evénement de demande d’Application Load Balancer
{ "requestContext": { "elb": { "targetGroupArn": "arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/lambda-279XGJDqGZ5rsrHC2Fjr/49e9d65c45c6791a" } }, "httpMethod": "GET", "path": "/lambda", "queryStringParameters": { "query": "1234ABCD" }, "headers": { "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "accept-encoding": "gzip", "accept-language": "en-US,en;q=0.9", "connection": "keep-alive", "host": "lambda-alb-123578498.us-east-1.elb.amazonaws.com", "upgrade-insecure-requests": "1", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36", "x-amzn-trace-id": "Root=1-5c536348-3d683b8b04734faae651f476", "x-forwarded-for": "72.12.164.125", "x-forwarded-port": "80", "x-forwarded-proto": "http", "x-imforwards": "20" }, "body": "", "isBase64Encoded": False }

Votre fonction traite l’événement et renvoie un document de réponse à l’équilibreur de charge en JSON. ELB convertit le document en réponse HTTP de réussite ou d'erreur et le renvoie à l'utilisateur.

Exemple format du document de réponse
{ "statusCode": 200, "statusDescription": "200 OK", "isBase64Encoded": False, "headers": { "Content-Type": "text/html" }, "body": "<h1>Hello from Lambda!</h1>" }

Pour configurer un Application Load Balancer en tant que déclencheur de fonction, accordez à ELB l'autorisation d'exécuter la fonction, créez un groupe cible qui achemine les demandes vers la fonction et ajoutez une règle à l'équilibreur de charge qui envoie des demandes au groupe cible.

Utilisez la commande add-permission pour ajouter une instruction d’autorisation à la stratégie basée sur les ressources de votre fonction.

aws lambda add-permission --function-name alb-function \ --statement-id load-balancer --action "lambda:InvokeFunction" \ --principal elasticloadbalancing.amazonaws.com

Vous devriez voir la sortie suivante:

{ "Statement": "{\"Sid\":\"load-balancer\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"elasticloadbalancing.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-west-2:123456789012:function:alb-function\"}" }

Pour obtenir des instructions sur la configuration de l’écouteur de l’équilibreur de charge d’application et du groupe cible, consultez Fonctions Lambda en tant que cibles dans le Guide de l’utilisateur des Application Load Balancers.

Gestionnaire d'événements de Powertools pour Lambda AWS

Le gestionnaire d'événements du kit d'outils Powertools for AWS Lambda fournit le routage, le middleware, la configuration CORS, la génération de spécifications OpenAPI, la validation des demandes, la gestion des erreurs et d'autres fonctionnalités utiles lors de l'écriture de fonctions Lambda invoquées par un Application Load Balancer. L’utilitaire de gestionnaire d’événements est disponible pour Python. Pour plus d'informations, consultez l'API REST du gestionnaire d'événements dans la documentation de Powertools for AWS Lambda (Python).

Python

import requests from requests import Response from aws_lambda_powertools import Logger, Tracer from aws_lambda_powertools.event_handler import ALBResolver from aws_lambda_powertools.logging import correlation_paths from aws_lambda_powertools.utilities.typing import LambdaContext tracer = Tracer() logger = Logger() app = ALBResolver() @app.get("/todos") @tracer.capture_method def get_todos(): todos: Response = requests.get("https://jsonplaceholder.typicode.com/todos") todos.raise_for_status() # for brevity, we'll limit to the first 10 only return {"todos": todos.json()[:10]} # You can continue to use other utilities just as before @logger.inject_lambda_context(correlation_id_path=correlation_paths.APPLICATION_LOAD_BALANCER) @tracer.capture_lambda_handler def lambda_handler(event: dict, context: LambdaContext) -> dict: return app.resolve(event, context)