是否可以在AWS Lambda环境中正确指向Python Shapely库的LIBGEOS_C?

时间:2016-12-15 04:28:52

标签: python amazon-web-services lambda shapely serverless-framework

我正在尝试编写一个AWS python Lambda函数,该函数利用Shapely进行简单的“多边形点”操作。我创建了一个AWS linux EC2实例,安装了Shapely并且有一个工作脚本。然后我从我的EC2实例下载了linux特定的libgeos_c.so.1二进制文件,并将其捆绑(通过无服务器框架)与我的lambda函数存在于同一目录中。但是,一旦我部署脚本将无法执行,因为它会抛出“无法找到库或加载其任何变体...”错误。我甚至试图通过GEOS_LIBRARY_PATH环境变量明确指向libgeos_c.so.1路径无效。这是不可能的部署吗?

这是一个代码片段,用于设置环境变量,然后调用实际导入和利用的辅助脚本。

import sys
import os
import subprocess

here = os.path.dirname(os.path.realpath(__file__))

# Import installed packages (in site-packages)
site_pkgs = os.path.join(here, "venv", "lib", "python2.7", "site-packages") 
sys.path.append(site_pkgs)
import json

def hello(event, context):

    command = "GEOS_LIBRARY_PATH={} python test_geo_worker.py".format(here + "/libgeos_c.so.1")
    foo = subprocess.check_output(command, shell=True)
    print foo

是否有人都成功地在lambda中部署过?我的后备计划是回到好的旧postgres / postgis而不是匀称,但我肯定想尝试在dynamo / lambda堆栈中构建它。

4 个答案:

答案 0 :(得分:0)

有可能。 尝试按照这些步骤操作,看看问题是否仍然存在。

首先,安装GEOS:

yum install geos-devel.x86_64

然后Shapely:

pip2.7 install shapely

尝试导入Shapely:

python2.7 -c "import shapely"

答案 1 :(得分:0)

当我遇到这个问题并设法找到解决方案时,我想我会在这里发布。

问题是他在Lambda中不存在必要的编译库,如果你包含由其他Linux编译的库,除非它们是用相同的编译器构建的,并且依赖性不起作用。

值得庆幸的是,一个好的小伙子已经找到了Lambda中未包含的各种Python模块的依赖关系和构建包,包括形状。

https://github.com/ryfeus/lambda-packs

从那里下载相关模块并将其复制到部署包中(预先删除通过pip安装的任何模块)。

答案 2 :(得分:0)

我设置了一个生成脚本,该脚本将生成Shapely依赖项作为Lambda层。您可以在https://github.com/bearflagrobotics/libgeos-lambda-build处查看我的项目 但基本上,它只是使用Amazon映像来下载和构建Shapely的C ++依赖关系,以便在Lambda中使用。只需将zip文件作为一个层放置,然后运行任何版本的Python / Shapely

答案 3 :(得分:0)

我设法使用https://hub.docker.com/r/lambci/lambda/tags上的图像来使其运行

请确保使用正确的标签抓取图像: 例如python3.7

您可以直接从该容器中运行一个容器并编译您的库并在该环境中推送,也可以按照here的说明来构建自己的docker映像并自动安装软件包,创建ZIP和您的代码,然后将ZIP文件上传到lambda / s3。