容器化Python AWS Lambda本地运行正常,部署后无法导入app模块
问题描述
我尝试将一款基于R的应用打包到Docker容器中部署,将基础镜像更换为lambda/python3.9,并新增了一个自带独立Dockerfile的应用,该应用包含一个简单的Python脚本作为函数的处理程序。我在该处理程序中调用代码运行R脚本,并将运行结果上传到S3。目前本地测试时一切运行正常,但当我将镜像推送到ECR并将容器部署为Lambda函数时,收到如下错误:
{ "errorMessage": "Unable to import module 'app': No module named 'app'", "errorType": "Runtime.ImportModuleError", "requestId": "1a7fa818-62e4-4374-8318-625b15e2ae8a", "stackTrace": [] }
AWS调用的更多日志如下:
2021-09-25T17:11:32.570+02:00 START RequestId: 1a7fa818-62e4-4374-8318-625b15e2ae8a Version: $LATEST 2021-09-25T17:11:32.571+02:00 [ERROR] Runtime.ImportModuleError: Unable to import module 'app': No module named 'app' Traceback (most recent call last): 2021-09-25T17:11:32.574+02:00 END RequestId: 1a7fa818-62e4-4374-8318-625b15e2ae8a 2021-09-25T17:11:32.574+02:00 REPORT RequestId: 1a7fa818-62e4-4374-8318-625b15e2ae8a Duration: 1.40 ms Billed Duration: 2395 ms Memory Size: 3200 MB Max Memory Used: 48 MB Init Duration: 2393.47 ms
本地运行容器的命令:
docker run -e AWS_SECRET_ACCESS_KEY=XXX -e AWS_ACCESS_KEY_ID=YYY -p 9000:8080 palmid-lambda:latest
本地运行的输出:
time="2021-09-25T14:29:42.318" level=info msg="exec '/var/runtime/bootstrap' (cwd=/home/palmid, handler=)" time="2021-09-25T14:29:47.899" level=info msg="extensionsDisabledByLayer(/opt/disable-extensions-jwigqn8j) -> stat /opt/disable-extensions-jwigqn8j: no such file or directory" time="2021-09-25T14:29:47.899" level=warning msg="Cannot list external agents" error="open /opt/extensions: no such file or directory" START RequestId: 1b867a67-e778-4418-9139-ff1123331b34 Version: $LATEST ... application logs
本地调用Lambda函数的命令:
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{ "sequence": ">SRR9968562_waxsystermes_virus_microassembly PIWDRVLEPLMRASPGIGRYMLTDVSPVGLLRVFKEKVDTTPHMPPEGMEDFKKASKEVE KTLPTTLRELSWDEVKEMIRNDAAVGDPRWKTALEAKESEEFWREVQAEDLNHRNGVCLR GVFHTMAKREKKEKNKWGQKTSRMIAYYDLIERACEMRTLGALNADHWAGEENTPEGVSG IPQHLYGEKALNRLKMNRMTGETTEGQVFQGDIAGWDTRVSEYELQNEQRICEERAESED HRRKIRTIYECYRSPIIRVQDADGNLMWLHGRGQRMSGTIVTYAMNTITNAIIQQAVSKD LGNTYGRENRLISGDDCLVLYDTQHPEETLVAAFAKYGKVLKFEPGEPTWSKNIENTWFC SHTYSRVKVGNDIRIMLDRSEIEILGKARIVLGGYKTGEVEQAMAKGYANYLLLTFPQRR NVRLAANMVRAIVPRGLLPMGRAKDPWWREQPWMSTNNMIQAFNQIWEGWPPISSMKDIK YVGRAREQMLDST", "hash": "132xx"}'
解决方案
该问题的核心原因是AWS Lambda Python运行时默认只会从/var/task目录加载处理程序模块,而你当前的代码放在/home/palmid目录下,未加入Python的模块搜索路径。本地测试时你大概率使用root用户启动容器,有权限读取任意路径的文件,所以不会触发报错。
可按以下任意一种方案修复:
- 调整Dockerfile配置,将
app.py及所有依赖代码直接复制到/var/task目录下,这是Lambda官方推荐的代码存放路径 - 在Dockerfile中添加环境变量配置,将你的代码目录加入Python搜索路径:
ENV PYTHONPATH="${PYTHONPATH}:/home/palmid" - 将Dockerfile中的
WORKDIR设置为/var/task,后续所有代码操作都在该路径下执行 - 额外确认
app.py的文件权限,确保Lambda默认运行的非特权用户有该文件的读取权限,不要仅给root用户开放读权限
内容的提问来源于stack exchange,提问作者MGubler
相关产品推荐
相关产品推荐

