AWS Lambda上传Python包大小超限问题求助
解决AWS Lambda打包numpy+OpenCV大小超限的方案
核心优化方向:精简依赖+针对性编译+分层拆分
1. 替换为轻量化依赖包
- 强制使用
opencv-python-headless替代完整版opencv-python,去掉GUI组件后体积能减少约30% - 避免安装完整numpy的冗余组件,后续通过编译裁剪进一步缩小体积
2. 针对Lambda环境编译依赖
Lambda基于Amazon Linux 2运行,直接在本地安装的依赖会包含多余系统库,需在模拟环境中安装:
- 用Docker启动Amazon Linux 2容器:
docker run -it --rm amazonlinux:2 - 容器内安装编译工具与Python环境:
yum install -y python3-pip gcc python3-devel - 创建目标目录,安装依赖时跳过缓存与冗余依赖:
mkdir /lambda-deps pip3 install numpy opencv-python-headless pydicom pillow --target /lambda-deps --no-cache-dir --no-deps - 将容器内的
/lambda-deps复制到本地,得到仅适配Lambda环境的精简依赖
3. 手动裁剪冗余文件
对依赖目录做进一步瘦身:
- 删除numpy下的
tests目录、所有.pyc字节码文件 - 删除opencv-python-headless中
cv2/data目录下未用到的训练数据(如仅保留需要的分类器,其余删除) - 删除所有
.dist-info元信息目录,不影响运行但能减少体积
4. 拆分Lambda Layer避免超限
Lambda单个Layer压缩后上限为50MB,将裁剪后的依赖拆分为两个独立Layer:
- 第一个Layer包含numpy+pydicom+pillow,第二个Layer包含opencv-python-headless
- 用最高压缩级别打包:
zip -r9 numpy-layer.zip ./numpy-group/ zip -r9 opencv-layer.zip ./opencv-group/ - 上传两个Layer到Lambda,并在函数中关联使用
5. 极端场景:切换为Lambda容器镜像
若上述方法仍无法解决,改用容器镜像方案(上限10GB):
- 基于官方Lambda Python镜像构建Dockerfile:
FROM public.ecr.aws/lambda/python:3.11 COPY requirements.txt . RUN pip install -r requirements.txt --no-cache-dir COPY your-code.py . CMD ["your-code.lambda_handler"] - 将镜像推送到AWS ECR,创建Lambda函数时选择容器镜像即可
内容的提问来源于stack exchange,提问作者Talha
相关产品推荐
相关产品推荐

