流水线生成的Lambda部署包报错:找不到app模块
解决AWS Lambda部署FastAPI时的"No module named 'app'"错误
针对你遇到的手动打包正常、流水线打包报错的问题,以下是针对性的排查和修复方案:
1. 排查流水线打包的根目录结构
手动用7z打包时,你应该是直接将app、dependency1、dependency2作为部署包的根目录内容;而流水线打包可能误将包含这些目录的父文件夹打包进去,导致Lambda运行时app不在Python路径的根目录下。
- 验证方式:下载流水线生成的部署包,解压后确认根目录下直接存在
app文件夹,而非嵌套在某个外层文件夹中。 - 修复方法:调整流水线的打包命令,确保打包的是目标目录下的内容而非父目录。例如:
# 进入包含app、dependency1、dependency2的目录 cd /path/to/target-dir # 打包当前目录下的所有内容到部署包 7z a ../deploy.zip ./*
2. 确认依赖的安装位置
流水线安装依赖时,可能未将dependency1、dependency2安装到部署包根目录(与app同级),而是默认安装到了site-packages等子目录,导致Lambda无法识别。
- 修复方法:在流水线的依赖安装步骤中,指定安装目录为当前目录(即与
app同级的位置),命令示例:
确保该命令在包含pip install -t . dependency1 dependency2app的目录下执行,这样依赖会直接放在部署包根目录,与app同级。
3. 彻底检查文件权限
虽然你已更新app目录权限,但可能存在遗漏:
- 确保所有Python文件(包括
app/__init__.py、app/main.py、app/routers/*.py)的权限为644,目录权限为755,Lambda运行时需要读取这些文件。 - 流水线打包时可能未保留文件权限,需在打包命令中添加保留权限的参数。例如用zip命令:
若用7z,可添加zip -r -9 --symlinks deploy.zip app/ dependency1/ dependency2/-r -y -mx5参数确保权限被保留。 - 统一设置权限的命令:
chmod -R 755 app/ dependency1/ dependency2/ chmod -R 644 app/*.py app/routers/*.py dependency1/*.py dependency2/*.py
4. 验证模块导入与代码正确性
- 检查
app/__init__.py文件,确保文件存在且无语法错误(空文件也可,但不能有错误代码),否则会导致包导入失败。 - 在流水线中添加预打包验证步骤,本地测试模块导入:
若该命令报错,说明代码本身存在导入问题,需先修复代码。python -c "import app.main; print('模块导入成功')"
5. 确认Handler配置与函数定义
- 再次确认Lambda的Handler配置为
app.main.handler,无拼写错误。 - 检查
app/main.py中的Handler函数是否正确用Mangum包装:
确保from fastapi import FastAPI from mangum import Mangum app = FastAPI() # 路由定义... handler = Mangum(app)handler变量存在且无语法错误。
内容的提问来源于stack exchange,提问作者Abhijeet
相关产品推荐
相关产品推荐

