如何使用无服务器将 librosapython lib添加到 aws lambda

问题描述

我正在尝试使用 https://www.serverless.com/ 来管理一个简单的 aws lambda 函数的依赖项。

一个关键的依赖项是 librosa python 库 (https://github.com/librosa/librosa)。

我是 serverless 的新手,所以我很感激 serverless.yml 文件的指导。

到目前为止我有

service: my-app-123
app: my-app-123-app
org: my-org

frameworkVersion: '2'

provider:
  name: aws
  runtime: python3.6

stage: dev
region: eu-west-2

plugins:
  - serverless-python-requirements
functions:
  hello:
    handler: handler.hello

package:
  individually: false
  exclude:
    - '**/*'
  include:
    - handler.py

requirements.txt 是:

librosa==0.8.0
pandas==1.1.5

当我尝试上述操作时出现此错误

An error occurred: HelloLambdaFunction - Unzipped size must be smaller than 262144000 bytes (Service: AWSLambdaInternal; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: f6bd001e-5592-44c8-8f10-3b56180d7ec7; Proxy: null).

解决方法

您遇到了 AWS Lambda 部署包的大小限制,请参阅 here。解压缩后最多可以有 250 MB(这就是错误消息告诉您的内容)。

查看 serverless-python-requirements 插件文档中的处理 Lambda 的大小限制部分。

简而言之,serverless-python-requirements 推荐/支持的是:

  • 压缩依赖
  • 添加 Lambda Layer(例如单独的 librosa

压缩的工作原理是在您的 serverless.yml

中添加以下内容
custom:
  pythonRequirements:
    zip: true

然后在使用依赖项之前将其添加到您的处理程序中:

try:
  import unzip_requirements
except ImportError:
  pass

但有些用户似乎对 librosa 有问题并且似乎无法使其正常工作,例如参见 this GitHub issue 或此 other SO question

那里的建议是拆分您的 Lambda 并将它们链接起来,即一个只有 librosa 作为依赖项的 Lambda(可能会压缩依赖项),然后移交给第二个 Lambda 进行进一步处理,如果这对您可行,我不知道您想做什么。