无服务器python需求slim:true对依赖项大小没有任何影响 简明的

无服务器python需求slim:true对依赖项大小没有任何影响 简明的,python,aws-lambda,serverless-framework,Python,Aws Lambda,Serverless Framework,在serverless.yml中使用以下设置时 custom: pythonRequirements: dockerizePip: true slim: true zip: true slim:true和slim:false导致相同的文件大小。如何减小zip文件的文件大小 满满的 我正在尝试使用该框架获取python代码及其对aws lambda函数的依赖关系。遵循提供的建议,减少依赖项大小,以符合250MB lambda限制。在我的serverless.yml文件

在serverless.yml中使用以下设置时

custom:
  pythonRequirements:
    dockerizePip: true
    slim: true
    zip: true
slim:true
slim:false
导致相同的文件大小。如何减小zip文件的文件大小

满满的 我正在尝试使用该框架获取python代码及其对aws lambda函数的依赖关系。遵循提供的建议,减少依赖项大小,以符合250MB lambda限制。在我的serverless.yml文件中,我有以下内容:

provider:
  name: aws
  runtime: python3.6

plugins:
  - serverless-python-requierments

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

functions:
...
xgboost==1.3.3
pandas==1.0.1
numpy == 1.18.5
...
package:
  exclude:
    -node_modules/**
    -'**/*.dist-info/**'
my Requirements.txt的内容如下:

provider:
  name: aws
  runtime: python3.6

plugins:
  - serverless-python-requierments

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

functions:
...
xgboost==1.3.3
pandas==1.0.1
numpy == 1.18.5
...
package:
  exclude:
    -node_modules/**
    -'**/*.dist-info/**'
我不断得到以下错误:

Unzipped size must be smaller than 262144000 bytes..
这让我相信我的requirements.zip文件太大了;详细的输出说明
正在将service test.zip文件上载到S3271.17 MB

我一直在努力缩小文件,我用
dockerizePip
运行了
slsdeploy
,并将
slim
设置为
false
进行测试,得到了相同的结果;271.17 Mb的test.zip文件。这似乎令人费解,据我所知,
slim:true
会在压缩文件之前减小文件大小,但使用
slim:true
slim:false
运行会导致相同的文件大小。如何使
苗条
工作

更新1: 我尝试在
pythonRequirements

slimPatterns:
  - '**/*.dist-info/**'
但是所有dist info目录仍然存在于zip文件中,并且输出大小相同(271.17MB)

更新2: 我保留了更新1中的所有内容,但删除了.serverless目录和requirements.zip。所有的.dist info目录都保留了下来,即使我在
slimPatterns
中排除了它们(或者我是这么认为的)

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

provider:
  name: aws
  runtime: python3.6

plugins:
  - serverless-python-requierments

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

functions:
...
xgboost==1.3.3
pandas==1.0.1
numpy == 1.18.5
...
package:
  exclude:
    -node_modules/**
    -'**/*.dist-info/**'
这确实成功地删除了节点_模块(我以前应该这样做),但没有成功地以任何方式更改
.requirements.zip
。所有
.dist info
目录仍保留

更新4:
我随后在
pythonRequirements
中添加了一个
noDeploy
字段,其中包括
setuptools
six
。尽管如此,它们最终都出现在我的
.requirements.zip中,而且我的文件大小没有改变(269.9 Mb,与更新3相同,由于删除了
节点模块,更新3稍微小了一点)

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

custom:
  pythonRequirements:
    slim: true
    layer: true

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

实际上,这个问题背后的基本概念是有缺陷的。这个问题的主要目的是如何将大型依赖项压缩到Lambdas大小约束上。最近,AWS发布了对Lambda函数的EFS支持,这意味着您可以直接将卷装载到Lambda函数上。这意味着几乎无限的存储空间,并且不需要拉链,这意味着冷启动要少得多。此外,其中一个文件系统可以装载到多个Lambda函数

我不会详细讨论,还有很多事情要做,但是如果您想在Lambda上获得大型依赖树,我建议您:

provider:
  name: aws
  runtime: python3.6

plugins:
  - serverless-python-requierments

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

functions:
...
xgboost==1.3.3
pandas==1.0.1
numpy == 1.18.5
...
package:
  exclude:
    -node_modules/**
    -'**/*.dist-info/**'
  • 创建专有网络
  • 创建一个ec2实例
  • 创建EFS卷并将其装载到ec2实例
  • 通过`pip install-r requirements.txt-t/mnt/../efs/path将依赖项安装到efs实例
  • 将该EFS实例装载到serverless.yml中的lambda
  • 通过将EFS卷上的模块附加到path,将其添加到lambda函数中