Лямбда-ошибка 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 (который большой) и т. д.