如何在S3上存储较大的Python依赖关系(适用于具有无服务器的AWS Lambda)

时间:2019-02-14 23:39:09

标签: python amazon-web-services amazon-s3 aws-lambda

我正在使用AWS Lambda托管Python项目,使用无服务器框架管理部署,并且遇到了常见的50MB软件包存储限制。到目前为止,我已经使用serverless-python-individually和serverless-python-requirements插件成功地按功能划分了需求,以dockerise,压缩和上传每个文件作为单独的Lambda函数,如的关键部分所示。我的serverless.yml文件,如下所示。

这使前三个功能包保持在50MB以下,并创建了一个简单的工作流,在其中我可以使用sls deploy --pi-dockerizedPip简单地进行更改。但是,仅需要SciPy的第四个程序包不能减少到52MB以下,经过大量阅读后,我看到的唯一常见方法是将依赖项上传到S3(某个位置)并以某种方式确保我的import语句能够找到依赖关系。

我没有找到明确的说明来明确如何完成打包依赖关系的过程,以及(几乎同样重要)如何与Serverless一起工作(以便保持良好的工作流程)?

serverless.yml的关键部分:

package:
  individually: True
  exclude:
    # Exclude everything first.
    - '**/*'

functions:
  brain:
    handler: src/1-brain/wrap.handler
    package:
      include:
        - src/1-brain/**
    events:
      - schedule: rate(5 minutes)
  data:
    handler: src/2-data/wrap.handler
    package:
      include:
        - src/2-data/**
  strategy:
      handler: src/3-strategy/wrap.handler
      package:
        include:
          - src/3-strategy/**
  balancer:
      handler: src/4-portfolio-balancer/wrap.handler
      package:
        include:
          - src/4-portfolio-balancer/**  
custom:
  pythonRequirements:
    useDownloadCache: true
    useStaticCache: true
    dockerizePip: true
    zip: true
    slim: true
  pyIndividually:
    wrap:brain: src/1-brain/aws_handler.handler     # mapping to the real handler
    wrap:data: src/2-data/datafeed.handler          # mapping to the real handler
    wrap:strategy: src/3-strategy/strategy.handler  # mapping to the real handler
    wrap:balancer: src/4-portfolio-balancer/balancer.handler  # mapping to the real handler

1 个答案:

答案 0 :(得分:2)

AWS Lambda图层使您可以将软件包/环境捆绑到一个图层中。您最多可以使用5层,并且所有特定层的累加总和+特定lambda函数的lambda代码有250 MB的未压缩限制。

查看有关“在层中包括库依赖项”的部分 https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html