多文件Python包容器化部署AWS Lambda时的模块导入问题
问题分析
你遇到的模块找不到错误,核心原因有两个:
- Lambda Python运行时默认将
/var/task加入Python的sys.path,但你把代码放到了自定义的/usr/lambda目录,运行时无法识别这个路径下的模块。 - 代码复制方式导致目录结构不符合Python包的导入规则,且未确保目标目录被纳入Python的搜索路径。
解决方案
1. 修正Dockerfile,遵循Lambda默认目录规范
Lambda的Python基础镜像默认将LAMBDA_TASK_ROOT设为/var/task,无需手动修改。调整Dockerfile如下,确保代码和依赖都放在这个默认目录下:
COPY requirements.txt . RUN pip install --upgrade pip # 将依赖安装到Lambda默认的任务目录 RUN pip install -r requirements.txt --target "/var/task" # 将src下的整个b包目录复制到/var/task,保证/var/task/b是完整的Python包 COPY src/b /var/task/b
2. 确保b目录是合法的Python包
在src/b目录下创建空的__init__.py文件,让Python将其识别为可导入的包。最终目录结构应如下:
项目根目录 ├── requirements.txt ├── Dockerfile └── src └── b ├── __init__.py ├── handler.py └── 其他依赖文件
3. 设置正确的Lambda Handler
部署后,将CMD覆盖项设置为b.handler.lambda_handler,对应/var/task/b/handler.py文件中的lambda_handler函数。
本地测试修正
你本地运行镜像时的输出显示未指定handler参数,需要在启动命令后补充handler:
docker run -p 9000:8080 3cdde6464b082779fec0f6c263b9052514886d4f90d0d0c1a6d8d40f459660c7 b.handler.lambda_handler
之后可通过curl测试函数调用:
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
额外说明
如果一定要使用自定义目录(如/usr/lambda),需在Dockerfile中把该路径加入Python的环境变量:
ENV LAMBDA_TASK_ROOT="/usr/lambda" ENV PYTHONPATH="${PYTHONPATH}:${LAMBDA_TASK_ROOT}"
但更推荐遵循Lambda的默认规范,使用/var/task目录,减少配置复杂度。
内容的提问来源于stack exchange,提问作者m00s3
相关产品推荐
相关产品推荐

