FastAPI部署在AWS Lambda上无法提供静态资源(返回404错误)
看起来你遇到的问题很典型——FastAPI本地运行正常,但部署到Lambda+API Gateway后静态资源返回404,大概率是路径解析的问题,结合你的配置,我来帮你梳理一下原因和解决方案:
核心问题:静态资源挂载路径与Mangum的base_path重复
你在挂载静态目录的时候,把路径设成了f"{settings.formatted_api_stage}/static"(比如/dev/static),同时又给Mangum设置了api_gateway_base_path=settings.formatted_api_stage(也就是/dev)。这会导致路径解析冲突:
当用户请求https://xxx/dev/static/css/style.css时,API Gateway会把请求转发给Lambda,Mangum会自动去掉base_path/dev,所以FastAPI实际收到的请求路径是/static/css/style.css。但你的静态目录挂载的是/dev/static,自然匹配不到这个路径,返回404。
解决方案:调整静态目录的挂载路径
把静态挂载的路径改成纯"/static",去掉前面的stage前缀,修改代码如下:
application.mount( "/static", StaticFiles(directory=static_directory, check_dir=True), name="static", )
这样,当Mangum处理完base_path后,FastAPI收到的/static/css/style.css请求就能正确匹配到挂载的静态目录,返回对应的资源。
验证模板中的URL生成
因为你已经给Mangum设置了api_gateway_base_path,FastAPI会自动把这个值作为root_path,所以模板里的{{ url_for('static', path='/css/style.css') }}会自动生成带stage前缀的正确路径(比如/dev/static/css/style.css),不需要手动修改模板代码。
额外排查建议
如果调整后还是有问题,可以做以下排查:
- 检查Mangum版本:确保使用的是最新版Mangum,旧版本可能在base_path处理上有bug,可以通过
pip install --upgrade mangum升级。 - 添加请求日志:在FastAPI中加入一个中间件,打印实际收到的请求路径,确认路径是否符合预期:
然后去CloudWatch查看Lambda的日志,确认请求静态资源时的路径是否是from fastapi import Request import logging logger = logging.getLogger(__name__) @application.middleware("http") async def log_request_path(request: Request, call_next): logger.info(f"Received request path: {request.url.path}") response = await call_next(request) return response/static/css/style.css。 - 确认静态文件打包路径:虽然你说静态文件夹在Lambda bundle中,但可以通过Lambda控制台的“代码”标签查看目录结构,确认
static文件夹确实和main.py在同一层级,且里面的文件都存在。
备注:内容来源于stack exchange,提问作者Sergii Gryshkevych

