如何将Python捆绑到AWS Lambda

dim*_*oly 7 python amazon-web-services python-3.x aws-lambda

我有一个要在AWS Lambda上运行的项目,但该项目已超过50MB的压缩限制。目前,压缩后的空间为128MB,带有虚拟环境的项目文件夹为623MB,其中包括(空间的顶级用户):

  • scipy(〜187MB)
  • 熊猫(〜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
Run Code Online (Sandbox Code Playgroud)

我使用Zappa进行部署,因此我对整个基础架构的了解有限。我的理解是,某些库(很少)没有上载,因此例如numpy,该部分没有上载,并且使用了该环境中已经可用的Amazon版本。

我提出了以下工作流程(不将S3存储桶用于slim_handler):

  1. 删除所有软件包中与“ test _ *。py”匹配的所有文件
  2. scipy.minimize删除大多数内容并重新运行测试,以手动方式手动摇动scipy
  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。出于这个问题的目的,我想将依赖关系降低到可管理的水平。

尽管如此,超过半数的依赖关系(主应用程序小于2MB)必须记录下来。

我的问题是:

  1. AWS的未压缩限制是多少?是250MB还是500MB?
  2. 使用上述减小包装尺寸的方法是否正确?
  3. 是否可以进一步使用.pyz文件?
  4. 是否有任何标准实用程序可以帮助上述工作?
  5. 有没有树摇Python库?

小智 3

  1. AWS 中的限制是解压后的 250MB 代码(如此处所示https://hackernoon.com/exploring-the-aws-lambda-deployment-limits-9a8384b0bec3
  2. 我建议采用第二种方法并编译所有内容。我认为您还应该考虑使用无服务器框架。它不会强迫您创建非常繁重的 virtualenv。

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

我的解决方法是:

  1. 使用无服务器框架(考虑从flask直接迁移到API网关)
  2. 使用以下命令将包本地安装在同一文件夹中:

    pip install -r requirements.txt -t .
    
    Run Code Online (Sandbox Code Playgroud)
  3. 尝试编译为 .pyc 文件的方法,并删除其他文件。

  4. 部署:

    sis deploy
    
    Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。