serverless-python-requirements部署numpy Lambda报内部错误排查
问题原因
- 核心原因:numpy是包含C语言编译原生扩展的第三方库,本地开发环境(Windows/macOS/非Amazon Linux的普通Linux发行版)安装的numpy二进制是适配本地系统、CPU架构的,和AWS Lambda的Amazon Linux运行环境不兼容,打包上传后Lambda执行时无法正常导入numpy,直接触发运行时错误。纯Python实现的依赖无原生兼容问题,因此移除numpy后函数可正常运行。
- 配置疏漏:当前使用的
serverless-python-requirements插件未配置Lambda兼容的打包规则,默认直接打包本地环境安装的依赖,未做跨环境兼容处理。 - 笔误问题:当前
serverless.yml中配置的handler为tes_api.handler,和实际代码文件名test_api.py拼写不一致,若不是提问时的输入笔误,即便numpy问题修复,也会触发handler不存在的错误,需先核对修正。
修复方案
- 修正基础配置笔误:将
serverless.yml内functions.test.handler字段值从tes_api.handler改为test_api.handler,和代码文件名保持一致。 - 安装必要依赖:在项目根目录执行
npm install --save-dev serverless-python-requirements,确保打包插件正确安装到项目dev依赖中,避免插件未生效导致依赖未被正确打包。 - 调整插件配置,使用Lambda兼容环境打包依赖:
提前安装并启动本地Docker,修改serverless.yml添加custom配置段,指定插件使用和Lambda一致的Amazon Linux环境编译、打包带原生扩展的依赖,参考配置如下:service: test_api frameworkVersion: "3" provider: name: aws runtime: python3.8 region: eu-west-3 stage: dev # 如需使用性价比更高的arm64架构,可取消下一行注释 # architecture: arm64 functions: test: handler: test_api.handler events: - http: path: test_api method: get cors: true plugins: - serverless-python-requirements custom: pythonRequirements: # 开启docker模式,在Lambda匹配的系统环境中打包依赖,解决原生扩展兼容问题 dockerizePip: true # 若使用arm64架构,补充配置对应架构的构建镜像即可 # 依赖单独打zip包,降低冷启动耗时 zip: true # 自动剔除冗余的测试文件、缓存文件,减小部署包体积 slim: true - 清理旧资源重新部署:先执行
sls remove删除之前部署的异常资源栈,再执行sls deploy重新完成部署即可。
替代方案:如果不想本地安装Docker,可直接使用AWS官方提供的内置numpy、scipy等科学计算库的公共Lambda层,对应Python3.8版本的层为
AWSLambda-Python38-SciPy1x,在函数配置中挂载当前部署区域对应版本的该层后,将Pipfile中的numpy依赖移除,不需要自己打包numpy即可正常运行,这种方式部署包体积更小,冷启动速度更快。
内容的提问来源于stack exchange,提问作者Vince M
相关产品推荐
相关产品推荐

