Pab*_*blo 9 python lambda numpy python-3.x boto3
我在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
Run Code Online (Sandbox Code Playgroud)
当我尝试运行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
Run Code Online (Sandbox Code Playgroud)
我没有在我的代码中明确使用ctypes,WinDLL或任何相关的包。
如果您的代码中没有打包正确版本的依赖项,AWS lambda 将会抛出错误,这可能取决于操作系统(lambda 在 Linux 上运行)和 python 版本。
根据您的要求,这是 pandas 向您抛出错误。要在 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 控制台中安装图层的屏幕截图
由于 numpy 是用 C 语言编写的,因此您应该为 Linux 发行版构建它。我建议您使用无服务器框架,因为当您使用 Windows 笔记本电脑时,它会大大简化您的生活。
安装Serverless 框架并确保有docker
转到项目的根目录并执行:
sls create --template aws-python
Run Code Online (Sandbox Code Playgroud)
安装用于部署 python 应用程序的插件:
serverless plugin install -n serverless-python-requirements
Run Code Online (Sandbox Code Playgroud)
在你的serverless.yml文件中添加:
plugins:
- serverless-python-requirements
custom:
pythonRequirements:
dockerizePip: non-linux
Run Code Online (Sandbox Code Playgroud)
确保调整 lambda 函数的路径
functions:
hello:
handler: handler.hello
Run Code Online (Sandbox Code Playgroud)
使用正确的库进行部署
sls deploy
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4936 次 |
| 最近记录: |