我在 lambda 中设置了一个函数,该函数从 .zip 文件运行python脚本。我已经创建了virtualenv
,并将所有必需的程序包包含在 .zip 文件中(来自Lib\site-packages
文件夹)。
以下是脚本中使用的软件包的import语句:
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
或任何相关软件包。
答案 0 :(得分:3)
如果您的代码打包的依赖版本不正确,则AWS Lambda会抛出错误,这可能取决于操作系统(lambda在Linux上运行)和python版本。
根据您的要求,是熊猫抛出错误。要在lambda上运行熊猫,您需要包括以下软件包:
熊猫 -为linux编译的代码,这就是lambda运行的代码。您可以在这里https://pypi.org/project/pandas/#files找到它,下载与您的python lambda版本匹配的.whl文件的“ manylinux”版本。
例如如果您正在运行py3.7,则请获取pandas-0.25.3-cp37-cp37m-manylinux1_x86_64.whl
.whl文件的内容解压缩到lambda文件夹的根文件夹中。这是lambda所需的库版本
对于0.25+熊猫的注释,您还需要包含pytz软件包,请参见下面有关请求的注释
numpy -现在您可以通过在lambda控制台上安装“图层”来获取lambda(已针对py3.7进行了测试),请参见下面的屏幕截图。
关于请求的注释
请注意,此处https://pypi.org/project/requests/#files的软件包仅具有“无任何”版本,这意味着不需要编译源代码,因此可以安全地包含从pip获得的版本< / p>
这也适用于熊猫对pytz的依赖
在AWS控制台中安装层的屏幕截图
答案 1 :(得分:0)
由于numpy是用C编写的,因此您应该为Linux发行版构建它。我建议您使用serverless framework,因为当您使用Windows笔记本电脑时,它将大大简化您的生活。
安装serverless framework,并确保您拥有docker
转到项目的根目录并执行:
sls create --template aws-python
安装用于部署python应用程序的插件:
npm install serverless-python-requirements
在您的serverless.yml
文件中添加:
plugins:
- serverless-python-requirements
custom:
pythonRequirements:
dockerizePip: non-linux
确保调整lambda函数的路径
functions:
hello:
handler: handler.hello
使用正确的库进行部署
sls deploy