如何为 AWS Lambda 打包 Python

9
我有一个项目希望在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桶):

  1. 删除所有包中与“test_*.py”匹配的文件
  2. 手动摇树并精简scipy,因为我只使用scipy.minimize,通过删除大部分代码并重新运行测试来实现
  3. 压缩所有代码并使用pyminifier混淆
  4. 部署zappa

或者:

  1. 运行compileall以获取.pyc文件
  2. 删除所有*.py文件,然后让zappa上传.pyc文件
  3. 部署zappa

我遇到了slim_handler: true的问题,无论是我的连接断开导致上传失败,还是发生其他错误,当上传到S3的进度为25%时,我都会收到Could not connect to the endpoint URL的错误消息。在这个问题上,我想将依赖项降到可管理的级别。

尽管如此,主应用程序不到2 MB,但超过半GB的依赖关系必须是某种记录。

我的问题是:

  1. AWS的未压缩限制是多少? 是250MB还是500MB?
  2. 我采用上述方法减小软件包大小是否正确?
  3. 是否有可能进一步使用.pyz文件?
  4. 是否有任何标准实用程序可帮助解决上述问题?
  5. Python没有摇树库吗?

1
最终,我最终使用了 slim_handler: true 选项,并为了解决连接问题,将整个项目捆绑在亚马逊的虚拟机上。除了重写我的代码以不具有上述依赖项之外,我还没有想出如何精简整个项目。 - dim_voly
1个回答

3
  1. AWS的限制是未解压前的代码最多可以达到250MB(详见链接:https://hackernoon.com/exploring-the-aws-lambda-deployment-limits-9a8384b0bec3)。
  2. 我建议您采用第二种方法并编译所有内容。另外,您也可以考虑使用serverless框架。它不会强制创建virtualenv环境,这样会非常重。

我发现您所有的软件包都可以压缩到83MB(仅指软件包部分)。

我的解决办法如下:

  1. use serverless framework (consider moving from flask directly to API Gateway)
  2. install your packages locally on the same folder using:

    pip install -r requirements.txt -t .
    
  3. try your method of compiling to .pyc files, and remove others.

  4. Deploy:

    sis deploy
    
希望它能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接