如何在 AWS Lambda 上使用 Grequests?

How do I use Grequests on AWS Lambda?

我在 Python 中有一个 Lambda 函数,它使用多个具有二进制依赖项的库:numpyscipyPillow 等。在过去,我已在 Amazon Linux 上成功编译它们并部署到 Lambda

不过,我最近将 Grequest 添加到一堆依赖项中,它抛出的错误似乎与 Grequest 没有直接关系。 在这个话题上已经进入了死胡同,所以我要公开发言。

第一个错误 是一个简单的 Grequests requires gevent 或类似的错误。为了解决这个问题,我在 Amazon Linux 实例上尝试 运行 pip install gevent --no-binary :all:,将其与我的代码捆绑在一起并上传到 Lambda。这对错误没有影响。

然后我从 gevent 仓库下载 src 并使用 make 编译它(仓库 README 中的命令抛出错误我没有记录)。这产生了一个 egg 文件,我将其转换为 whl 文件 & 运行 pip install gevent.whl -t ..

我将生成的代码与 lambda.zip 捆绑在一起并上传。这导致了 新错误module initialization error: lib/libptf77blas.a.gz: invalid ELF header

libptf77blas.a.gz 是我 lambda.ziplib 文件夹中的一个文件。此文件夹包含几个 .so.a 文件,这些文件是我在 AWS Linux 上构建的,同时组装 numpyscipyPillow

据我所知,这是 numpy 的依赖项。我不明白的部分是:我的函数使用了 numpy(大概 libptf77blas.a.gz 在添加 grequests 之前就好了。

所以我假设编译 gevent 破坏了我其他 binary 依赖库的依赖关系,或者 gevent 本身需要 libptf77blas.a.gz 并且对它的含义感到困惑发现。

我 运行 ldd.so 文件 gevent 依赖,但 none 引用 libptf77blas.a.gz。但是,我是一个编译新手,所以这很难定论。

我想实现并行上传Grequests,但不清楚如何解决这个问题,或者使用哪个替代库(我通常写JS,所以Python是第二个语)。

因为 have stated, you need to make sure the binaries for libev and other things, are compiled using the Amazon Linux Image. Basically, you need to install things like numpy, and Grequests on a machine running Amazon Linux 因为他们使用需要编译的 C 代码。

该问题中的 tutorial link 看起来非常适合从源代码构建东西,尽管比您需要的要多一些。

如果您是编译二进制文件的新手,您应该阅读一些关于 make 的内容,并查看一些示例,例如 building curl。由于您使用的是 Amazon Linux,它使用 yum,与 CentOS 非常相似。

可能能够在 CentOS 的 docker 映像上的 venv 中安装 numpy 和 Grequests 并从类似于教程,但我首先会使用亚马逊的图像启动 EC2 实例,并像教程那样在那里安装东西。

这个问题完全是一个不相关的愚蠢的用户错误——按照 OP 中的步骤操作,你应该没问题。

或者只使用 grequests I posted on github 的副本。它是在 Amazon Linux 实例上编译的 zip grequestsgeventgreenlet。它在我的 Lambda Function 中工作得很好。