如何增加AWS lambda部署程序包(RequestEntityTooLargeException)的最大大小?

时间:2019-02-11 13:49:01

标签: amazon-web-services aws-lambda aws-codebuild

我从AWS Codebuild上传我的lambda函数源。我的Python脚本使用NLTK,因此需要大量数据。我的.zip软件包太大,出现RequestEntityTooLargeException。我想知道如何增加通过UpdateFunctionCode命令发送的部署包的大小。

我使用AWS CodeBuild将源从GitHub存储库转换为AWS Lambda。这是相关的buildspec文件:

version: 0.2
phases:
 install:
   commands:
     - echo "install step"
     - apt-get update
     - apt-get install zip -y
     - apt-get install python3-pip -y
     - pip install --upgrade pip
     - pip install --upgrade awscli
     # Define directories
     - export HOME_DIR=`pwd`
     - export NLTK_DATA=$HOME_DIR/nltk_data
 pre_build:
   commands:
     - echo "pre_build step"
     - cd $HOME_DIR
     - virtualenv venv
     - . venv/bin/activate
     # Install modules
     - pip install -U requests
     # NLTK download
     - pip install -U nltk
     - python -m nltk.downloader -d $NLTK_DATA wordnet stopwords punkt
     - pip freeze > requirements.txt
 build:
   commands:
     - echo 'build step'
     - cd $HOME_DIR
     - mv $VIRTUAL_ENV/lib/python3.6/site-packages/* .
     - sudo zip -r9 algo.zip .
     - aws s3 cp --recursive --acl public-read ./ s3://hilightalgo/
     - aws lambda update-function-code --function-name arn:aws:lambda:eu-west-3:671560023774:function:LaunchHilight --zip-file fileb://algo.zip
     - aws lambda update-function-configuration --function-name arn:aws:lambda:eu-west-3:671560023774:function:LaunchHilight --environment 'Variables={NLTK_DATA=/var/task/nltk_data}'
 post_build:
   commands:
     - echo "post_build step"

启动管道时,我有RequestEntityTooLargeException,因为.zip包中的数据太多。请参阅下面的构建日志:

[Container] 2019/02/11 10:48:35 Running command aws lambda update-function-code --function-name arn:aws:lambda:eu-west-3:671560023774:function:LaunchHilight --zip-file fileb://algo.zip
 An error occurred (RequestEntityTooLargeException) when calling the UpdateFunctionCode operation: Request must be smaller than 69905067 bytes for the UpdateFunctionCode operation
 [Container] 2019/02/11 10:48:37 Command did not exit successfully aws lambda update-function-code --function-name arn:aws:lambda:eu-west-3:671560023774:function:LaunchHilight --zip-file fileb://algo.zip exit status 255
[Container] 2019/02/11 10:48:37 Phase complete: BUILD Success: false
[Container] 2019/02/11 10:48:37 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: aws lambda update-function-code --function-name arn:aws:lambda:eu-west-3:671560023774:function:LaunchHilight --zip-file fileb://algo.zip. Reason: exit status 255

当我减少要下载的NLTK数据时,一切都正常工作(我仅尝试使用软件包stopwordswordnet

有人有解决这个“尺寸限制问题”的想法吗?

9 个答案:

答案 0 :(得分:7)

如果有人在 2020 年 12 月之后偶然发现了这个问题,那么 AWS 已经进行了重大更新,以支持将 Lamda 函数用作容器映像(最大 10GB !!)。更多信息here

答案 1 :(得分:3)

AWS Lambda函数可以挂载EFS。您可以使用EFS加载大于AWS Lambda的250 MB程序包部署大小限制的库或程序包。

有关如何设置的详细步骤,请点击此处: https://aws.amazon.com/blogs/aws/new-a-shared-file-system-for-your-lambda-functions/

总体而言,更改包括:

  1. 创建和设置EFS文件系统
  2. 将EFS与lambda函数一起使用
  3. 在EFS访问点内安装pip依赖项
  4. 设置PYTHONPATH环境变量以告诉在哪里查找依赖项

答案 2 :(得分:3)

以下是Lambda的硬限制(将来可能会更改):

  • 3 MB用于控制台内编辑
  • 压缩了50 MB作为要上传的软件包
  • 解压缩后包括层为250 MB

解决此问题的明智方法是从Lambda挂载EFS。这不仅对加载库有用,而且对其他存储也有用。

浏览这些博客:

答案 3 :(得分:2)

您不能增加Lambda的部署程序包大小。 AWS Lambda devopler guide中描述了AWS Lambda限制。有关这些限制的工作原理的更多信息,请参见here。本质上,您解压缩的程序包大小必须小于250MB(262144000字节)。

PS:使用图层并不能解决尺寸问题,尽管可以帮助进行管理,并且可以加快冷启动速度。包的大小包括图层-Lambda layers

  

一个功能一次最多可以使用5层。该功能和所有层的总解压缩大小不能超过250 MB的解压缩部署程序包大小限制。

答案 4 :(得分:1)

我自己还没有尝试过,但是Zappa的人们描述了一个可能有用的技巧。引用https://blog.zappa.io/posts/slim-handler

  

Zappa压缩大型应用程序,并将项目zip文件发送到S3。其次,Zappa创建了一个非常小的苗条处理程序,该处理程序仅包含Zappa及其依赖项,并将其发送给Lambda。

     

冷启动时调用苗条处理程序时,它会从S3下载大型项目zip,并将其解压缩到Lambda的共享/ tmp空间中。随后对该温暖的Lambda的所有调用均共享/ tmp空间,并有权访问项目文件;因此,如果Lambda保持温暖,则文件可能仅下载一次。

这样,您应该在/ tmp中获得500MB。

答案 5 :(得分:1)

来自 AWS documentation

<块引用>

如果您的部署包大于 50 MB,我们建议 将您的函数代码和依赖项上传到 Amazon S3 存储桶。

您可以创建一个部署包并将 .zip 文件上传到您的 您要在其中创建 Lambda 的 AWS 区域中的 Amazon S3 存储桶 功能。创建 Lambda 函数时,指定 S3 存储桶 Lambda 控制台上的名称和对象键名称,或使用 AWS 命令行界面 (AWS CLI)。

您可以使用 AWS CLI 来部署包,而不是使用 --zip-file 参数来传递部署包,您可以使用 < strong>--code 参数。例如:

aws lambda create-function --function-name my_function --code S3Bucket=my_bucket,S3Key=my_file

答案 6 :(得分:0)

您不能增加包的大小,但是可以使用AWS Lambda层存储一些应用程序依赖项。

https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path

在此层之前,解决此限制的常用模式是从S3下载巨大的依赖项。

答案 7 :(得分:0)

您可以尝试使用很棒的 serverless-python-requirements 插件中使用的解决方法。

理想的解决方案是在达到目的的情况下使用lambda层。如果总依赖关系大于250MB,则可以在运行时通过使用 / tmp 目录中提供的512 MB从S3存储桶中加载较少使用的依赖关系。压缩后的依赖项存储在S3中,并且lambda可以在初始化期间从S3获取文件。解压dependecy pacakge并将路径添加到sys path。

请注意,python依赖项需要在Amazon Linux(这是lambda容器的操作系统)上构建。我使用EC2实例创建zip包。

您检查无服务器python要求here中使用的代码

答案 8 :(得分:-1)

实际上,您可以请求增加对部署程序包大小的限制

1。登录AWS控制台后转到AWS Support

https://docs.aws.amazon.com/awssupport/latest/user/getting-started.html

2。然后要求增加服务限额。

enter image description here

3。并填写所需的最大尺寸。

enter image description here

AWS支持工程师将就限制增加批准与您联系