Подтвердить что ты не робот

Pandas в AWS lambda дает numpy ошибку

Я пытаюсь запустить свой код в AWS Lambda, который импортирует pandas. Итак, вот что я сделал. У меня есть файл python, который содержит простой код следующим образом (этот файл имеет обработчик лямбда)

import json
print('Loading function')
import pandas as pd
def lambda_handler(event, context):
    return "Welcome to Pandas usage in AWS Lambda"
  • Я закрепил этот файл python вместе с numpy, pandas и pytz-библиотеками в качестве пакета развертывания (все это в машине Amazon EC2 linux)
  • Затем загрузили пакет в S3
  • Создал функцию лямбда (runtime = python3.6) и загрузил пакет развертывания из S3

Но когда я тестирую лямбда-функцию в AWS Lambda, я получаю следующую ошибку:

Unable to import module 'lambda_function': Missing required dependencies ['numpy']

У меня уже есть numpy в zipped-пакете, но все-таки я получаю эту ошибку. Я попытался следовать подсказкам, приведенным в Pandas и AWS Lambda, но не повезло.

Кто-нибудь столкнулся с той же проблемой. Поблагодарю любые намеки или предложения по решению этой проблемы.

Спасибо

4b9b3361

Ответ 1

РЕДАКТИРОВАТЬ: я наконец понял, как запускать pandas & numpy в среде выполнения AWS Lambda Python 3.6.

Я загрузил свой пакет развертывания в следующий репозиторий:

git clone https://github.com/pbegle/aws-lambda-py3.6-pandas-numpy.git

Просто добавьте ваш lambda_function.py в zip файл, выполнив:

zip -ur lambda.zip lambda_function.py

Загрузить на S3 и источник лямбда.

ОРИГИНАЛ:

Единственный способ заставить Pandas работать в лямбда-функции - это скомпилировать библиотеки pandas (и numpy) в экземпляре AWS Linux EC2, следуя инструкциям из этого поста в блоге, а затем использовать среду выполнения python 2.7 для моей лямбда-функции.

Ответ 2

Чтобы включить numpy в лямбда-зип, следуйте инструкциям на этой странице в документации по AWS...

Как добавить пакеты Python со скомпилированными двоичными файлами в пакет развертывания и сделать его совместимым с AWS Lambda?

Перефразируя инструкции, используя в качестве примера numpy:

  1. Откройте страницы модуля на pypi.org. https://pypi.org/project/numpy/
  2. Выберите Загрузить файлы.

  3. Скачать:

Для Python 2.7: имя-модуля-версии-cp27-cp27mu-manylinux1_x86_64.whl

например numpy-1.15.2-cp27-cp27m-manylinux1_x86_64.whl

Для Python 3.6: имя-модуля-версии-cp36-cp36m-manylinux1_x86_64.whl

например NumPy-1.15.2-cp36-cp36m-manylinux1_x86_64.whl

  1. Распакуйте файл колеса в папку /path/to/project-dir. Вы можете использовать команду unzip в командной строке, чтобы сделать это. Есть и другие способы, очевидно.

unzip numpy-1.15.2-cp36-cp36m-manylinux1_x86_64.whl

Когда файл wheel не сжат, ваш пакет развертывания будет совместим с Lambda.

Надеюсь, что все имеет смысл;)

Конечный результат может выглядеть примерно так. Примечание. Не следует включать файл whl в пакет развертывания.

What it might look like

Ответ 3

После долгих исследований я смог заставить его работать со слоями лямбды.

Создайте или откройте чистый каталог и выполните следующие действия:

Предварительные условия: убедитесь, что Docker запущен и работает

  1. Создайте файл needs.txt со следующим:
pandas==0.23.4
pytz==2018.7
  1. Создайте файл get_layer_packages.sh со следующим:
#!/bin/bash

export PKG_DIR="python"

rm -rf ${PKG_DIR} && mkdir -p ${PKG_DIR}

docker run --rm -v $(pwd):/foo -w /foo lambci/lambda:build-python3.6 \
    pip install -r requirements.txt --no-deps -t ${PKG_DIR}
  1. Выполните следующие команды в одном каталоге:
chmod +x get_layer_packages.sh

./get_layer_packages.sh

zip -r pandas.zip .
  1. Загрузите слой в корзину S3.

  2. Загрузите слой в AWS, выполнив следующую команду:

