如何本地测试关联AWS Lambda的容器化FastAPI应用
本地测试容器化FastAPI+Lambda的解决方案
1. 修正Lambda调用的请求格式
你当前的请求格式不符合Lambda事件规范,核心问题有两个:
- Lambda事件里的
body字段必须是JSON字符串(不能直接放JSON对象) - Lambda原生事件结构没有
files字段,文件上传需要把内容转成base64编码后放到body中
正确的请求示例如下:
{ "resource": "/upload/", "path": "/upload/", "httpMethod": "POST", "requestContext": {}, "multiValueQueryStringParameters": null, "headers": { "Accept": "application/json", "Content-Type": "application/json" }, "body": "{\"filename\": \"image.jpg\", \"file_content\": \"base64编码的图片内容\"}", "isBase64Encoded": false }
如果是二进制文件,把isBase64Encoded设为true,同时body填文件的base64字符串即可。
2. 修复FastAPI代码的错误
你代码里返回request.json()时没有加await,这会导致返回协程对象而非实际JSON数据,修改后的代码:
from fastapi import FastAPI, Request from mangum import Mangum app = FastAPI() @app.post("/upload/") async def upload_image(request: Request): print(request) request_body = await request.json() print(request_body) raw_body = await request.body() print(raw_body) return {"received_request_body": request_body} handler = Mangum(app)
3. 本地测试的正确流程
- 先确保Docker镜像构建完成,启动容器(假设镜像名为
fastapi-lambda):docker run -p 9000:8080 fastapi-lambda - 用curl或Postman发送POST请求到
localhost:9000/2015-03-31/functions/function/invocations,请求体用上面修正后的JSON格式 - 查看容器日志调试:
docker logs <容器ID>
额外提示
- Mangum会自动把Lambda事件转换成FastAPI能识别的Request对象,所以你写接口逻辑和普通FastAPI应用一致,不用额外适配Lambda事件
- 建议先在本地直接运行FastAPI(不套容器和Lambda)调试通接口,再用Mangum和Docker容器测试,更容易定位问题
内容的提问来源于stack exchange,提问作者rickmix
相关产品推荐
相关产品推荐

