Невозможно импортировать модуль lambda_function: нет модуля с именем *
Я пытаюсь запустить лямбда-функцию Python, которая использует дополнительные пакеты. Однако всякий раз, когда я загружаю файл .zip в лямбда-консоль, я получаю сообщение об ошибке:
{
"errorMessage": "Unable to import module 'lambda_function': No module named '*'",
"errorType": "Runtime.ImportModuleError"
}
Я выполнил эти инструкции: https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies который сказал мне убедиться, что мои пакеты находятся в каталоге, локальном для моей лямбда-функции:
~/my-function$ pip install --target ./package Pillow
Я не использую подушку. Это образец кода с их сайта. Я также не использую пакет, к которому вы уже можете получить доступ на Lambda. Это тот, который я получил от github, и его нужно прикрепить к моему приложению.
Сначала это не сработало, поэтому я создал setup.cfgфайл и добавил:
[install]
prefix=
Теперь, когда я использую pipкоманду для установки в цель, она работает (а также добавляет множество других папок, кроме моего пакета, но я предполагал, что они нужны, поэтому я оставил их там.
Когда я захожу в каталог, пакет там.
Затем я нашел такой ответ: https://stackoverflow.com/a/12493244/5675125 что предполагает, что, возможно, некоторые скрытые файлы не были включены, и вот как я должен их заархивировать.
Опять та же ошибка.
Как мне заставить лямбда распознавать наличие моего пакета.
Ответы
Если вам требуется Pillow, самый простой способ использовать его в вашей функции - использовать популярный репозиторий с общедоступными слоями (включая подушку), например keithrozario / Klayers на github. Чтобы использовать его, вы должны найти ARN слоя в зависимости от вашего региона . Список ARN для python 3.8 находится здесь .
Например, для us-east-1уровня, добавленного для Python 3.7, будет:
Обновить
Я только что создал настраиваемый слой с помощью instabotи могу подтвердить, что он работает.
Используемая техника включает инструмент докера, описанный в недавнем блоге AWS :
- Как создать слой Lambda с помощью смоделированной среды Lambda с помощью Docker?
Таким образом, для этого вопроса я проверил его следующим образом:
Создайте пустую папку, например
mylayer.Заходим в папку и создаем
requirements.txtфайл с содержимым
instabot
- Выполните следующую команду докера:
docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
- Удалить numpy
instabotТребует , numpyкоторая очень велика. Поэтому мы удаляем его вручную перед созданием слоя. numpyВместо этого мы собираемся использовать слой, предоставленный AWS.
sudo rm -rvf ./python/lib/python3.8/site-packages/numpy*
Если мы не удалим numpy, размер слоя будет> 50 МБ.
- Создать слой как zip:
zip -9 -r mylayer.zip python
Создайте слой лямбда на основе
mylayer.zipКонсоли AWS. Не забудьте указатьCompatible runtimesвpython3.8.Добавьте к вашей функции два слоя:
Первый AWSLambda-Python38-SciPy1xпредоставляется AWS с numpy, а второй - тот, который мы создали выше. Итак, ваша функция будет использовать два слоя.
- Протестируйте слой в лямбда-выражении, используя следующую лямбда-функцию:
import json
from instabot import Bot
def lambda_handler(event, context):
# TODO implement
bot = Bot(base_path='/tmp')
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}