aws lambda publish-layer-version --layer-name pandas-layer --description "Description of your layer"
--content S3Bucket*=<bucket name>*,S3Key=*<layer-name>*.zip
--compatible-runtimes python3.6 python3.7
  1. Перейдите в консоль Lambda и загрузите свой код в виде zip файла или используйте встроенный редактор.

  2. Нажмите "Слои"> "Добавить слой"> "Найдите слой (pandas-layer)" из "Совместимых слоев" и выберите версию.

  3. Также добавьте слой AWSLambda-Python36-SciPy1x, который по умолчанию доступен для импорта numpy.

Выбор слоя из консоли

  1. Протестируйте код. Это должно работать сейчас !!!!

Благодаря этой средней статье https://medium.com/@qtangs/creating-new-aws-lambda-layer-for-python-pandas-library-348b126e9f3e

Ответ 4

Чтобы получить дополнительные библиотеки в Lambda, нам нужно скомпилировать их на Amazon Linux (это важно, если базовая библиотека основана на C или С++, например, для Numpy) и упаковывает их в ZIP файл вместе с python script хотите запустить в Лямбда.

Чтобы получить компилированную версию библиотек Amazon Linux. Вы можете либо найти версию, которую кто-то уже скомпилировал, например, файл @pbegle, либо скомпилировать ее самостоятельно. Чтобы скомпилировать его, есть два варианта:  - скомпилировать библиотеки в экземпляре EC2 https://streetdatascience.com/2016/11/24/using-numpy-and-pandas-on-aws-lambda/  - скомпилировать библиотеки на докерной версии среды Lambda https://serverlesscode.com/post/scikitlearn-with-amazon-linux-container/

Следуя последнему варианту с Docker, можно заставить его работать с помощью инструкций в блоге выше и добавив:

pip install --use-wheel pandas

в script для компиляции библиотек:

https://github.com/ryansb/sklearn-build-lambda/blob/master/build.sh#L21

Ответ 5

Немного дубликат Невозможно найти MySQL в NodeJS с использованием AWS Lambda

Вам нужно упаковать свои библиотеки с помощью Lambda. Поскольку lambda работает в общедоступном облаке, вы не можете его настроить.

Теперь, когда вы используете pandas, вам нужно упаковать Pandas с вашим почтовым индексом. Получите путь к pandas (например:/Users/dummyUser/anaconda/lib/python3.6/site-packages) и скопируйте библиотеку туда, где у вас есть код лямбда-функции. Внутри вашего кода обратитесь к Pandas из вашей локальной копии. При загрузке запишите весь комплект (код + библиотеки) и загрузите его, как вы. Он должен работать.

Ответ 6

Я пытаюсь использовать подобную ошибку при попытке использовать движок python3.6. Когда я переключился на 2.7, он работал отлично. Я использовал Amazon AMI для создания моего zip файла, но он имеет только python3.5, а не 3.6. Я предполагаю, что причиной было несоответствие версии. Но это просто предположение, я еще не пробовал этот процесс на установке python3.6.

Ответ 7

AWS Lambda использует операционную систему Amazon Linux. Идея заключается в том, чтобы скачать Pandas и NumPy, совместимые с Amazon Linux. То, что вы загружаете с помощью pip относится только к Windows или Mac. Вам необходимо скачать совместимую версию для Linux, чтобы ваша функция Lambda могла ее понять. Эти файлы называются wheel файлами.

Создайте новый локальный каталог с файлом lambda_function.py. Установите Pandas в локальный каталог с помощью pip:

$ pip install -t . pandas

Перейдите к https://pypi.org/project/pandas/#files. Найдите и скачайте новейший пакет *manylinux1_x86_64.whl. В моем случае я использую Python 3.6 в своей функции Lambda, поэтому я скачал следующее:

Загрузите whl файлы в каталог с помощью lambda_function.py. Удалите *.dist-info pandas, numpy и *.dist-info. Распакуйте все файлы.

$ rm -r pandas numpy *.dist-info
$ unzip numpy-1.16.1-cp36-cp36m-manylinux1_x86_64.whl
$ unzip pandas-0.24.1-cp36-cp36m-manylinux1_x86_64.whl

Удалите whl файлы, *.dist-info и __pycache__. Подготовьте zip.zip архив:

$ rm -r *.whl *.dist-info __pycache__
$ zip -r zip.zip .

Загрузите файл zip.zip в вашу функцию Lambda.

