#amazon-web-services #aws-lambda #or-tools
#amazon-веб-сервисы #aws-lambda #или-tools
Вопрос:
Я успешно использую Google or-tools
в инстансах AWS EC2, но недавно изучал возможность их включения в функции AWS Lambda, но не могу запустить его.
Функция debug.py
Ниже приведена лишь базовая функция, импорт pywrapcp
из ortools
которой должен быть успешным, если все настроено правильно.
from ortools.constraint_solver import pywrapcp
def handler(event, context):
print(pywrapcp)
if __name__ == '__main__':
handler(None, None)
Сбой импорта модуля
Я создал package.sh
скрипт, который копирует все зависимости в проект, следуя инструкциям Amazon, прежде чем создавать zip-архив. Запуск развернутого кода приводит к следующему:
Unable to import module 'debug': No module named ortools.constraint_solver
Содержимое package.sh
#!/bin/bash
DEST_DIR=$(dirname $(realpath -s $0));
echo "Copy all native libraries...";
mkdir -p ./lib amp;amp; find $directory -type f -name "*.so" | xargs cp -t ./lib;
echo "Create package...";
zip -r dist.zip debug.py lib;
rm -r ./lib;
echo "Add dependencies from $VIRTUAL_ENV to $DEST_DIR/dist.zip";
cd $VIRTUAL_ENV/lib/python2.7/site-packages;
zip -ur $DEST_DIR/dist.zip ./** -x;
Когда я копирую ortools
папку ortools-4.4.3842-py2.7-linux-x86_64.egg
непосредственно в корень проекта, она находит ortools
, но затем не может импортировать pywrapcp
, что может быть связано со сбоем при загрузке собственных библиотек, но я не уверен, поскольку в журналах мало деталей.
Unable to import module 'debug': cannot import name pywrapcp
Есть идеи?
Ответ №1:
После обсуждения в Google or-tools
я составил сценарий упаковки, который решает проблемы с установкой зависимостей таким образом, чтобы это работало для AWS Lambda.
Ключевой частью этого является то, что содержимое пакетов egg должно быть скопировано вручную в папку проекта Lambda и предоставлено правильное разрешение для их доступа во время выполнения.
#!/bin/sh
easy_install3 py3-ortools
find "/opt/python3/lib/python3.6/site-packages" -path "*.egg/*" -not -name "EGG-INFO" -maxdepth 2 -exec cp -r {} ./dist ;
chmod -R 755 ./dist
Вместо создания и настройки экземпляра EC2 вы можете использовать Docker для создания развертываемого пакета локально, or-tools-lambda
подробности см. в разделе.
Ответ №2:
Во-первых, базовой средой выполнения AWS Lambda является Amazon Linux, в то время как or-tools не тестируется за пределами указанных ниже сред в соответствии с https://github.com/google/or-tools
- Ubuntu 14.04 и 16.04 (64-разрядная версия).
- Mac OS X El Capitan с Xcode 7.x (64-разрядная версия).
- Microsoft Windows с Visual Studio 2013 и 2015 (64-разрядная версия)
Протестируйте свой код, запустив экземпляр с одним из ami, который aws lambda использует в приведенном здесь списке (http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html )
Если это сработает, используйте pip для установки зависимостей / библиотек на корневом уровне каталога вашего проекта, а затем zip. Не копируйте библиотеки вручную в каталог вашего проекта
Комментарии:
1. Спасибо за ваш ответ. Из того, что я могу сказать, запуск моего кода с его использованием
or-tools
хорошо работает с AMI на экземпляре EC2, если я устанавливаюor-tools
, используя рекомендуемый маршрут установки путем загрузкиortools-examples
. Кажется, что проблема заключается в правильной упаковке зависимостей. Я еще не пробовал устанавливать корневой уровень дляpip
python setup.py
экземпляра EC2 или для него, только запускал gist.github.com/christianklotz/46270402552911e73d589072a8f76e56 для установкиor-tools
.2. Существует несколько шагов для устранения неполадок при установке Python или-tools ( developers.google.com/optimization/installing ). Есть упоминание об установке с использованием pip (pip install ortools). Если это сработает, чтобы лямбда правильно распознала зависимость, попробуйте «pip install ortools -t /path /to /project-dir».