【发布时间】:2018-07-06 21:59:57
【问题描述】:
我想在 AWS Lambda 上运行一个项目,但它超过了 50MB 的压缩限制。目前压缩包大小为 128MB,包含虚拟环境的项目文件夹大小为 623MB,包括(空间的顶级用户):
- scipy (~187MB)
- 熊猫 (~108MB)
- numpy (~74.4MB)
- lambda_packages (~71.4MB)
没有virtualenv,项目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”匹配的所有文件
- 手动摇树 scipy,因为我只使用
scipy.minimize,删除大部分并重新运行我的测试 - 压缩所有代码并使用
pyminifier进行混淆处理 - zappa 部署
或者:
- 运行
compileall获取.pyc文件 - 删除所有 *.py 文件,让 zappa 上传 .pyc 文件
- zappa 部署
我遇到了slim_handler: true 的问题,我的连接断开并且上传失败或者发生了其他错误,并且在上传到 S3 的大约 25% 时我收到了Could not connect to the endpoint URL。出于这个问题的目的,我想将依赖关系降低到可管理的水平。
尽管如此,主应用程序小于 2MB 的超过一半的依赖项必须是某种记录。
我的问题是:
- AWS 的解压限制是多少?是 250MB 还是 500MB?
- 上述减小包装尺寸的方法是否正确?
- 是否可以更进一步并使用 .pyz 文件?
- 是否有任何标准实用程序可以帮助解决上述问题?
- python 有没有摇树库?
【问题讨论】:
-
最后,我最终使用了
slim_handler: true选项,为了解决连接问题,我将整个东西捆绑在亚马逊的一台虚拟机上。除了重写我的代码以不将上述内容作为依赖项之外,还没有想出如何精简整个项目。
标签: python python-3.x amazon-web-services aws-lambda