python - 无法导入模块“lambda_function”:没有名为 * 的模块
问题描述
我正在尝试运行一个使用附加包的 python lambda 函数。但是,每当我将 .zip 文件上传到 lambda 控制台时,我都会收到错误消息:
{
"errorMessage": "Unable to import module 'lambda_function': No module named '*'",
"errorType": "Runtime.ImportModuleError"
}
我按照以下说明操作:https ://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies它告诉我确保我的包位于我的 lambda 本地目录中功能:
~/my-function$ pip install --target ./package Pillow
我没有使用枕头。这是来自他们网站的示例代码。我也没有使用您已经可以在 Lambda 上访问的包。它是我从 github 获得的,需要附加到我的应用程序中。
起初这没有用,所以我创建了一个setup.cfg
文件并添加了:
[install]
prefix=
现在,当我使用pip
命令安装到目标时,它可以工作(并且还添加了我的包以外的其他文件夹的负载,但我认为它们是需要的,所以我把它们留在那里。
当我进入目录时,包就在那里。
然后我找到了这个答案:https ://stackoverflow.com/a/12493244/5675125这表明可能没有包含一些隐藏文件,这就是我应该如何压缩它们。
再次出现同样的错误。
如何让 lambda 识别出我的包裹在那里。
解决方案
如果您需要 Pillow,在您的函数中使用它的最简单方法是通过具有公共层(包括枕头)的流行存储库,例如github 上的keithrozario / Klayers 。要使用它,您将根据您的 region定位图层的 ARN 。python 3.8 的 ARN 列表在这里。
例如,us-east-1
为 Python 3.7 添加的层将是:
更新
我刚刚创建了自定义层,instabot
并且可以确认它可以正常工作。
使用的技术包括最近的AWS 博客中描述的docker 工具:
因此,对于这个问题,我验证 如下:
创建空文件夹,例如
mylayer
.转到文件夹并创建
requirements.txt
包含以下内容的文件
instabot
- 运行以下 docker 命令:
docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
- 删除 numpy
需求量instabot
很大numpy
。所以我们在创建图层之前手动删除它。我们将改用numpy
AWS 提供的层。
sudo rm -rvf ./python/lib/python3.8/site-packages/numpy*
如果我们不移除 numpy,层将 >50MB。
- 将图层创建为 zip:
zip -9 -r mylayer.zip python
mylayer.zip
在 AWS 控制台中创建 lambda 层。不要忘记指定Compatible runtimes
topython3.8
。向您的函数添加两层:
第一个是AWSLambda-Python38-SciPy1x
AWS 用 numpy 提供的,而第二个是我们在上面创建的。所以你的函数将使用两层。
- 使用以下 lambda 函数在 lambda 中测试层:
import json
from instabot import Bot
def lambda_handler(event, context):
# TODO implement
bot = Bot(base_path='/tmp')
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
推荐阅读
- image - Kubernetes 如何从外部存储库中提取图像?图像存储在哪里?
- fetch-api - 响应标头不适用于“重定向:手动”的获取请求
- sql - 存储过程如果存在则更新否则插入,如果匹配
- javascript - 如何将此导航栏从网页的左到右对齐?
- php - CakePHP 3.6.11:更新表中的值
- angular - 如何根据行数据使 ag-grid 的列宽响应?
- javascript - document.execCommand 从文本复制格式并粘贴格式
- multiline - 使用 pyparsing 解析多行文本
- spring - 无法在 Maven 项目中添加 springframe 工作
- java - 如何在scala中写入csv文件?