AWS Lambda中使用Pandas出现numpy错误

62

我一直在尝试在AWS Lambda中运行导入pandas的代码。这是我做的事情。 我有一个包含简单代码的Python文件(此文件具有lambda处理程序)

import json
print('Loading function')
import pandas as pd
def lambda_handler(event, context):
    return "Welcome to Pandas usage in AWS Lambda"
  1. 我将这个Python文件连同numpy、pandas和pytz库一起打包成部署包(在Amazon EC2 Linux机器上完成了所有操作)
  2. 然后将该包上传到S3
  3. 创建一个lambda函数(运行时=python3.6),并从S3上传部署包

但是当我在AWS Lambda中测试lambda函数时,出现以下错误:

Unable to import module 'lambda_function': Missing required dependencies ['numpy']

我已经在压缩包中有NumPy,但仍然出现此错误。我尝试按照Pandas & AWS Lambda中给出的提示进行操作,但没有成功。

有人遇到了同样的问题吗?非常感谢任何提示或建议解决这个问题。

谢谢!


哇,我不知道这么容易(我一直在使用纯Python编写自己的类似Pandas的助手程序来运行AWS Lambda)。 - Andy Hayden
2
你在那个亚马逊Linux机器上编译了pandas、numpy等吗?因为你需要在那里编译它们,而不仅仅是压缩。 - Adam Owczarczyk
我已经写了一篇关于这个的博客文章,并且使用了预编译的Numpy库进行了测试。https://medium.com/the-python-backend/hassle-free-python-lambda-deployment-tutorial-script-9c65bcf47e26 - joarleymoraes
1
可能是Pandas&AWS Lambda的重复问题。 - Adam Owczarczyk
1
对于未来的读者:很多人似乎导入pandas或numpy来执行微不足道的列表转换,而没有意识到这些库有多么庞大和过度。通常情况下,您可以完全避免使用它们,并使用Python自带的列表功能。这是在AWS Lambda中更好的选择。 - jarmod
显示剩余2条评论
23个回答

14

要在Lambda中包含numpy,请按照AWS文档中此页面上的说明进行操作...

如何将带有编译二进制文件的Python包添加到部署包并使其与AWS Lambda兼容?

以下是使用numpy作为示例的指令概述:

  1. 打开pypi.org上的模块页面。 https://pypi.org/project/numpy/
  2. 选择下载文件。

  3. 下载:

对于Python 2.7,module-name-version-cp27-cp27mu-manylinux1_x86_64.whl

例如 numpy-1.15.2-cp27-cp27m-manylinux1_x86_64.whl

对于Python 3.6,module-name-version-cp36-cp36m-manylinux1_x86_64.whl

例如 numpy-1.15.2-cp36-cp36m-manylinux1_x86_64.whl

  1. 在/path/to/project-dir文件夹上解压缩wheel文件。 您可以在命令行上使用unzip命令来完成此操作。当然还有其他方法。

unzip numpy-1.15.2-cp36-cp36m-manylinux1_x86_64.whl

当wheel文件被解压缩时,您的部署包将与Lambda兼容。

希望这一切都说得清楚明白;)

最终结果可能看起来像这样。 注意:不应将whl文件包含在部署包中。

What it might look like


2
我遇到了同样的问题,当我像这样复制numpy时,pandas会出现以下错误- C扩展:找不到名为'pandas._libs.tslibs.conversion'的模块。如果您想从源目录导入pandas,则可能需要先运行“python setup.py build_ext --inplace --force”来构建C扩展。-- 你有什么想法吗? - Dimuthu
1
我按照这个教程一步一步地操作,但是并没有成功:https://aws.amazon.com/premiumsupport/knowledge-center/lambda-python-package-compatible/。所以我也按照AWS官方的教程操作,但是又遇到了同样的问题:https://aws.amazon.com/premiumsupport/knowledge-center/lambda-python-package-compatible/。我不知道该怎么办了。有什么建议吗?我正在使用Mac OS。 - rfschroeder
1
这对我很有用!我一直在AWS Lambda中使用Python3.7运行时环境,而不是其他人似乎都在使用的Python3.6。无论如何,我只需下载numpy cp37-cp37m-manylinux_x86_64.whl,然后解压缩它,然后我就有了一个带有我的lambda_function.pynumpy目录和numpy.dist-info目录的zip文件!上传,然后就完成了!不需要通过EC2进行安装,也不需要docker。简单明了,正合我意! - Corey Levinson
@Dimuthu 有什么解决方案吗?我也遇到了同样的问题。 - FrankyBravo

12

