如何使用FastAPI与Mangum在AWS Lambda上正确挂载静态文件?
解决FastAPI+Mangum部署AWS Lambda后静态文件403问题
1. 修正静态文件路径为绝对路径
Lambda执行环境的工作目录是/var/task,相对路径容易出现定位错误,改用绝对路径指向静态目录:
from pathlib import Path from fastapi import FastAPI, Request, HTMLResponse from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from mangum import Mangum app = FastAPI() # 获取当前文件所在目录的绝对路径,拼接static文件夹 BASE_DIR = Path(__file__).parent path_static = BASE_DIR / "static" app.mount("/static", StaticFiles(directory=path_static), name="static") # 补充模板配置(你代码中缺失的关键部分) templates = Jinja2Templates(directory=BASE_DIR / "templates") @app.get("/about/", response_class=HTMLResponse) async def get_about(request: Request): return templates.TemplateResponse("about.html", {"request": request}) handler = Mangum(app) if __name__ == "__main__": import uvicorn uvicorn.run(app="main:app", reload=True)
2. 确保静态文件被正确打包进部署包
- 手动打包ZIP时,要将
static文件夹、templates文件夹与main.py放在同一层级,确保ZIP包内包含完整的静态文件目录。 - 若使用SAM/Serverless Framework,需在配置文件中明确包含静态目录:
- SAM模板(template.yaml)示例:
Resources: MyFunction: Type: AWS::Serverless::Function Properties: CodeUri: . Handler: main.handler Runtime: python3.11 Metadata: BuildMethod: python3.11 - Serverless Framework(serverless.yml)示例:
package: include: - static/** - templates/** - main.py
- SAM模板(template.yaml)示例:
3. 检查静态文件权限设置
Lambda执行环境对文件权限有要求,确保静态文件(如styles.css)权限为644(全局可读),文件夹权限为755,打包前在本地执行:
chmod -R 755 static/ chmod 644 static/*.css
4. 升级Mangum到兼容版本
Mangum v0.17+完全支持FastAPI的StaticFiles功能,确保使用最新版本:
pip install --upgrade mangum
额外排查步骤
- 在Lambda控制台测试功能中直接请求
/static/styles.css,查看具体错误细节。 - 在代码中添加日志输出静态目录路径,确认路径有效性:
import logging logger = logging.getLogger(__name__) logger.info(f"Static directory path: {path_static}") logger.info(f"Files in static dir: {list(path_static.glob('*'))}")
内容的提问来源于stack exchange,提问作者lux7
相关产品推荐
相关产品推荐

