Импорт библиотек в лямбда-слоях
Я хотел импортировать библиотеку jsonschema в свою AWS Lambda, чтобы выполнить проверку запроса. Вместо того, чтобы связывать зависимости с моим приложением, я собираюсь сделать это через Lambda Layers. Я заархивировал все зависимости под venv/lib/python3.6/site-packages/
, Я загрузил это как лямбда-слой и добавил его в свою Ams-лямбда, используя publish-layer-version
а также aws lambda update-function-configuration
Команды соответственно. Папка zip называется lambda-dep.zip, и все файлы находятся под ней. Однако, когда я пытаюсь импортировать jsonschema в мою функцию lambda_function, я вижу ошибку ниже -
from jsonschema import validate
{
"errorMessage": "Unable to import module 'lambda_api': No module named 'jsonschema'",
"errorType": "Runtime.ImportModuleError"
}```
Am I missing any steps are is there a different mechanism to import anything within lambda layers?
5 ответов
Вы хотите, чтобы ваш.zip следовал этой структуре папок в разархивированном виде
Python / Lib/python3.6/ сайт-пакеты /{LibrariesGoHere}.
Загрузите этот zip, убедитесь, что слой добавлен в функцию Lambda, и вы должны быть в порядке.
Это структура, которая работала для меня.
Обновление из предыдущих ответов: согласно документации AWS требования были изменены, чтобы просто поместить их в каталог / python без остальной структуры каталогов.
https://aws.amazon.com/premiumsupport/knowledge-center/lambda-import-module-error-python/
Убедитесь, что в вашей разархивированной структуре каталогов есть библиотеки в каталоге /python.
Вот скрипт, который я использую для загрузки слоя:
#!/usr/bin/env bash
LAYER_NAME=$1 # input layer, retrived as arg
ZIP_ARTIFACT=${LAYER_NAME}.zip
LAYER_BUILD_DIR="python"
# note: put the libraries in a folder supported by the runtime, means that should by python
rm -rf ${LAYER_BUILD_DIR} && mkdir -p ${LAYER_BUILD_DIR}
docker run --rm -v `pwd`:/var/task:z lambci/lambda:build-python3.6 python3.6 -m pip --isolated install -t ${LAYER_BUILD_DIR} -r requirements.txt
zip -r ${ZIP_ARTIFACT} .
echo "Publishing layer to AWS..."
aws lambda publish-layer-version --layer-name ${LAYER_NAME} --zip-file fileb://${ZIP_ARTIFACT} --compatible-runtimes python3.6
# clean up
rm -rf ${LAYER_BUILD_DIR}
rm -r ${ZIP_ARTIFACT}
Я добавил содержимое выше в файл с именем build_layer.sh
тогда я называю это bash build_layer.sh my_layer
, Скрипт требует requirements.txt
в той же папке, и он использует Docker, чтобы иметь ту же среду выполнения, что и для Python3.6 Lambdas. Аргументом скрипта является имя слоя.
После загрузки слоя в AWS убедитесь, что на версию Lambda ссылается версия нужного слоя.
Есть способ попроще. Просто установите пакеты в папку python. Затем установите пакеты, используя параметр -t (цель). Обратите внимание "." в zip-архиве. это дикая карта.
mkdir lambda_function cd lambda_function mkdir питон cd python pip install yoruPackages -t./ CD.. zip /tmp/labmda_layer.zip.
Теперь zip-файл стал вашим лямбда-слоем.
Пошаговые инструкции с видеоинструкциями можно найти здесь.
https://geektopia.tech/post.php?blogpost=Create_Lambda_Layer_Python
В моем случае проблема была связана с версией Python. При архивировании пакета я использовал python\lib\ python3.8\site-packages, тогда как я использовал Python 3.9 в настройках среды выполнения лямбда. Поэтому убедитесь, что вы используете одну и ту же версию при упаковке и настройке среды выполнения aws лямбда.