无法导入模块 'lambda_function':没有名为 'pandas' 的模块

Unable to import module 'lambda_function': No module named 'pandas'

START RequestId: 3d5691d9-ad79-4eed-a26c-5bc3f1a23a99 Version: $LATEST Unable to import module 'lambda_function': No module named 'pandas'
END RequestId: 3d5691d9-ad79-4eed-a26c-5bc3f1a23a99

我正在使用 Windows 7 64 位作为主机 OS。

我想做什么

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

到目前为止我尝试了什么

import pandas as 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)

我尝试了以下解决方案:

注意:我不想用Docker,因为我不会用,也不愿意学,气死我了。我来自 windows 环境(它糟透了,我现在知道了。

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

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

或者,这些命令也可以在 EC2 实例中执行。如果无法使用SAM CLI(which uses docker) or just plain docker on windows we'll need to use an Amazon Linux instance to build everything since that's what AWS Lambda uses currently。我不相信使用 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 

CLI 的 publish-later-version command will create a new AWS Lambda layer in the region given in the command or the config file

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

我通过单击 Web 控制台中的层按钮并选择我最近发布的层版本来应用 Lambda 层。我在那里有第二个版本,因为我第一次尝试这样做是将 lib 目录的内容放入不适用于 64 位 OS 并且我的代码在 AWS 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))


Lambda 输出:

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  

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

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

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

我发现这个 github 存储库有 pre-built 个包 ARN。为您的 AWS 区域找到您想要的那个,然后在创建层时选择“指定 ARN”并粘贴来自此 github 存储库的层 ARN:

https://github.com/keithrozario/Klayers