Лямбда-ошибка AWS: размер разархивированного файла должен быть меньше 262144000 байт

Я разрабатываю одну лямбда-функцию, которая использует библиотеку ResumeParser, сделанную в python 2.7. Но когда я внедряю эту функцию, включая библиотеку на AWS, я получаю следующую ошибку:

Распакованный размер должен быть меньше 262144000 байт

7 ответов

Возможно, вы не исключили пакеты разработки, из-за которых ваш файл стал настолько большим.

В моем случае (для NodeJS) мне не хватало следующего в моем serverless.yml:

package:
  exclude:
    - node_modules/**
    - venv/**

Посмотрите, есть ли аналогичные для Python или вашего случая.

Лучшим решением этой проблемы является развертывание с использованием Docker containerкоторый вы построили и подтолкнули к . Контейнеры имеют ограничение в 10 Гб, видимо.

Вот пример использования 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"
    ),
)

Пример Dockerfileсодержится в каталоге lambda_funcs/LambdaImageExampleрядом с моим lambda_func.pyа также :

      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"]

Бежать cdk deployи Lambda functionбудет автоматически включен в образ вместе с его зависимостями, указанными в requirements.txt, подтолкнул к AWS ECRрепозиторий и развернут.

Этот пост на Medium был моим главным источником вдохновения

Изменить:
(более подробную информацию об этом решении можно найти в моем сообщении Dev.to здесь )

Это жесткий предел, который нельзя изменить:

Ошибки AWS Lambda Limit

Функции, которые превышают любой из пределов, перечисленных в предыдущих таблицах пределов, завершатся с ошибкой с превышением пределов. Эти ограничения являются фиксированными и не могут быть изменены в настоящее время. Например, если вы получаете исключение CodeStorageExceededException или сообщение об ошибке, похожее на "Превышен лимит хранилища кода" от AWS Lambda, вам необходимо уменьшить размер хранилища кода.

Вам нужно уменьшить размер вашей посылки. Если у вас есть большие двоичные файлы, поместите их в s3 и загрузите на начальную загрузку. Аналогично для зависимостей, вы можете pip install или же easy_install они из локации s3, которая будет быстрее, чем вытащить из пипс репо.

Обходной путь, который работал для меня: Установите pyminifier:

    pip install pyminifier

Перейдите в папку библиотеки, которую вы хотите сжать. В моем случае я хотел заархивировать папку site-packages в моем виртуальном окружении. Поэтому я создал папку site-packages-min на том же уровне, где находились site-packages. Запустите следующий сценарий оболочки, чтобы минимизировать файлы 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        

НТН

Как заявил Грег Возняк, возможно, вы просто импортировали бесполезные каталоги, такие как venv и node_modules.

package.excludeтеперь устарела и удалена в serverless 4, теперь вы должны использоватьpackage.patternsвместо:

      package:
  patterns:
    - '!node_modules/**'
    - '!venv/**'

Обратите внимание, чтоboto3включен в Lambda от AWS, поэтому не следует включать его явно в файл требований. Это распространенная причина превышения максимального предела лямбды.

Если вы используете CloudFormation, в файле yaml вашего шаблона убедитесь, что ваше свойство «CodeUri» включает только необходимые файлы кода и не содержит таких вещей, как каталог .aws-sam (который большой) и т. д.

Другие вопросы по тегам