我有一个项目想在 AWS Lambda 上运行,但它超过了 50MB 的压缩限制。现在压缩后为 128MB,带有虚拟环境的项目文件夹为 623MB,包括(空间的顶级用户):
- scipy (~187MB)
- Pandas (~108MB)
- numpy(~74.4MB)
- lambda_packages (~71.4MB)
如果没有 virtualenv
,该项目是 <2MB。 requirements.txt
是:
click==6.7
cycler==0.10.0
ecdsa==0.13
Flask==0.12.2
Flask-Cors==3.0.3
future==0.16.0
itsdangerous==0.24
Jinja2==2.10
MarkupSafe==1.0
matplotlib==2.1.2
mpmath==1.0.0
numericalunits==1.19
numpy==1.14.0
pandas==0.22.0
pycryptodome==3.4.7
pyparsing==2.2.0
python-dateutil==2.6.1
python-dotenv==0.7.1
python-jose==2.0.2
pytz==2017.3
scipy==1.0.0
six==1.11.0
sympy==1.1.1
Werkzeug==0.14.1
xlrd==1.1.0
我使用 Zappa 进行部署,所以我对整个基础设施的理解是有限的。我的理解是一些(很少)库没有上传,例如numpy,该部分不会被上传,而是使用亚马逊的版本,该版本已经在该环境中可用。
我建议采用以下工作流程(不为 slim_handler
使用 S3 存储桶):
- 删除所有包中匹配“test_*.py”的所有文件
- 手动 tree shake scipy,因为我只使用
scipy.minimize
,删除大部分并重新运行我的测试 - 压缩所有代码并使用
pyminifier
混淆 - zappa 部署
或者:
- 运行
compileall
得到.pyc文件 - 删除所有 *.py 文件,让 zappa 上传 .pyc 文件代替
- zappa 部署
我在使用 slim_handler: true
时遇到了问题,我的连接断开并且上传失败或者发生了一些其他错误,并且在上传到 S3 的大约 25% 时我得到了 Could not连接到端点 URL
。出于这个问题的目的,我想将依赖关系降低到可管理的水平。
尽管如此,主应用程序小于 2MB 的依赖项超过一半必须是某种记录。
我的问题是:
- AWS 的解压缩限制是多少?是 250MB 还是 500MB?
- 我使用上述减小包装尺寸的方法是否正确?
- 是否可以更进一步并使用 .pyz 文件?
- 是否有任何标准实用程序可以帮助解决上述问题?
- 没有 python 的 tree shaking 库吗?
最佳答案
- AWS 中的限制是解压缩的 250MB 代码(如此处所示 https://hackernoon.com/exploring-the-aws-lambda-deployment-limits-9a8384b0bec3)
- 我建议采用第二种方法并编译所有内容。 我认为您还应该考虑使用 serverless框架。它不会强制您创建非常繁重的 virtualenv。
我看到您所有的包都可以压缩到 83MB(仅包)。
我的解决方法是:
- 使用serverless框架(考虑从 Flask 直接迁移到 API 网关)
使用以下方法将您的软件包本地安装在同一文件夹中:
pip install -r requirements.txt -t .
尝试编译成 .pyc 文件的方法,并删除其他的。
部署:
sis deploy
希望对您有所帮助。
关于python - 如何为 AWS Lambda 捆绑 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48480390/