如何在FastAPI中获取AWS Lambda的请求ID、请求时间戳等元数据?
在FastAPI+AWS Lambda架构中获取Lambda元数据的方案
当你用FastAPI搭配AWS API Gateway和Lambda时,FastAPI自带的request对象不会包含Lambda的上下文元数据,得通过以下方式把这些数据注入到FastAPI的请求流程里:
方案1:通过自定义Mangum适配器传递Lambda上下文
FastAPI部署到Lambda一般用Mangum做适配器,你可以自定义适配器逻辑,把Lambda的context对象存到FastAPI的请求状态中:
- 确保安装了Mangum:
pip install mangum
- 修改应用代码:
from fastapi import FastAPI, Request from mangum import Mangum app = FastAPI() class CustomMangum(Mangum): def __call__(self, event, context): # 把Lambda上下文存入FastAPI请求状态 self.scope["state"]["lambda_context"] = context return super().__call__(event, context) @app.put("/users/{user_id}") async def update_user(user_id: str, request: Request): # 从请求状态取出Lambda上下文 lambda_ctx = request.state.lambda_context # 提取所需元数据 request_id = lambda_ctx.aws_request_id # Lambda启动时间(可作为请求触发时间参考) invoke_time = lambda_ctx.invoke_time # 你的用户更新逻辑 # ... # 日志记录 print(f"Request ID: {request_id}, Invoke Time: {invoke_time}, Updated User: {user_id}") return {"status": "success", "request_id": request_id} handler = CustomMangum(app)
方案2:从API Gateway事件中提取元数据
如果是API Gateway触发的Lambda,请求事件event里也包含请求相关的元数据,同样可以通过自定义Mangum注入到请求状态:
class CustomMangum(Mangum): def __call__(self, event, context): self.scope["state"]["lambda_event"] = event self.scope["state"]["lambda_context"] = context return super().__call__(event, context) @app.put("/users/{user_id}") async def update_user(user_id: str, request: Request): lambda_event = request.state.lambda_event # 注意:API Gateway V1和V2的事件结构有差异,以下是V2示例 request_id = lambda_event["requestContext"]["requestId"] request_time = lambda_event["requestContext"]["requestTime"] # 业务逻辑... print(f"API Gateway Request ID: {request_id}, Request Time: {request_time}, User ID: {user_id}") return {"status": "success"}
关键说明
- Lambda的
aws_request_id是Lambda服务生成的请求标识,和API Gateway的requestId不是同一个值,按需选择即可。 - 若使用API Gateway V1,事件中的元数据路径是
event['requestContext']['requestId']、event['requestContext']['requestTime'],和V2略有不同。 - 自定义Mangum时不要修改原有请求流程,仅添加元数据注入逻辑,避免影响FastAPI的正常功能。
内容的提问来源于stack exchange,提问作者SoraHeart
相关产品推荐
相关产品推荐

