如何使用Javascript AWS CDK部署带依赖的Python AWS Lambda函数
解决方案
问题原因
AWS Lambda Python运行时默认仅从代码压缩包根目录、Lambda层的/opt/python目录等预设路径加载模块,你将依赖安装在package/python子目录后,既没有将子目录加入Python模块搜索路径,也没有按照Lambda层的规范使用依赖,所以无法识别对应包。
方案1:直接将依赖安装到代码根目录(最简)
- 进入
assets/lambdapy目录,执行对应Python 3.8版本的pip命令安装依赖:
# 确保使用Python3.8对应的pip,避免版本不兼容 pip3.8 install --target ./ x # 如果依赖有C扩展等跨平台二进制内容,增加参数适配Lambda Linux环境 pip3.8 install --target ./ --platform manylinux2014_x86_64 --only-binary=:all: x
- 此时依赖包会和
py1.py放在同一级目录,Python代码直接导入即可:
import x def handler(event, context): return { 'statusCode': 200 }
方案2:保留依赖子目录,手动添加模块搜索路径
如果不想把依赖和业务代码混放,可以保留package子目录,在代码开头主动将该目录加入搜索路径:
import sys import os # 将package目录加入模块搜索路径 sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'package')) import x def handler(event, context): return { 'statusCode': 200 }
依赖安装命令保持pip3.8 install --target ./package x即可。
方案3:使用Lambda Layer管理依赖(推荐,适合多Lambda共用依赖)
按照Lambda层的规范组织依赖,更易维护:
- 新建依赖层目录,比如
assets/lambda-layers/py38-deps,在该目录下创建python子目录 - 进入
py38-deps目录,执行安装命令:
pip3.8 install --target ./python x
- 在CDK代码中定义依赖层,并绑定到Python Lambda:
// 定义Python依赖层 const py38DepsLayer = new lambda.LayerVersion(this, 'py38DepsLayer', { code: lambda.Code.fromAsset('assets/lambda-layers/py38-deps'), compatibleRuntimes: [lambda.Runtime.PYTHON_3_8], }); // 给Python Lambda绑定层 new lambda.Function(this, 'lambda-py1', { functionName: `py1`, code: lambda.Code.fromAsset('assets/lambdapy'), handler: 'py1.handler', runtime: lambda.Runtime.PYTHON_3_8, layers: [py38DepsLayer] // 新增该行绑定依赖层 })
- 业务代码直接
import x即可,无需修改路径。
常见踩坑提醒
- 必须使用和Lambda运行时版本完全匹配的pip安装依赖,比如Python3.8运行时不能用pip3.9安装包
- 包含C扩展的依赖必须适配Lambda的Linux运行环境,本地Windows/Mac安装的依赖可能无法在Lambda运行,需要添加
--platform参数指定编译平台 - 打包代码时要直接打包
assets/lambdapy目录下的所有内容,不要把外层lambdapy文件夹一起打包,否则解压后代码会嵌套在子目录中,Lambda找不到handler
内容的提问来源于stack exchange,提问作者anasqadrei
相关产品推荐
相关产品推荐

