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

Posted

技术标签:

【中文标题】如何在 AWS Lambda 上安装 Google or-tools?【英文标题】:How to install Google or-tools on AWS Lambda? 【发布时间】:2016-10-14 18:10:45 【问题描述】:

我已在 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 脚本,该脚本将所有依赖项复制到Amazon 的instructions 之后的项目中,然后再创建一个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

有什么想法吗?

【问题讨论】:

【参考方案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

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

【讨论】:

【参考方案2】:

首先,底层 AWS Lambda 执行环境是 Amazon Linux,而根据https://github.com/google/or-tools,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 在项目目录的根级别安装依赖项/库,然后进行压缩。不要手动将库复制到您的项目目录中

【讨论】:

感谢您的回答。据我所知,如果我通过下载ortools-examples 使用推荐的安装路线安装or-tools,则使用or-tools 运行我的代码可以很好地与EC2 实例上的AMI 配合使用。正确打包依赖项似乎更像是一个问题。我还没有尝试在 EC2 实例上设置 pippython setup.py 的根级别,只运行 gist.github.com/christianklotz/46270402552911e73d589072a8f76e56 来安装 or-tools 有一些解决 Python or-tools 安装问题的步骤 (developers.google.com/optimization/installing)。提到了使用 pip 安装(pip install ortools)。如果这可行,为了让 lambda 正确拾取依赖项,请尝试“pip install ortools -t /path/to/project-dir”。

以上是关于如何在 AWS Lambda 上安装 Google or-tools?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS Lambda 上安装 GraphicsMagick 或 ImageMagick?

在 Google Cloud Function 或 AWS Lambda 上部署 Universal Angular

如何使用 Java + ChromeDriver 在 AWS Lambda 中运行 Google Chrome 进行 Selenium 测试

如何使用AWS Lambda函数在本地系统上执行文件

你如何在Typescript中优雅地导入AWS-Lambda?

AWS Lambda:OpenBLAS 警告 - 无法确定此系统上的 L2 缓存大小,假设为 256k - 使用 Google 自定义搜索 API 时