如何在 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 实例上设置 pip
或 python 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 测试
你如何在Typescript中优雅地导入AWS-Lambda?
AWS Lambda:OpenBLAS 警告 - 无法确定此系统上的 L2 缓存大小,假设为 256k - 使用 Google 自定义搜索 API 时