经过大量的研究,我成功地使用Lambda层实现了它。

创建或打开一个干净的目录,并按照以下步骤进行:

先决条件:确保您已启动并运行Docker

  1. 创建一个包含以下内容的requirements.txt文件:
pandas==0.23.4
pytz==2018.7
  1. 创建一个get_layer_packages.sh文件并添加以下内容:
#!/bin/bash

export PKG_DIR="python"

rm -rf ${PKG_DIR} && mkdir -p ${PKG_DIR}

docker run --rm -v $(pwd):/foo -w /foo lambci/lambda:build-python3.6 \
    pip install -r requirements.txt --no-deps -t ${PKG_DIR}
在同一目录下运行以下命令:
chmod +x get_layer_packages.sh

./get_layer_packages.sh

zip -r pandas.zip .
  1. 将该层上传到S3存储桶中。

  2. 通过运行以下命令将该层上传至AWS:

aws lambda publish-layer-version --layer-name pandas-layer --description "Description of your layer"
--content S3Bucket=<bucket name>,S3Key=<layer-name>.zip
--compatible-runtimes python3.6 python3.7
  1. 前往Lambda控制台,将您的代码作为zip文件上传或使用内联编辑器。

  2. 单击“层”>“添加层”>从兼容层中搜索层(pandas-layer)并选择版本。

  3. 还需添加AWSLambda-Python36-SciPy1x层,该层默认可用于导入numpy。

从控制台中选择层

  1. 测试代码。现在应该可以正常工作了!

感谢此篇中等文章https://medium.com/@qtangs/creating-new-aws-lambda-layer-for-python-pandas-library-348b126e9f3e


在requirements.txt文件中,你需要指定版本吗? - undefined

12

编辑:我最终找到了在AWS Lambda Python 3.6运行时环境中运行pandas和numpy的方法。

我已将我的部署包上传到以下存储库:

git clone https://github.com/pbegle/aws-lambda-py3.6-pandas-numpy.git

只需运行以下命令将您的lambda_function.py添加到zip文件中:

zip -ur lambda.zip lambda_function.py

上传到S3并源到Lambda。

原始内容:

我成功让Pandas在Lambda函数中工作的唯一方法是在AWS Linux EC2实例上编译pandas(和numpy)库,按照此博客文章中的步骤,并为我的Lambda函数使用Python 2.7运行时。


2
如果有人找到了解决方法,我很想知道如何在Python 3.6运行时环境中完成它! - 0xPeter
你能否解释一下你是如何做到的?我希望能够将其扩展到其他包中。谢谢! - kd88
2
我写了一篇关于如何做到这一点的博客文章。请查看: https://medium.com/i-like-big-data-and-i-cannot-lie/how-to-create-an-aws-lambda-python-3-6-deployment-package-using-docker-d0e847207dd6 - 0xPeter
我现在遇到了一个类似的问题。只需将此存储库中的所有子文件夹取出并与我尝试上传的Lambda一起使用即可解决该问题。这也可以起到作用。 - guyts

8

AWS Lambda使用Amazon Linux操作系统。想法是下载与Amazon Linux兼容的PandasNumPy。您使用pip下载的内容是特定于Windows或Mac的。您需要下载适用于Linux的兼容版本,以便您的Lambda函数可以理解它。这些文件称为wheel文件。

创建一个新的本地目录,并在其中放置lambda_function.py文件。使用pip将Pandas安装到本地目录中:

$ pip install -t . pandas

导航至https://pypi.org/project/pandas/#files。搜索并下载最新的*manylinux1_x86_64.whl包。在我的情况下,我正在我的Lambda函数上使用Python 3.6,因此我下载了以下内容:

将 whl 文件下载到包含 lambda_function.py 的目录中。删除 pandasnumpy*.dist-info 目录。解压缩 whl 文件。

$ rm -r pandas numpy *.dist-info
$ unzip numpy-1.16.1-cp36-cp36m-manylinux1_x86_64.whl
$ unzip pandas-0.24.1-cp36-cp36m-manylinux1_x86_64.whl

删除whl文件、*.dist-info__pycache__。准备zip.zip归档:

$ rm -r *.whl *.dist-info __pycache__
$ zip -r zip.zip .

在Lambda函数中上传zip.zip文件。

enter image description here

来源:https://medium.com/@korniichuk/lambda-with-pandas-fd81aa2ff25e


