Serverless打包异常:Lambda包含其他函数且体积过大求助
AWS Lambda包体积问题排查与优化方案
一、为什么开启package: individually: true后每个包都包含所有函数文件?
当前全局package.patterns仅配置了排除规则,未针对单个函数设置包含规则。启用individually: true时,Serverless框架默认会把项目根目录下所有未被排除的文件(即所有.py文件)打包到每个函数的zip包中,因此每个函数包都包含了全量函数代码和共享工具类。
二、缩减Lambda包体积的实用方法
1. 给每个函数单独配置打包范围
在每个函数的配置中添加package规则,先排除所有文件,再仅包含当前函数需要的代码,避免打包无关文件:
functions: function1: handler: function1.function1 package: include: - function1.py - sharedUtility.py # 若该函数依赖共享工具类则保留 exclude: - '**' # 先排除所有文件,再按需包含 function2: handler: function2.function2 package: include: - function2.py - sharedUtility.py exclude: - '**' reallySmallFunction: handler: reallySmallFunction.reallySmallFunction package: include: - reallySmallFunction.py - sharedUtility.py exclude: - '**'
2. 优化Python依赖打包配置
调整serverless-python-requirements参数,最大化压缩依赖体积:
- 开启
zip: true:将依赖压缩为zip包,减少整体体积 - 添加
dockerizePip: non-linux:若本地是Windows/Mac系统,确保依赖是针对Lambda的Linux环境编译的,避免冗余平台相关文件 - 加入
strip: true:进一步清理依赖中的调试符号和无用文件 - 排除Lambda自带库:
boto3、botocore等是AWS Lambda运行时内置的库,无需打包
修改后的配置示例:
custom: pythonRequirements: zip: true slim: true strip: true dockerizePip: non-linux noDeploy: - pytest - boto3 - botocore
3. 使用Lambda Layers共享公共代码与依赖
将sharedUtility.py和所有公共依赖打包成一个Lambda Layer,每个函数仅打包自身业务代码,通过引用Layer复用公共资源,大幅降低单个函数包体积:
# 定义Layer layers: sharedLambdaLayer: path: shared-layer # 新建该目录,存放sharedUtility.py和安装的依赖 compatibleRuntimes: - python3.8 # 函数中引用Layer functions: function1: handler: function1.function1 layers: - !Ref SharedLambdaLayerLambdaLayer
注意:Layer未压缩部署包大小限制为250MB,单个函数最多引用5个Layer。
4. 手动清理冗余文件
检查.serverless目录下的zip包内容,确认是否有意外打包的大文件(如日志、测试数据、临时文件等),补充到全局或函数级的exclude规则中。
5. 升级Python运行时
切换到Python 3.10或更高版本,新运行时本身更轻量化,且对依赖兼容性更好,部分依赖包在高版本Python下体积更小。
内容的提问来源于stack exchange,提问作者A_Wunder
相关产品推荐
相关产品推荐