enter image description here

Источник: https://medium.com/@korniichuk/lambda-with-pandas-fd81aa2ff25e

Ответ 8

Ваш код всегда дает эту ошибку
поскольку лямбда не содержит никакой внешней библиотеки, она имеет библиотеку, которая по умолчанию поставляется с Python.

если вы используете какую-либо внешнюю библиотеку, такую как pandas, numpy или любую другую. вам нужно установить эту библиотеку на Aws Lambda
перед использованием

увидеть ваш код

import json
print('Loading function')
import pandas as pd
def lambda_handler(event, context):
    return "Welcome to Pandas usage in AWS Lambda"

здесь нет установки библиотеки панд, поэтому ваш код не работает.
Я предлагаю использовать ваш код следующим образом. написать весь код внутри лямбда-функции

import json
def lambda_handler(event, context):
    #install python libray here 
    print('Loading function')
    import pandas as pd
    return "Welcome to Pandas usage in AWS Lambda" 

Итоговый код выглядит следующим образом

 def lambda_handler(event, context):
     import pip

    def install(package):
        if hasattr(pip, 'main'):
            pip.main(['install', package])
        else:
            pip._internal.main(['install', package])

    if __name__ == '__main__':
        install('pandas')

    #install python libray here 
    print('Loading function')
    import pandas as pd
    return "Welcome to Pandas usage in AWS Lambda" 

Ответ 9

Это похоже на ответ рандипа, но вам не нужно использовать лямбда-слои, если вы не хотите этого делать.

Как уже говорили другие, это не работает, потому что pandas/numpy требует сборки двоичных файлов, а операционная система вашего компьютера сборки (Linux, Mac, Windows) не соответствует операционной системе Lambda (Amazon Linux).

Чтобы решить эту проблему, вы можете использовать docker для загрузки/сборки ваших зависимостей и упаковки их в Amazon Linux. Amazon предоставляет изображение Docker для этой цели. Ниже описано, как я собрал свой пакет python для среды исполнения Python 3.6 (у них есть другие докеры для всех других сред выполнения):

Поместите все ваши зависимости в файл requirements.txt, например:

openpyxl
boto3
pandas

Создайте сценарий (то есть с именем build.sh), который будет собирать ваш пакет, вот как выглядел мой:

#!/bin/bash

# remove old build artifacts
rm -rf build
rm lambda_package.zip

# make build dir and copy my lambda handler file into it
mkdir build
cp lambda_daily_util_gen.py  build/

# Use requirements file to download/build dependencies into the build folder
cd build
pip install -r ../requirements.txt --target .

# Create an lambda package with my files and all dependencies
zip -r9 ../lambda_package.zip .

Убедитесь, что у вас есть лямбда-образ сборки Amazon Linux:

$ docker pull lambci/lambda

Запустите сценарий сборки внутри Docker-контейнера:

Mac/Linux:

$ docker run --rm -v "$PWD":/var/task lambci/lambda:build-python3.6 /var/task/build.sh

Окна:

docker run --rm -v ${PWD}:/var/task lambci/lambda:build-python3.6 chmod +x build.sh;./build.sh

Теперь вы должны увидеть файл с именем lambda_package.zip, созданный на Amazon Linux, который вы можете загрузить в AWS.

Надеюсь, это поможет.

Ответ 10

with the безсерверная структура позволяет легко упаковать и развернуть ваши зависимости.

вам нужно только;

  1. установить без сервера

    npm install -g serverless
    
  2. создайте serverless.yml в корне вашего проекта со следующим:

    service: numpy-test
    
    # define the environment of your lambda
    provider:
      name: aws
      runtime: python3.6
    
    # specify the function you want to deploy
    functions:
      numpy:
        # path to your lambda_handler function
        handler: path/to/function.lambda_handler
    
    # add a plugin that allows serverless to package python libraries
    # specified in the requirements.txt or Pipfile
    plugins:
      - serverless-python-requirements
    
    # this section makes sure your libraries get build correctly 
    # for an aws lambda environment
    custom:
      pythonRequirements:
        dockerizePip: non-linux
    

    скорректировать путь/к /function.lambda_handler

  3. убедитесь, что докер запущен и выполните

    serverless deploy

По завершении развертывания перейдите в консоль AWS, найдите функцию numpy-test-dev-numpy и протестируйте свою функцию.

В этой статье подробно объясняются необходимые шаги.