我从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数据时,一切都正常工作(我仅尝试使用软件包stopwords
和wordnet
。
有人有解决这个“尺寸限制问题”的想法吗?
答案 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/
总体而言,更改包括:
答案 2 :(得分:3)
以下是Lambda的硬限制(将来可能会更改):
解决此问题的明智方法是从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)
实际上,您可以请求增加对部署程序包大小的限制
https://docs.aws.amazon.com/awssupport/latest/user/getting-started.html