Amazon web services 如何增加AWS lambda部署包的最大大小(RequestEntityTooLargeException)?
我从AWS codebuild上传lambda函数源代码。我的Python脚本使用NLTK,因此需要大量数据。My.zip包太大,出现Amazon web services 如何增加AWS lambda部署包的最大大小(RequestEntityTooLargeException)?,amazon-web-services,aws-lambda,aws-codebuild,Amazon Web Services,Aws Lambda,Aws Codebuild,我从AWS codebuild上传lambda函数源代码。我的Python脚本使用NLTK,因此需要大量数据。My.zip包太大,出现RequestEntityTooLargeException。我想知道如何增加通过UpdateFunctionCode命令发送的部署包的大小 我使用AWS CodeBuild将源代码从GitHub存储库转换为AWS Lambda。以下是关联的buildspec文件: 版本:0.2 阶段: 安装: 命令: -echo“安装步骤” -apt获取更新 -apt-get-
RequestEntityTooLargeException
。我想知道如何增加通过UpdateFunctionCode命令发送的部署包的大小
我使用AWS CodeBuild
将源代码从GitHub存储库转换为AWS Lambda
。以下是关联的buildspec文件:
版本:0.2
阶段:
安装:
命令:
-echo“安装步骤”
-apt获取更新
-apt-get-install-zip-y
-安装python3pip-y
-pip安装--升级pip
-pip安装--升级awscli
#定义目录
-export HOME_DIR=`pwd`
-导出NLTK_数据=$HOME_目录/NLTK_数据
预构建:
命令:
-回应“预构建步骤”
-cd$HOME\U DIR
-虚拟的
- . venv/bin/激活
#安装模块
-pip安装-U请求
#NLTK下载
-pip安装-U nltk
-python-m nltk.downloader-d$nltk_DATA wordnet stopwords punkt
-pip freeze>requirements.txt
建造:
命令:
-回显“构建步骤”
-cd$HOME\U DIR
-mv$VIRTUAL_ENV/lib/python3.6/site packages/*。
-sudo-zip-r9 algo.zip。
-aws s3 cp——递归——acl公共读取。/s3://hilightalgo/
-aws lambda更新函数代码--函数名称arn:aws:lambda:eu-west-3:671560023774:函数:LaunchHilight--zip文件fileb://algo.zip
-aws lambda更新函数配置--函数名称arn:aws:lambda:eu-west-3:671560023774:函数:LaunchHilight--环境'Variables={NLTK_DATA=/var/task/NLTK_DATA}'
后期构建:
命令:
-回显“后期构建步骤”
启动管道时,我有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
)
有人有办法解决这个“大小限制问题”吗?您不能增加Lambda的部署包大小。中介绍了AWS Lambda限制。可以查看有关这些限制如何工作的更多信息。本质上,您的解压缩包大小必须小于250MB(262144000字节) 附言:使用图层并不能解决尺寸问题,但有助于管理&可能更快的冷启动。包大小包括图层- 一个函数一次最多可以使用5层。函数和所有层的总解压缩大小不能超过250 MB的解压缩部署包大小限制
您不能增加包大小,但可以使用AWS Lambda层来存储一些应用程序依赖项
在此之前,解决此限制的一种常用模式是从S3下载大量依赖项。我自己也没有尝试过这一点,但网站的人员介绍了一个可能有用的技巧。引用自: Zappa压缩大型应用程序并将项目zip文件发送到S3。其次,Zappa创建了一个非常小的slim处理程序,它只包含Zappa及其依赖项,并将其发送到Lambda 在冷启动时调用slim处理程序时,它会从S3下载大型项目zip,并将其解压缩到Lambda的共享/tmp空间中。对该温暖Lambda的所有后续调用都会共享/tmp空间并访问项目文件;因此,如果Lambda保持温暖,则该文件可能只下载一次 这样,您将获得500MB in/tmp 更新: 我在几个项目的lambdas中使用了以下代码,它基于zappa使用的方法,但可以直接使用
# Based on the code in https://github.com/Miserlou/Zappa/blob/master/zappa/handler.py
# We need to load the layer from an s3 bucket into tmp, bypassing the normal
# AWS layer mechanism, since it is too large, AWS unzipped lambda function size
# including layers is 250MB.
def load_remote_project_archive(remote_bucket, remote_file, layer_name):
# Puts the project files from S3 in /tmp and adds to path
project_folder = '/tmp/{0!s}'.format(layer_name)
if not os.path.isdir(project_folder):
# The project folder doesn't exist in this cold lambda, get it from S3
boto_session = boto3.Session()
# Download zip file from S3
s3 = boto_session.resource('s3')
archive_on_s3 = s3.Object(remote_bucket, remote_file).get()
# unzip from stream
with io.BytesIO(archive_on_s3["Body"].read()) as zf:
# rewind the file
zf.seek(0)
# Read the file as a zipfile and process the members
with zipfile.ZipFile(zf, mode='r') as zipf:
zipf.extractall(project_folder)
# Add to project path
sys.path.insert(0, project_folder)
return True
然后可以按如下方式调用它(我通过一个env变量将带有层的bucket传递给lambda函数):
在我编写这段代码时,tmp也被限制在250MB,但是上面对zipf.extractall(project_folder)
的调用可以替换为直接提取到内存:unzip_in_memory={name:zipf.read(name)for name in zipf.namelist()}
对于一些机器学习模型,我想@rahul的答案更通用。实际上,您可以请求增加部署包大小的限制 1.登录AWS控制台后转到AWS支持 2.然后要求增加服务限额。 3.并填写所需的最大尺寸。
AWS支持工程师将回复您关于限制增加批准的信息您可以尝试awesome无服务器python需求插件中使用的解决方法 理想的解决方案是使用lambda层(如果可以解决此问题)。如果总依赖项大于250MB,则可以在运行时利用/tmp目录中提供的512MB从S3存储桶中侧向加载较少使用的依赖项。压缩的依赖项存储在S3中,lambda可以在初始化期间从S3获取文件。Un压缩dependecy包并将路径添加到sys path 请注意,python依赖项需要在AmazonLinux上构建,AmazonLinux是用于lambda容器的操作系统
您可以检查无服务器python要求中使用的代码。AWS Lambda函数可以装载EFS。您可以使用EFS加载大于AWS Lambda 250 MB包部署大小限制的库或包 有关如何设置它的详细步骤如下: 在高层次上,变化包括:
load_remote_project_archive(os.environ['MY_ADDITIONAL_LAYERS_BUCKET'], 'lambda_my_extra_layer.zip', 'lambda_my_extra_layer')
aws lambda create-function --function-name my_function --code S3Bucket=my_bucket,S3Key=my_file