我一直在尝试在导入pandas的AWS Lambda中运行我的代码。所以这就是我所做的。 我有一个python文件,其中包含一个简单的代码,如下所示(此文件具有lambda处理程序)
import json
print('Loading function')
import pandas as pd
def lambda_handler(event, context):
return "Welcome to Pandas usage in AWS Lambda"
但是当我在AWS Lambda中测试lambda函数时,我得到以下错误:
Unable to import module 'lambda_function': Missing required dependencies ['numpy']
我在压缩包中已经有了numpy,但我仍然收到此错误。我试着按照Pandas & AWS Lambda给出的提示,但没有运气。
有没有人遇到过同样的问题。非常感谢任何提示或建议来解决这个问题。
由于
答案 0 :(得分:7)
我已将部署包上传到以下仓库:
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。
ORIGINAL:
我让Pandas在lambda函数中工作的唯一方法是按照this blog post中的步骤编译AWS Linux EC2实例中的pandas(和numpy)库,然后使用python 2.7运行时为我的lambda函数。
答案 1 :(得分:3)
要在您的lambda zip中包括numpy,请遵循AWS文档中此页面上的说明...
以numpy为例来解释说明:
选择下载文件。
下载:
对于Python 2.7,模块名称版本-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
unzip numpy-1.15.2-cp36-cp36m-manylinux1_x86_64.whl
未压缩wheel文件时,您的部署包将与Lambda兼容。
希望这一切都说得通;)
最终结果可能看起来像这样。 注意:请勿在部署包中包含whl文件。
答案 2 :(得分:2)
要在Lambda中获取其他库,我们需要在Amazon Linux上编译它们(如果底层库基于C或C ++,如Numpy那么这很重要)并将它们与您想要的python脚本一起打包到ZIP文件中在Lambda运行。
获取Amazon Linux编译版本的库。您可以找到某个已经编译过的版本,例如@pbegle编译的版本,也可以自己编译。要自己编译,有两种选择: - 在EC2实例https://streetdatascience.com/2016/11/24/using-numpy-and-pandas-on-aws-lambda/上编译库 - 在Docker版本的Lambda环境中编译库 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
答案 3 :(得分:2)
经过大量研究,我能够使其与Lambda图层一起使用。
创建或打开干净目录,然后执行以下步骤:
先决条件:确保已启动并运行Docker
pandas==0.23.4 pytz==2018.7
#!/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 .
将图层上传到S3存储桶。
通过运行以下命令将层上传到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
转到Lambda控制台并以zip文件形式上传代码或使用内联编辑器。
单击“图层”>“添加图层”>从“兼容”图层中搜索该图层(pandas图层),然后选择版本。
还添加了AWSLambda-Python36-SciPy1x层,默认情况下该层可用于导入numpy。
Selecting the layer from the console
感谢这篇中篇文章https://medium.com/@qtangs/creating-new-aws-lambda-layer-for-python-pandas-library-348b126e9f3e
答案 4 :(得分:1)
略微复制Cannot find MySQL in NodeJS using AWS Lambda
您需要使用Lambda打包库。由于lambda在公共云上运行,因此无法对其进行配置。
现在在你的情况下,当你使用熊猫时,你需要用你的拉链包装Pandas。获取pandas的路径(例如:/Users/dummyUser/anaconda/lib/python3.6/site-packages)并将库复制到您拥有lambda函数代码的位置。在您的代码中,请参阅本地副本中的pandas。上传时,压缩整套(代码+库),然后上传。它应该工作。
答案 5 :(得分:1)
AWS Lambda use Amazon Linux操作系统。想法是与Pandas兼容的下载NumPy和Amazon Linux。使用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,因此我下载了以下代码:
使用lambda_function.py
将whl文件下载到目录。删除pandas
,numpy
和*.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
删除所有文件*.dist-info
和__pycache__
。准备zip.zip
存档:
$ rm -r *.whl *.dist-info __pycache__
$ zip -r zip.zip .
在您的Lambda函数中上传zip.zip
文件。
来源:https://medium.com/@korniichuk/lambda-with-pandas-fd81aa2ff25e
答案 6 :(得分:1)
我在这里尝试了一些解决方案,但大多数都没有用。我喜欢@Ranadeep Guha提出的创建contaienr并在那儿下载存储库的想法,这就是我所做的。
我在lambda函数所在的目录中工作,并创建了以下文件:
Dockerfile:
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt -t /app
requirements.txt :(那些是我的)
pandas
numpy
xmltodict
现在在我的gitbash中,我运行以下命令,该命令将为我生成安装了所有依赖项的docker映像: docker build -t image_name。
Sending build context to Docker daemon 5.632kB
Step 1/4 : FROM python:3.8-slim
---> 56930ef6f6a2
Step 2/4 : WORKDIR /app
---> Using cache
---> ea0bf539bcad
Step 3/4 : COPY requirements.txt ./
---> cb4c005f53cc
Step 4/4 : RUN pip install --no-cache-dir -r requirements.txt -t /app
---> Running in a0d179a372b4
Collecting pandas
Downloading pandas-1.0.3-cp38-cp38-manylinux1_x86_64.whl (10.0 MB)
Collecting numpy
Downloading numpy-1.18.3-cp38-cp38-manylinux1_x86_64.whl (20.6 MB)
Collecting xmltodict
Downloading xmltodict-0.12.0-py2.py3-none-any.whl (9.2 kB)
Collecting pytz>=2017.2
Downloading pytz-2020.1-py2.py3-none-any.whl (510 kB)
Collecting python-dateutil>=2.6.1
Downloading python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB)
Collecting six>=1.5
Downloading six-1.14.0-py2.py3-none-any.whl (10 kB)
Installing collected packages: numpy, pytz, six, python-dateutil, pandas, xmltodict
Successfully installed numpy-1.18.3 pandas-1.0.3 python-dateutil-2.8.1 pytz-2020.1 six-1.14.0 xmltodict-0.12.0
现在只需创建该映像的docker容器并确认已安装所有内容:
winpty docker run --name container_name -it --entrypoint bash image_name
输入ls,您将看到所有安装。
现在,将所有安装复制到本地PC上: 您可以将点替换为PC上的任何位置
docker cp container_id:/app/* .
答案 7 :(得分:1)
主要问题是,在特定操作系统中编译的库仅适用于该操作系统。因此,如果库是在macOS内编译的,则它将无法在Linux环境中运行。为什么这是个问题?
Pandas的依赖项之一是Numpy(由于速度see this answer on stackoverflow而被编译)。 AWS Lambda使用Linux,因此,如果Numpy编译是在macOS或Windows中完成的,则该编译仅适用于那些特定的体系结构,而无法在AWS中运行。我认为那些使用Linux的人不会遇到此问题。
要解决此问题并为Pandas创建可用的AWS Lambda层,请执行以下简单步骤(see the general steps on amazon forum):
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
然后将Pandas和Numpy的最新预编译软件包下载到先前创建的awsPandasLayer目录中。就我而言,由于我使用的是Python 3.7,因此我下载了这些版本的Pandas和Numpy。注意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。
答案 8 :(得分:1)
使用这些答案和 SO 55695187 中的想法,我为包含熊猫的 AWS Lambda 构建了一个层,并在 github 上提供。它有适用于 Python 3.8 的 pandas v 1.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 包。
答案 9 :(得分:0)
在尝试使用python3.6引擎时,我一直在努力解决类似的错误。当我切换到2.7时,它对我来说很好。我使用Amazon AMI创建我的zip文件,但它只有python3.5,而不是3.6。我猜版本不匹配的原因。但这只是一个猜测,我还没有在python3.6安装上尝试过这个过程。
答案 10 :(得分:0)
这类似于Randeep的答案,但是如果您不想这样做,则不需要使用Lambda图层。
正如其他人所述,这是行不通的,因为pandas / numpy需要构建二进制文件,并且您的构建机器的操作系统(Linux,Mac,Windows)与Lambda的操作系统(Amazon Linux)不匹配。 / p>
要解决此问题,您可以使用docker下载/构建您的依赖项并将其打包在Amazon Linux上。 Amazon为此提供了一个Docker映像。有关如何为Python 3.6运行时构建python包的信息,请参见下文(它们为所有其他运行时提供了其他docker):
将所有依赖项放入requirements.txt
文件中,例如:
openpyxl
boto3
pandas
创建一个脚本(即名为build.sh
)来构建您的程序包,这就是我的样子:
#!/bin/bash
# remove old build artifacts
rm -rf build
rm lambda_package.zip
# make build dir and copy my lambda handler file into it
mkdir build
cp lambda_daily_util_gen.py build/
# Use requirements file to download/build dependencies into the build folder
cd build
pip install -r ../requirements.txt --target .
# Create an lambda package with my files and all dependencies
zip -r9 ../lambda_package.zip .
确保已拉出Amazon Linux lambda构建映像:
$ docker pull lambci/lambda
在docker容器中运行构建脚本:
Mac / Linux:
$ docker run --rm -v "$PWD":/var/task lambci/lambda:build-python3.6 /var/task/build.sh
Windows:
docker run --rm -v ${PWD}:/var/task lambci/lambda:build-python3.6 chmod +x build.sh;./build.sh
现在您应该看到一个名为lambda_package.zip
的文件,该文件建立在Amazon Linux上,可以上传到AWS。
希望有帮助。
答案 11 :(得分:0)
借助serverless framework,您可以轻松地正确打包和部署依赖项。
您只需要;
安装无服务器
[US 2!]
在项目的根目录中使用以下命令创建一个serverless.yml:
npm install -g serverless
调整路径/到/function.lambda_handler
确保docker正在运行并执行
service: numpy-test
# define the environment of your lambda
provider:
name: aws
runtime: python3.6
# specify the function you want to deploy
functions:
numpy:
# path to your lambda_handler function
handler: path/to/function.lambda_handler
# add a plugin that allows serverless to package python libraries
# specified in the requirements.txt or Pipfile
plugins:
- serverless-python-requirements
# this section makes sure your libraries get build correctly
# for an aws lambda environment
custom:
pythonRequirements:
dockerizePip: non-linux
部署完成后,转到AWS控制台查找功能 numpy-test-dev-numpy 并测试您的功能。
this article详细说明了必要的步骤。
答案 12 :(得分:0)
也许您正在使用的模块适用于python 2.7。
尝试为python 3.x安装pandas模块
即
pip3安装pandas -t。
对我有用。
或为了获得即时结果,将运行时更改为python 2.7 (不推荐)
答案 13 :(得分:0)
要制作与 Lambda 兼容的部署包,请下载一个名为 Wheel (.whl) 的预编译包。解压缩 /path/to/project-dir 上的轮文件 而不是使用 pip install。
分辨率
打开您的模块名称 pypi.org 页面。例如: https://pypi.org/project/numpy/
选择下载文件。
下载:
对于 Python 2.7,模块名称-版本-cp27-cp27mu-manylinux1_x86_64.whl 对于 Python 3.6,module-name-version-cp36-cp36m-manylinux1_x86_64.whl 4.解压/path/to/project-dir文件夹下的wheel文件。
wheel 文件解压后,您的部署包将与 Lambda 兼容。