AWS lambda Невозможно импортировать модуль 'lambda_function': ни один модуль с именем PIL - PullRequest
0 голосов
/ 07 июня 2018

Я использую лямбда-функцию SearchFacesbyimage И я использую этот документ https://aws.amazon.com/blogs/machine-learning/build-your-own-face-recognition-service-using-amazon-rekognition/

, где для сравнения я использую это

from PIL import Image

И я получаю эту ошибкуUnable to import module 'lambda_function': No module named PIL

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Несмотря на то, что документация четко описывает шаги, используемые для создания артефакта zip вручную для вашей лямбда-функции.Это решение не очень масштабируемое.Я использовал очень маленький пакет под названием juniper для бесшовной упаковки лямбда-функций Python.

В вашем конкретном случае вам необходимо выполнить следующие шаги:

Предполагая, чтоэто ваша структура папок:

.
├── manifest.yml
├── src
│   ├── requirements.txt
│   ├── lambda_function.py

В файле needs.txt вы бы включили только зависимости вашей лямбда-функции, в данном случае библиотеки PIL.

Pillow==6.0.0

Теперь,вам просто нужно создать небольшой файл, чтобы сообщить Juniper, что включать в zip-файл.Файл manifest.yml будет выглядеть так:

functions:
  reko:
    requirements: ./src/requirements.txt.
    include:
    - ./src/lambda_function.py

Теперь вам нужно pip install juniper в вашей локальной среде.Выполните команду cli:

juni build

Juniper создаст: ./dist/reko.zip.Этот файл будет содержать ваш исходный код, а также любые зависимости, которые вы включите в файл needs.txt.

По умолчанию juniper использует контейнеры docker, а команда build будет использовать python3.6.Вы можете изменить это значение по умолчанию.

0 голосов
/ 07 июня 2018

Вы получаете эту ошибку, так как PIL для Python 2.x или PILLOW для 3.x не являются стандартными библиотеками, доступными в лямбда-среде Python.

Чтобы использовать такую ​​библиотеку, вы должны создать специальный пакет для развертывания всех необходимых вам библиотек, а также код Python, который вы хотите развернуть.Этот пакет можно легко создать либо в docker , либо с помощью экземпляра EC2 .

Здесь описана процедура создания пакета развертывания в EC2 *.1010 *:

  1. Предположим, у вас есть файл с именем CreateThumbnail.py

  2. Если ваш исходный код находится на локальном компьютерехост, скопируйте его в EC2.

    scp -i key.pem /path/to/my_code.py ec2-user @ public-ip-address: ~ / CreateThumbnail.py

  3. Подключение к 64-битному экземпляру Amazon Linux через SSH.

    ssh -i key.pem ec2-user @ public-ip-address

  4. Установите Python 3.6 и virtualenv, выполнив следующие действия:

    a) sudo yum install -y gcc zlib zlib-devel openssl openssl-devel

    b) wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz

    c) tar -xzvf Python-3.6.1.tgz

    d) cd Python-3.6.1 && ./configure && make

    e) sudo make install f sudo / usr / local / bin / pip3 install virtualenv

  5. Выберите виртуальную среду, которая была установлена ​​через pip3

    / usr / local / bin/ virtualenv ~ / shrink_venv

    source ~ / shrink_venv / bin / activ *

  6. Установка библиотек в виртуальной среде

    pip install Pillow

    pip install boto3

  7. Добавьте содержимое пакетов сайтов lib и lib64 в свойZIP-файлОбратите внимание, что следующие шаги предполагают, что вы использовали Python runtime version 3.6.Если вы использовали версию 2.7, вам нужно будет соответственно обновить.

    cd $ VIRTUAL_ENV / lib / python3.6 / site-packages

    zip -r9 ~/CreateThumbnail.zip

    note- Чтобы включить все скрытые файлы, используйте следующий параметр:

    zip -r9 ~ / CreateThumbnail.zip

  8. Добавьте свой код Python в ZIP-файл

    cd ~

    zip -g CreateThumbnail.zip CreateThumbnail.py

Теперь CreateThumbnail.zip - ваш пользовательский пакет развертывания, просто скопируйте его в s3 и загрузите в свою лямбду.

Этот пример взят из официальной документации AWS на https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html

...