使用 Lambda 处理应用程序负载均衡器请求
您可以使用 Lambda 函数,处理来自 Application Load Balancer 的请求。Elastic Load Balancing 支持 Lambda 函数作为 Application Load Balancer 的目标。使用负载均衡器规则,基于路径或标头值将 HTTP 请求路由到一个函数。处理请求并从 Lambda 函数返回 HTTP 响应。
Elastic Load Balancing 将使用包含请求体和元数据的事件同步调用 Lambda 函数。
例 Application Load Balancer 请求事件
{ "requestContext": { "elb": { "targetGroupArn": "arn:aws:elasticloadbalancing:cn-north-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": "zh-CN,zh;q=0.9", "connection": "keep-alive", "host": "lambda-alb-123578498.cn-north-1.elb.amazonaws.com.cn", "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 }
您的函数将处理事件并以 JSON 格式向负载均衡器返回响应文档。Elastic Load Balancing 将文档转换为 HTTP 成功或错误响应并将其返回给用户。
例 响应文档格式
{ "statusCode": 200, "statusDescription": "200 OK", "isBase64Encoded": False, "headers": { "Content-Type": "text/html" }, "body": "<h1>Hello from Lambda!</h1>" }
要将 Application Load Balancer 配置为函数触发器,请为 Elastic Load Balancing 授予运行函数的权限、创建向函数发送请求的目标组、并将规则添加到向目标组发送请求的负载均衡器。
使用 add-permission 命令将权限语句添加到函数的基于资源的策略。
aws lambda add-permission --function-namealb-function\ --statement-id load-balancer --action "lambda:InvokeFunction" \ --principal elasticloadbalancing.amazonaws.com.cn
您应看到以下输出:
{ "Statement": "{\"Sid\":\"load-balancer\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"elasticloadbalancing.amazonaws.com.cn\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:cn-north-1:123456789012:function:alb-function\"}" }
有关配置 Application Load Balancer 侦听器和目标组的说明,请参阅 Application Load Balancer 用户指南中的 Lambda 函数目标。
Powertools for Amazon Lambda 中的事件处理程序
在编写由应用程序负载均衡器调用的 Lambda 函数时,Powertools for Amazon Lambda 工具包中的事件处理程序提供路由、中间件、CORS 配置、OpenAPI 规范生成、请求验证、错误处理和其他有用的功能。事件处理程序实用程序适用于 Python。有关更多信息,请参阅 Powertools for Amazon Lambda (Python) 文档中的事件处理程序 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)