AWS Lambda错误:解压缩的大小必须小于262144000字节

vij*_*aya 11 lambda amazon-web-services

我正在开发一个lambda函数,它使用在python 2.7中创建的ResumeParser库.但是当我在AWS上部署包含库的这个函数时,它会引发以下错误:

解压缩的大小必须小于262144000字节

Gre*_*Woz 22

也许您没有排除使您的文件变大的开发包。

我的情况,(对于 NodeJS)我在我的文件中遗漏了以下内容serverless.yml

package:
  exclude:
    - node_modules/**
    - venv/**
Run Code Online (Sandbox Code Playgroud)

看看是否有类似的 Python 或您的案例。

  • 当您的代码尝试加载/使用包时,删除“node_modules/**”不会导致运行时错误吗? (7认同)
  • @kittu 它没有真正在任何地方记录,但 aws-sdk 确实预安装在 Lambda 映像中。安装 aws-sdk 作为生产依赖项只会隐藏 Lambda 预安装的 aws-sdk,这可能是也可能不是所需的,例如,如果您因某种原因需要锁定软件包版本。SO 上有一个线程讨论了 node.js 映像的依赖项:/sf/ask/3749653491/) (3认同)
  • 哇,我花了整个下午寻找解决这个问题的方法。太感谢了! (2认同)

Wes*_*eek 13

此问题的最佳解决方案是Lambda function使用Docker container您已构建并推送到的来部署您的AWS ECR. Lambda 容器映像的限制为 10 GB。

这是一个使用 Python 风格的示例AWS CDK

from aws_cdk import aws_lambda as _lambda

self.lambda_from_image = _lambda.DockerImageFunction(
    scope=self,
    id="LambdaImageExample",
    function_name="LambdaImageExample",
    code=_lambda.DockerImageCode.from_image_asset(
        directory="lambda_funcs/LambdaImageExample"
    ),
)
Run Code Online (Sandbox Code Playgroud)

Dockerfile目录中包含的示例lambda_funcs/LambdaImageExample与 mylambda_func.pyrequirements.txt

FROM amazon/aws-lambda-python:latest

LABEL maintainer="Wesley Cheek"
RUN yum update -y && \
    yum install -y python3 python3-dev python3-pip gcc && \
    rm -Rf /var/cache/yum
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY lambda_func.py ./
CMD ["lambda_func.handler"]
Run Code Online (Sandbox Code Playgroud)

运行cdk deploy后,将自动将其Lambda function与其在 中指定的依赖项一起捆绑到映像中requirements.txt,推送到AWS ECR存储库并进行部署。

这篇 Medium 文章是我的主要灵感

编辑:(有关此解决方案的更多详细信息可以在我的 Dev.to 帖子
找到)

  • 干杯,伙计,你是救星。我可以确认这确实可以解决 lambda 的 250MB 解压缩大小限制。在我的项目中,我有很多占用大小的依赖项,例如“pandas”和“scipy”,最大图像大小显示为 1.5GB。我能够使用此处概述的“DockerImageFunction”方法部署到 aws lambda。 (3认同)

Vin*_*t J 6

正如 Greg Wozniak 所说,您可能只是导入了无用的目录,例如 venv 和 node_modules。

package.exclude现已弃用并在 Serverless 4 中删除,您现在应该使用package.patterns

package:
  patterns:
    - '!node_modules/**'
    - '!venv/**'
Run Code Online (Sandbox Code Playgroud)

  • 该文件存放在哪里? (2认同)

Raf*_*Raf 5

这是一个硬性限制,无法更改:

AWS Lambda限制错误

超出先前限制表中列出的任何限制的功能将失败,并出现超出限制的异常。这些限制是固定的,目前无法更改。例如,如果您从AWS Lambda收到异常CodeStorageExceededException或类似于“超出代码存储限制”的错误消息,则需要减小代码存储的大小。

您需要减小包装尺寸。如果您有大型二进制文件,请将它们放在s3中,然后在引导程序上下载。同样,对于依赖项,您可以从s3位置pip installeasy_install从s3位置访问它们,这比从pip存储库中拉取速度更快。


Pra*_*ant 5

对我有用的解决方法:安装 pyminifier:

    pip install pyminifier
Run Code Online (Sandbox Code Playgroud)

转到您要压缩的库文件夹。就我而言,我想将 site-packages 文件夹压缩到我的虚拟环境中。因此,我在 site-packages 所在的同一级别创建了一个 site-packages-min 文件夹。运行以下 shell 脚本来缩小 python 文件并在 site-packages-min 文件夹中创建相同的结构。压缩这些文件并将其上传到 S3。

    #/bin/bash

    for f in $(find site-packages -name '*.py')
    do
            ori=$f
            res=${f/site-packages/site-packages-min}
            filename=$(echo $res| awk -F"/" '{print $NF}')
            echo "$filename"
            path=${res%$filename}
            mkdir -p $path
            touch $res
            pyminifier --destdir=$path $ori >> $res || cp $ori $res
    done        
Run Code Online (Sandbox Code Playgroud)

华泰

  • 有没有办法通过无服务器配置来做到这一点?您是如何将 zip 上传到 S3 的? (3认同)