Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何增加AWS lambda部署包的最大大小(RequestEntityTooLargeException)?_Amazon Web Services_Aws Lambda_Aws Codebuild - Fatal编程技术网

Amazon web services 如何增加AWS lambda部署包的最大大小(RequestEntityTooLargeException)?

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-

我从AWS codebuild上传lambda函数源代码。我的Python脚本使用NLTK,因此需要大量数据。My.zip包太大,出现
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包部署大小限制的库或包

有关如何设置它的详细步骤如下:

在高层次上,变化包括:

  • 创建和设置EFS文件系统
  • 将EFS与lambda函数一起使用
  • 在EFS访问点内安装pip依赖项
  • 设置PYTHONPATH环境变量以告知在何处查找依赖项
  • Th
    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