Створення шару Matplotlib для AWS Lambda стало для мене несподіваною проблемою в минулому. Більш конкретно, помилка залежності numpy:
"errorMessage": "Unable to import module 'lambda_function': No module named 'numpy'"
Один із простих способів вирішення цієї проблеми та створення сумісного шару — використати Docker контейнер!
1. Встановіть Docker на свій комп’ютер
Якщо у вас ще немає встановленого Docker, перейдіть на офіційний сайт Docker і завантажте його. У цьому прикладі я використовую Docker desktop для Windows.
2. Створіть Docker контейнер з правильною версією Python
Перевірте версію середовища виконання вашої функції Lambda та запишіть її.
У моєму випадку це Python 3.12
Тепер відкрийте термінал Windows або будь-який інший інструмент командного рядка та створіть контейнер для Python з тією ж версією Python.
docker run -it --rm -v /c/Users/YourUser/my-lambda:/mnt/host/src python:3.12 /bin/bash
Зверніть увагу, що контейнер використовує ту ж версію, що й Lambda (3.12).
“/c/Users/YourUser/my-lambda” Змініть “YourUser” на ваше фактичне ім’я користувача.
Тепер /mnt/host/src змонтовано в директорію /c/Users/YourUser/my-lambda на хост-машині.
3. Створення шару
Перейдіть до змонтованої директорії та створіть віртуальне середовище Python:
cd /mnt/host/src
python3 -m venv venv
source venv/bin/activate
Тепер встановіть Matplotlib:
pip install matplotlib
Після встановлення пакету, його потрібно заархівувати, щоб підготувати до завантаження:
mkdir -p layer/python/lib/python3.12/site-packages
cp -r venv/lib/python3.12/site-packages/* layer/python/lib/python3.12/site-packages/
cd layer/
zip -r matplotlib_layer.zip python/
cp matplotlib_layer.zip /mnt/host/src/
Увага! ZIP, ймовірно, не встановлений у контейнері, тому вам потрібно буде його отримати. Це можна зробити таким чином:
apt-get update
apt-get install zip
4. Готово!
Тепер ви можете побачити архівований файл, готовий до використання в шарі. Він знаходиться в директорії хост-машини, яку ви налаштували під час створення контейнера — “/c/Users/YourUser/my-lambda”.
exit #щоб вийти з Docker контейнера
Структура zip файлу повинна завжди починатися з “python/” і виглядати так:
Перекладено з: How to create a Matplotlib AWS Lambda layer using Docker