3
主要问题在于在特定操作系统内编译的库只能在该操作系统上运行。因此,如果库是在macOS中编译的,则无法在Linux环境中运行。为什么这是个问题呢?
Pandas的一个依赖项是Numpy(由于速度而编译,请参见stackoverflow上的此答案)。AWS Lambda使用Linux,因此,如果Numpy编译是在macOS或Windows中完成的,则编译只适用于这些特定架构,并且在AWS内部不起作用。我认为那些使用Linux的人不会遇到这个问题。
为了解决这个问题并创建一个可工作的AWS Lambda层用于Pandas,请按照以下简单步骤操作(请参见亚马逊论坛上的一般步骤):
mkdir awsPandasLayer #create a directory
cd awsPandasLayer #cd into the directory
pip3 install -t . Pandas #install pandas and all its dependencies 
rm -r pandas numpy *.dist-info __pycache__ #clean up the environment to remove the incompatible numpy and pandas

然后将PandasNumpy的最新预编译包下载到先前创建的awsPandasLayer目录中。对于我的情况,由于我使用的是Python 3.7,我下载了这些版本的PandasNumpy。请注意,cp37表示Python版本,如网站上明确说明的那样。然后按以下方式完成安装:

unzip pandas-1.0.5-cp37-cp37m-manylinux1_x86_64.whl #unzip the pandas precompiled package
unzip numpy-1.18.5-cp37-cp37m-manylinux1_x86_64.whl #unzip the numpy precompiled package
pip3 install -t . openpyxl #I found this is required within AWS Lambda for excel files
rm -r *.whl *.dist-info __pycache__ #clean up unneeded files
zip -r awsPandasLayer.zip . # zip all the files

然后将zip文件上传为AWS Lambda层,它应该可以工作。请注意,我使用的是macOS。


2
为了在Lambda中获取额外的库,我们需要在Amazon Linux上对它们进行编译(如果底层库基于C或C++,如Numpy,则这一点非常重要),并将它们打包到ZIP文件中,与您想在Lambda中运行的Python脚本一起使用。
要获取Amazon Linux编译版本的库。您可以找到已经编译好的版本,例如@pbegle编译的版本,或者自己编译。要自己编译有两个选项: - 在EC2实例上编译库 https://streetdatascience.com/2016/11/24/using-numpy-and-pandas-on-aws-lambda/ - 在Lambda环境的Docker版本上编译库 https://serverlesscode.com/post/scikitlearn-with-amazon-linux-container/ 按照上面博客文章中的说明和添加以下内容,可以使Docker的最后一个选项起作用:
pip install --use-wheel pandas

在编译库的脚本中: https://github.com/ryansb/sklearn-build-lambda/blob/master/build.sh#L21

1
我已经尝试过了,但生成的压缩文件大约有55MB。有任何更新吗? - Emanuele Righetto

1

使用这些答案和 SO 55695187 中的想法,我构建了一个包含 pandas 的 AWS Lambda 层,并将其放在了 github 上。它包含 Python 3.8 的 pandas v1.3.1。请访问 https://github.com/eoneil1942/pandas。我所做的是:

Created an ec2 instance for AWS Linux
Installed python3.8, pip3, used pip3 to install pandas
Made an empty directory python/lib/python3.8/site-packages
Copied pandas and pytz from installed site-packages to this one
zip -r pandas.zip python

显然,这适用于任何Python包。


1

以下方法适用于我:

  1. 仅在lambda代码中导入库(不将库推送到.zip文件):

    from scipy.stats import norm

    import pandas as pd

    ...

  2. 然后在lambda控制台中,使用ARN选项添加层:

    Scipy-numpy: arn:aws:lambda:us-east-1:668099181075:layer:AWSLambda-Python38-SciPy1x:29

    Pandas: arn:aws:lambda:us-east-1:770693421928:layer:Klayers-python38-pandas:42

  3. 测试您的lambda。


1

考虑使用 AWS Layer。在2022年12月11日,我使用Python3.9和架构x86_64的运行时成功地使用了它。

希望这能为您节省我花费的时间 :)


1

稍微重复了一下 在 AWS Lambda 中使用 NodeJS 找不到 MySQL

您需要将库与 Lambda 打包。由于 Lambda 在公共云上运行,因此无法进行配置。

现在在您的情况下,由于您正在使用 pandas,因此您需要将 Pandas 与您的 zip 包一起打包。获取 pandas 的路径(例如:/Users/dummyUser/anaconda/lib/python3.6/site-packages)并将库复制到您的 lambda 函数代码所在的位置。在您的代码中,从本地副本引用 pandas。上传时,将整个集合(代码+库)压缩,并按您的意愿上传。它应该可以工作。


这就是我所做的,但仍有缺失。 - WJA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接