Python版AWS Lambda自动创建含依赖zip部署包问题求助
错误原因
你遇到的导入报错核心由两个问题导致:
- 直接打包本地虚拟环境的numpy包:本地安装的numpy适配你当前设备的操作系统、CPU架构,和AWS Lambda的Amazon Linux运行环境不兼容,很多底层动态链接库无法正常加载
- 打包文件不全:你当前的glob规则仅匹配了numpy根目录下的一级文件,递归子目录、依赖配置文件都未完整写入压缩包,导致numpy初始化流程断裂触发循环导入报错
修复现有打包逻辑的方法
修改你的打包函数,完整递归写入所有依赖文件,参考代码如下:
import zipfile import os import io def create_full_lambda_deployment_package(function_file_name, site_packages_path, dep_list=None): dep_list = dep_list or ['numpy'] buffer = io.BytesIO() with zipfile.ZipFile(buffer, 'w') as zipped: # 写入业务代码 zipped.write(function_file_name, arcname=os.path.basename(function_file_name)) # 递归写入指定依赖的所有文件 for dep in dep_list: dep_root = os.path.join(site_packages_path, dep) for root, dirs, files in os.walk(dep_root): for file in files: file_path = os.path.join(root, file) # 计算压缩包内的相对路径,放在压缩包根目录 arc_path = os.path.relpath(file_path, site_packages_path) zipped.write(file_path, arcname=arc_path) buffer.seek(0) return buffer.read()
注意使用该方法前,你需要在和Lambda运行环境一致的系统中安装依赖,避免跨架构兼容问题:比如使用官方Lambda容器镜像安装依赖,或者在Amazon Linux 2实例中执行pip安装操作。
更推荐的方案:单独构建Lambda层
不要将依赖和业务代码打包到一起,单独构建可复用的Lambda层,优势是代码包体积更小、依赖可以多个函数共用:
- 按照Lambda层的标准结构创建目录:
# 以Python3.9 x86_64架构为例 mkdir -p python/lib/python3.9/site-packages
- 安装兼容Lambda的依赖包:
pip install numpy pandas lightgbm --platform manylinux2014_x86_64 --only-binary=:all: --target ./python/lib/python3.9/site-packages
- 裁剪冗余文件减少包体积:
# 删除无用的文档、缓存、测试文件 find ./python -name "*.pyc" -delete find ./python -name "__pycache__" -delete rm -rf ./python/lib/python3.9/site-packages/*/tests
- 将整个
python目录打包为zip文件,上传为Lambda层,之后在函数配置中附加该层即可,无需修改业务代码。
额外注意事项
- Lambda所有部署包(含层)解压后总大小不能超过250M,大体积依赖需要做好裁剪
- 如果使用arm64架构的Lambda,安装依赖时将
--platform参数替换为manylinux2014_aarch64 - 常用的数据科学依赖有大量官方预构建的公开Lambda层,可直接使用无需自行打包
内容的提问来源于stack exchange,提问作者Rafa
相关产品推荐
相关产品推荐

