16

START RequestId:3d5691d9-ad79-4eed-a26c-5bc3f1a23a99 版本:$LATEST 无法导入模块“lambda_function”:没有名为“pandas”的模块
END RequestId:3d5691d9-ad79-4eed-a26c-5bc3f1a23a99

我使用 Windows 7 64 位作为主机操作系统。

我想做的事

我只是想在 AWS-Lambda 环境中使用 pandas。就像我在 windows 环境中使用它一样,我正在为 Lambda 寻找一个简单的解决方案。

到目前为止我尝试过的

  • 在虚拟盒子上安装了 Xubuntu。
  • myvenv在虚拟盒上创建一个名为 Xubuntu 的虚拟环境。
  • 然后我在myvenv.
  • 此后,我将文件夹内容复制myvenv'/usr/local/lib/python3.6/site-packages/'我的主机操作系统。
  • 在主机操作系统(Windows 7)中,我创建了一个名为 的文件夹packs,粘贴了myvenv.
  • 在主机操作系统(Windows 7)中创建了一个lambda_function.py脚本packs
  • 然后我使用 7zip 软件压缩文件夹并packs上传zipLambda
  • 在 Lambda 中,lambda 函数处理程序名称为lambda_handler(). 代码片段看起来像,

将熊猫导入为 pd

def lambda_handler(event, context):

    dates = pd.date_range('2019001', periods=6)

    df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
    print(df)
  • 处理程序被命名为lambda_function.lambda_handler. 我已授予 lambda-roleAWSLambdaFullAccess权限。
  • 超时设置为 4 分 3 秒。
  • 测试事件看起来像

    { "key1": "如果一切正常,这将被打印出来" }

我尝试了以下解决方案:

  • 从这里为 pandas 和 numpy 尝试了预编译的与 linux 兼容的二进制文件——没有运气。
  • 在 Lambda 中,将其更改Handler infopython_filename.function_name。就我而言,它是lambda_function.lambda_handler - failed with no module named 'pandas' error
  • 将 lambda 函数放在根文件夹中,使用 7zip 软件压缩文件夹并将文件夹上传到 S3 存储桶。就我而言,我将函数放置在 location python\lib\python3.6\site_packages\lambda_function.pyfailed with no module named 'pandas' error
  • 已经尝试过发布在 SO, 1 , 2 , 3 , 4 , 5 , 6上的这些相关解决方案

注意:我不想使用 Docker,因为我不知道如何使用它,我也不愿意学习它,因为我现在很生气。我来自 Windows 环境(这很糟糕,我现在知道了。

关于如何让它发挥作用的任何想法。

4

3 回答 3

18

我能够使用 Lambda 层和Amazon linuxCloud 9 实例成功导入 pandas 库。有我在 Cloud 9 实例中执行的命令和 Lambda 函数的输出。我不得不稍微更改代码,因为它因导入错误和字符串值错误而失败。

或者,这些命令也可以在 EC2 实例中执行。如果无法使用SAM CLI(使用 docker)或只是在 windows 上使用普通 docker,我们将需要使用Amazon Linux实例来构建所有内容,因为这就是AWS Lambda 当前使用的。我不相信使用 ubuntu 实例会在这里工作。

命令

python --version
Python 3.6.8

# https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html
# python 3.6 uses Amazon Linux currently 

mkdir project
cd project
virtualenv v-env
source ./v-env/bin/activate
pip install pandas
deactivate

# creating layer
# https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path
mkdir python
cd python
cp -r ../v-env/lib64/python3.6/dist-packages/* .
cd ..
zip -r panda_layer.zip python
aws lambda publish-layer-version --layer-name pandas --zip-file fileb://panda_layer.zip --compatible-runtimes python3.6 

publish-later-version命令将在命令中给定的区域或CLI的配置文件中创建一个新的AWS Lambda 层。

Lambda 层会将库应用于 Lambda 函数的代码,而无需将其直接应用于部署包。这也允许在 Lambda 中使用在线代码编辑器,因为部署包小于3MB 的限制

我通过单击 Web 控制台中的图层按钮并选择我最近发布的图层版本来应用 Lambda 图层。我在那里有第二个版本,因为我第一次尝试时将lib目录的内容放入不适用于 64 位操作系统的目录中,并且我的代码在 AWS Lambda 中失败。

lambda 网络控制台

或者,您也可以使用 CLI 命令update-function-configuration应用层

我使用的 Lambda 函数代码

import pandas as pd
import numpy as np

def lambda_handler(event, context):
    dates = pd.date_range(start='1/1/2018', end='1/08/2018')
    df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=list('ABCD'))
    print(str(df))


拉姆达输出

START RequestId: 27f09b6c-a4cd-49dd-bb3e-ae6fc7cd5850 Version: $LATEST
                   A         B         C         D
2018-01-01 -1.040318  0.450841 -0.381687 -0.105480
2018-01-02 -1.381793 -0.481572  0.828419 -0.885205
2018-01-03  1.437799 -0.649816 -0.577112  0.400670
2018-01-04 -0.730997 -0.778775 -1.514203  1.165661
2018-01-05  1.963595 -1.137054  0.920218  0.960210
2018-01-06 -0.429179 -0.745549  1.482562  0.298623
2018-01-07 -1.082388 -0.529476 -1.051663  1.616683
2018-01-08  0.042779 -2.338471 -0.142992  0.680399
END RequestId: 27f09b6c-a4cd-49dd-bb3e-ae6fc7cd5850
REPORT RequestId: 27f09b6c-a4cd-49dd-bb3e-ae6fc7cd5850  Duration: 536.76 ms Billed Duration: 600 ms Memory Size: 128 MB Max Memory Used: 122 MB Init Duration: 1721.51 ms   
XRAY TraceId: 1-5d741e40-1311daa29fc16c74735988fc   SegmentId: 61a595dd3492c331 Sampled: false  
于 2019-09-07T21:24:39.240 回答
0

对于图层方法,请确保上传的图层包(由 virtualenv 生成的站点包)的内容包含在名为 python 的文件夹/目录中。就像你解压缩包后它应该创建一个 python 命名目录并包含站点包的内容。

 cd venv/lib/python3.6
 mkdir python
 cp -r site-packages/* python
 zip layer.zip python

对于在同一个 zip 中具有依赖关系的方法,这种结构会有所不同。

于 2021-09-03T12:09:01.050 回答
0

我发现这个 github 存储库具有预构建的包 ARN。找到您想要的 AWS 区域,然后在创建层时选择“指定 ARN”,然后从这个 github 存储库中粘贴层 ARN:

https://github.com/keithrozario/Klayers

于 2022-02-09T19:03:45.387 回答