Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Verarbeiten von Application Load Balancer-Anfragen mit Lambda
Sie können eine Lambda-Funktion verwenden, um Anforderungen aus einem Application Load Balancer zu verarbeiten. Elastic Load Balancing unterstützt Lambda-Funktionen als Ziel für Application Load Balancer. Sie können Load Balancer-Regeln zum Weiterleiten von HTTP-Anforderungen an eine Funktion verwenden, basierend auf Pfad- oder Header-Werten. Die Anforderung wird verarbeitet und es wird eine HTTP-Antwort aus Ihrer Lambda-Funktion zurückgegeben.
Elastic Load Balancing ruft Ihre Lambda-Funktion synchron mit einem Ereignis auf, das den Text und die Metadaten der Anforderung enthält.
Beispiel Anforderungsereignis von einem 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 }
Ihre Funktion verarbeitet das Ereignis und gibt ein Antwortdokument in JSON an den Load Balancer zurück. Elastic Load Balancing konvertiert das Dokument in eine HTTP-Erfolgs- oder Fehlerantwort und gibt es an den Benutzer zurück.
Beispiel Format des Antwortdokuments
{ "statusCode": 200, "statusDescription": "200 OK", "isBase64Encoded": False, "headers": { "Content-Type": "text/html" }, "body": "<h1>Hello from Lambda!</h1>" }
Um eine Application Load Balancer als Funktionsauslöser zu konfigurieren, gewähren Sie Elastic Load Balancing die Berechtigung zur Ausführung der Funktion, erstellen eine Zielgruppe, die Anforderungen an die Funktion weiterleitet und fügen dem Load Balancer eine Regel hinzu, die Anforderungen an die Zielgruppe sendet.
Sie können den Befehl add-permission verwenden, um der ressourcenbasierten Richtlinie Ihrer Funktion eine Berechtigungsanweisung hinzuzufügen.
aws lambda add-permission --function-namealb-function\ --statement-id load-balancer --action "lambda:InvokeFunction" \ --principal elasticloadbalancing.amazonaws.com
Die Ausgabe sollte folgendermaßen aussehen:
{ "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\"}" }
Anweisungen zum Konfigurieren des Application Load Balancer-Listeners und der Zielgruppe finden Sie unter Lambda-Funktionen als Ziel im Benutzerhandbuch für Application Load Balancer.
Event-Handler von Powertools für Lambda AWS
Der Event-Handler aus dem Powertools for AWS Lambda-Toolkit bietet Routing, Middleware, CORS-Konfiguration, Generierung von OpenAPI-Spezifikationen, Anforderungsvalidierung, Fehlerbehandlung und andere nützliche Funktionen beim Schreiben von Lambda-Funktionen, die von einem Application Load Balancer aufgerufen werden. Das Event Handler-Hilfsprogramm ist für Python verfügbar. Weitere Informationen finden Sie unter Event Handler REST API
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)