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

#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».