Как установить Google or-tools на AWS Lambda?

Я успешно использую 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 && 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

Любые идеи?


person klotz    schedule 14.10.2016    source источник


Ответы (2)


После обсуждения в 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 для получения подробной информации.

person klotz    schedule 10.07.2017

Во-первых, базовой средой выполнения 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 для установки зависимостей/библиотек на корневом уровне каталога вашего проекта, а затем заархивируйте. Не копируйте библиотеки вручную в каталог вашего проекта.

person omuthu    schedule 19.10.2016
comment
Спасибо за ваш ответ. Из того, что я могу сказать, запуская мой код с помощью or-tools, он хорошо работает с AMI на экземпляре EC2, если я устанавливаю or-tools, используя рекомендуемый маршрут установки, загружая ortools-examples. Кажется, это больше проблема правильной упаковки зависимостей. Я еще не пытался установить корневой уровень для pip или python setup.py на экземпляре EC2, только запускал gist.github .com/christianklotz/46270402552911e73d589072a8f76e56 для установки or-tools. - person klotz; 19.10.2016