如何在 AWS Lambda 上安装 Google or-tools?

How to install Google or-tools on AWS Lambda?

我已在 AWS EC2 实例上成功使用 Google's or-tools,但最近一直在研究将它们包含在 AWS Lambda 函数中,但无法将其添加到 运行。

函数debug.py

下面只是从 ortools 导入 pywrapcp 的基本函数,如果一切设置正确,应该会成功。

from ortools.constraint_solver import pywrapcp

def handler(event, context):
    print(pywrapcp)

if __name__ == '__main__':
    handler(None, None)

模块导入失败

我创建了一个 package.sh 脚本,它在创建 zip 存档之前将所有依赖项复制到亚马逊 instructions 之后的项目中。 运行 部署的代码结果如下:

Unable to import module 'debug': No module named ortools.constraint_solver

package.sh

的内容
#!/bin/bash

DEST_DIR=$(dirname $(realpath -s [=13=]));

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-4.4.3842-py2.7-linux-x86_64.egg 中的 ortools 文件夹直接复制到项目根目录时,它会找到 ortools 但无法导入 pywrapcp,这可能与失败有关正在加载本机库,但我不确定,因为日志没有显示太多细节。

Unable to import module 'debug': cannot import name pywrapcp

有什么想法吗?

首先,底层 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 位)

通过使用 aws lambda 在此处列表中使用的 ami 之一启动实例来测试您的代码 (http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html)

如果可行,请使用 pip 在项目目录的根目录下安装 dependencies/libraries,然后压缩。不要手动将库复制到您的项目目录

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

您可以使用 Docker 在本地创建可部署包,而不是创建和配置 EC2 实例,有关详细信息,请参阅 or-tools-lambda