Невозможно импортировать модуль lambda_function: нет модуля с именем *

Oct 12 2020

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

Опять та же ошибка.

Как мне заставить лямбда распознавать наличие моего пакета.

Ответы

1 Marcin Oct 12 2020 at 10:28

Если вам требуется Pillow, самый простой способ использовать его в вашей функции - использовать популярный репозиторий с общедоступными слоями (включая подушку), например keithrozario / Klayers на github. Чтобы использовать его, вы должны найти ARN слоя в зависимости от вашего региона . Список ARN для python 3.8 находится здесь .

Например, для us-east-1уровня, добавленного для Python 3.7, будет:

Обновить

Я только что создал настраиваемый слой с помощью instabotи могу подтвердить, что он работает.

Используемая техника включает инструмент докера, описанный в недавнем блоге AWS :

  • Как создать слой Lambda с помощью смоделированной среды Lambda с помощью Docker?

Таким образом, для этого вопроса я проверил его следующим образом:

  1. Создайте пустую папку, например mylayer.

  2. Заходим в папку и создаем requirements.txtфайл с содержимым

instabot
  1. Выполните следующую команду докера:
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"
  1. Удалить numpy

instabotТребует , numpyкоторая очень велика. Поэтому мы удаляем его вручную перед созданием слоя. numpyВместо этого мы собираемся использовать слой, предоставленный AWS.

sudo rm -rvf ./python/lib/python3.8/site-packages/numpy*

Если мы не удалим numpy, размер слоя будет> 50 МБ.

  1. Создать слой как zip:
zip -9 -r mylayer.zip python 
  1. Создайте слой лямбда на основе mylayer.zipКонсоли AWS. Не забудьте указать Compatible runtimesв python3.8.

  2. Добавьте к вашей функции два слоя:

Первый AWSLambda-Python38-SciPy1xпредоставляется AWS с numpy, а второй - тот, который мы создали выше. Итак, ваша функция будет использовать два слоя.

  1. Протестируйте слой в лямбда-выражении, используя следующую лямбда-функцию:
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!')
    }