无服务器 python 要求 slim:true 对依赖项大小没有任何作用

Serverless python requirements slim:true does nothing for dependency size

简介

在 serverless.yml

中使用以下设置时
custom:
  pythonRequirements:
    dockerizePip: true
    slim: true
    zip: true

slim:trueslim:false 产生相同的文件大小。我该怎么做才能减小 zip 文件的文件大小?

已满

我正在尝试获取 python 代码及其对 aws lambda 函数的依赖,使用 serverless framework. following the recommendations provided here 减少依赖大小以符合 250MB lambda 限制。在我的 serverless.yml 文件中,我有以下内容:

provider:
  name: aws
  runtime: python3.6

plugins:
  - serverless-python-requierments

custom:
  pythonRequierments:
    dockerizePip: true
    slim: true
    zip: true

functions:
...

我的requierments.txt如下:

xgboost==1.3.3
pandas==1.0.1
numpy == 1.18.5
...

我不断收到以下错误:

Unzipped size must be smaller than 262144000 bytes..

这让我相信我的 requierments.zip 文件太大了;详细输出表明 uploading service test.zip file to s3 271.17 MB.

我正在尝试使文件变小,我 运行 sls deploydockerizePip 以及 slim 设置为 false 用于测试目的,我得到了相同的结果;一个 271.17 Mb 的 test.zip 文件。这似乎令人费解,据我所知,slim: true 会在压缩文件之前减小文件大小,但 运行 slim:trueslim:false 会产生相同的文件大小。我怎样才能使 slim 工作?

更新 1:

我尝试在 pythonRequierments

中添加一个 slimPattern,正如 here 所讨论的
slimPatterns:
  - '**/*.dist-info/**'

但所有 dist 信息目录仍然存在于 zip 文件中,并且输出大小相同 (271.17MB)

更新 2:

我保留了更新 1 中的所有内容,但删除了 .serverless 目录和 requierments.zip。所有 .dist-info 目录仍然存在,即使我在 slimPatterns 中排除了它们(或者我认为如此)。

更新 3:

我尝试使用包排除,执行以下操作:

package:
  exclude:
    -node_modules/**
    -'**/*.dist-info/**'

这确实成功地删除了 node_modules(我之前应该这样做),但没有成功地以任何方式更改 .requierments.zip。所有 .dist-info 个目录保留。

更新 4:

我关注了this,在pythonRequirements中添加了一个noDeploy字段,其中包括setuptoolssix。尽管如此,两者最终都出现在我的 .requirements.zip 中,并且我的文件大小没有改变(269.9 Mb,与更新 3 相同,由于删除 node_modules 而略小)

它对我也不起作用。我最终使用以下选项使用图层 -

custom:
  pythonRequirements:
    slim: true
    layer: true

这将我的部署包大小减少到不到 10mb。然后所有依赖项进入一个单独的 zip(~100mb),创建一个 Lambda 层。这也有助于减少 Lambda 冷启动问题。

真的,这个问题背后的基本概念是有缺陷的。这个问题的主要目的是如何将大的依赖关系压缩到 Lambdas 大小约束上。最近,AWS 发布了对 Lambda 函数的 EFS 支持,这意味着您可以将卷直接挂载到您的 Lambda 函数上。这意味着几乎无限的存储空间,并且没有压缩要求,这意味着冷启动显着减少。此外,这些文件系统之一可以挂载到多个 Lambda 函数。

我不会深入细节,还有很多事情要做,但如果你想在 Lambda 上获得大型依赖树,我推荐以下内容:

  • 创建 VPC
  • 创建一个 ec2 实例
  • 创建 EFS 卷并将其装载到您的 ec2 实例
  • 通过pip install -r requierments.txt -t /mnt/.../efs/path
  • 将依赖项安装到 efs 实例
  • 将 EFS 实例挂载到 serverless.yml
  • 中的 lambda
  • 将 EFS 卷上的模块添加到 lambda 函数,方法是将其附加到路径