9

我在lambda中设置了一个函数,该函数从.zip文件运行 python 脚本。我已经创建了一个virtualenv并将所有必要的包包含在.zip文件中(来自Lib\site-packages文件夹)。

以下是脚本中使用的包的导入语句:

import requests
import boto3
import logging
import os
from botocore.exceptions import ClientError
from pprint import pprint
import pandas as pd
from datetime import datetime
import s3fs

当我尝试运行lambda 函数时,我收到以下错误:

START RequestId: e302cee0-3c51-453a-84c1-6eb1f9c123a0 Version: $LATEST
[ERROR] Runtime.ImportModuleError: Unable to import module 'export-dev': Unable to import required dependencies:
numpy: cannot import name 'WinDLL' from 'ctypes' (/var/lang/lib/python3.7/ctypes/__init__.py)
END RequestId: e302cee0-3c51-453a-84c1-6eb1f9c123a0
REPORT RequestId: e302cee0-3c51-453a-84c1-6eb1f9c123a0  Duration: 1.65 ms   Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 70 MB  

我没有在我的代码中明确使用ctypes,或任何相关的包。WinDLL

4

2 回答 2

5

如果您的代码未打包正确版本的依赖项,Aws lambda 将向您抛出错误,这可能取决于操作系统(lambda 在 linux 上运行)和 python 版本。

根据您的要求,熊猫会向您抛出错误。要在 lambda 上运行 pandas,您需要包含以下包:

pandas - 为 linux 编译的代码,这是 lambda 运行的。你可以在这里找到它https://pypi.org/project/pandas/#files下载 .whl 文件的“manylinux”版本,它与你的 python lambda 版本相匹配。

  • 例如,如果您正在运行 py3.7,则获取 pandas-0.25.3-cp37-cp37m-manylinux1_x86_64.whl

  • 将 .whl 文件的内容解压缩到 lambda 文件夹的根文件夹中。这是 lambda 需要的库版本

  • 对于 pandas 0.25+ 的注释,您还需要包含 pytz 包,请参阅下面的请求注释

numpy - 您现在可以通过 lambda 控制台安装“层”来进入 lambda(针对 py3.7 测试),请参见下面的屏幕截图。

关于请求的旁注

  • 注意这里的包https://pypi.org/project/requests/#files只有一个'none-any'版本,这意味着源不需要编译,所以你可以安全地包含你得到的版本从点子

  • 这也适用于 pandas 的 pytz 依赖

在 aws 控制台中安装层的屏幕截图

添加一个层 im lambda 选择图层

于 2020-01-15T12:04:37.740 回答
2

由于 numpy 是用 C 编写的,因此您应该为 linux 发行版构建它。我建议您使用无服务器框架,因为当您使用 Windows 笔记本电脑时,它将大大简化您的生活。

安装无服务器框架并确保您有docker

转到项目的根目录并执行:

sls create --template aws-python

安装用于部署 python 应用程序的插件:

serverless plugin install -n serverless-python-requirements

在您的serverless.yml文件中添加:

plugins:
   - serverless-python-requirements

custom:
  pythonRequirements:
     dockerizePip: non-linux

确保调整 lambda 函数的路径

functions:
  hello:
    handler: handler.hello

使用正确的库部署

sls deploy 
于 2019-12-04T13:30:11.740 回答