无法在AWS Lambda中导入熊猫

时间:2019-08-17 09:18:08

标签: python-3.x pandas aws-lambda

我是AWS Lambda的新手,我想在Lambda上为机器学习API运行代码。总而言之,我想在Lambda上运行的功能是:读取一些csv文件以创建pandas dataFrame并在其中搜索;另一种功能是通过Flask应用程序的请求运行某些腌制的机器学习模型。为此,我需要导入与Amazon Linux兼容的pandas,joblib以及可能的scikit-learn。我正在使用Windows计算机。

通常,我会通过上传zip文件来使用Lambda的图层。当然,由于Lambda具有SciPy和Numpy的预构建层,因此我不会导入它们。如果导入它们,无论如何我将超过Lambda的图层限制。 更具体地说,我已经完成以下操作:

  • 下载并提取了上面列出的库的linux兼容版本。例如:从这个link,我下载了“ pandas-0.25.0-cp35-cp35m-manylinux1_x86_64.whl”并解压缩到一个文件夹中。
  • 解压缩的库位于以下目录中:

      

    lambda_layers \ python \ lib \ python3.7 \ site-packages

  • 将它们压缩到一个文件中,然后上传到S3存储桶以创建图层。

我导入了软件包:

import json
import boto3
import pandas as pd

我从Lambda收到以下错误:

  

{     “ errorMessage”:“无法导入模块'lambda_function':C扩展名:未构建名为'pandas._libs.tslibs.conversion'的模块。如果要从源目录导入pandas,则可能需要运行'python setup .py build_ext --inplace --force'首先构建C扩展。”,     “ errorType”:“ Runtime.ImportModuleError”   }

3 个答案:

答案 0 :(得分:1)

文件夹结构应该是标准的,您还可以使用Docker创建与Linux兼容的压缩库,并将其上传到AWS Lambda层中。下面是经过测试的命令,用于为AWS Lambda层创建压缩库:

  1. 创建并导航到目录:

    $mkdir aws1
    $cd aws1
    
  2. 在Dockerfile中编写以下命令并通过 CTRL + D 退出:

    $cat> Dockerfile
    
    FROM amazonlinux:2017.03  
    RUN yum -y install git \ 
        python36 \  
        python36-pip \  
        zip \  
        && yum clean all  
    RUN python3 -m pip install --upgrade pip \  
        && python3 -m pip install boto3
    
  3. 您可以为图像提供任何名称:

    $docker build -t pythn1/lambda .
    
  4. 运行图像:

    $docker run --rm -it -v ${PWD}:/var/task pythn1/lambda:latest bash  
    
  5. 在requirements.txt中指定要压缩的软件包,并通过 CTRL + D 退出:

    $ cat > requirements.txt
    pandas
    sklearn
    
  6. 您可以在此处尝试使用正确的文件结构(/python/lib/python3.6/site-packages/),但我尚未对其进行测试:

    $pip install -r requirements.txt -t /usr/lib/python3.6/dist-packages/ 
    
  7. 导航到以下目录:

    $cd var/task
    
  8. 创建一个zip文件:

    $ zip -r ./layers.zip /usr/lib/python3.6/dist-packages/  
    

您应该能够在aws1文件夹中看到layers.zip文件。如果在安装时提供正确的文件夹结构,则不需要以下步骤。但是,使用我使用的文件夹结构,需要以下命令:

  1. 解压缩layers.zip。
  2. 退出Docker或打开一个新终端,然后导航到解压缩文件的文件夹。解压缩的文件将位于文件夹结构/usr/lib/python3.6/dist-packages/中。

  3. 将这些文件复制到正确的文件夹结构中:

    $ cp -r ./python/lib/python3.6/site-packages/ /usr/lib/python3.6/dist-packages/
    
  4. 再次压缩它们:

    $ zip -r ./lib_python.zip ./python
    
  5. 将zip文件上传到图层,然后将该图层添加到Lambda函数中。另外,请确保在创建图层时选择正确的运行环境。

答案 1 :(得分:0)

在遵循本文档https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path之后,您应该为python层压缩python \ lib \ python3.7 \ site-packages \ pandas(和其他依赖项)文件夹。

确保将图层添加到函数中,并遵循文档中的正确权限。

答案 2 :(得分:0)

我很感谢给出的答案,只是在这里发布了我自己的答案(经过一整天的查找),以供参考。

我遵循了这个guide和这个guide

总而言之,我要做的步骤是:

  1. 通过ssh连接到我的Amazon EC2实例(在Linux上运行)。我
    想要在Beanstalk上部署应用程序,因此已经可以使用了 反正我
  2. 按照第一指南中的步骤安装python 3.7。 请按照第二本指南中的步骤安装库。之一 关键注意事项是不要与pip install -t一起安装,因为 会导致库和C扩展未构建。
  3. 将在python\lib\python3.7\site-packages\中找到的目录压缩为
    在这里的答案中提到(尽管我确实遵循了目录
    我的第一次尝试中的指南)
  4. 通过
    从EC2实例获取文件 FileZilla。
  5. 按照Lambda图层指南进行操作。