和我之前的许多其他人一样,我正在尝试运行AWS Lambda函数,当我尝试测试它时,我得到了
“errorMessage”:“无法导入模块'lambda_function'”
My Handler设置为lambda_function.lambda_handler,我确实有一个名为lambda_function.py的文件,其中包含一个名为lambda_handler的函数。这是一个截图作为证据:
当我在附带的IDE中编写内联代码片段时,一切都运行良好,但是当我用完所有的依赖项压缩我的完整程序并上传它时,我得到了上述错误。
我正在使用Numpy和Scipy软件包,它们非常庞大。我的压缩目录是34 MB,我的解压缩目录是122 MB。我认为这应该没问题,因为压缩目录的限制是50 MB。它似乎正在上传,因为我看到了消息:
Lambda函数“one-shot-image-classification”的部署包太大,无法启用内联代码编辑。但是,您现在仍然可以调用您的功能。
我已经看到一些帖子通过使用virtualenv来解决这个问题,但我对这项技术并不熟悉,而且我不确定如何正确使用它。
我也看到一些帖子说有时依赖关系有依赖关系,我可能需要包含这些,但我不知道如何找到它。
这是lambda_function.py的顶部,它应该足以看到我正在使用的库以及我确实有一个lambda_handler函数:
import os
import boto3
import numpy as np
from scipy.ndimage import imread
from scipy.spatial.distance import cdist
def lambda_handler(event, context):
s3 = boto3.resource('s3')
我还可以发布我的Lambda正在使用的策略角色,如果这可能是一个问题。
非常感谢任何见解!
更新:
这是我试过的一个解决方案:
1. git clone https://github.com/Miserlou/lambda-packages
2.在Documents中创建一个名为new_lambda的文件夹
3.将我的lambda_function.py和lambda-packages中的numpy文件夹复制到new_lambda,以及我根据文章使用Docker for AWS编译的scipy库:https://serverlesscode.com/post/scikitlearn-with-amazon-linux-container/
4.通过右键单击并选择“压缩”
我的结果:
无法导入模块'lambda_function':没有名为的模块 'lambda_function'
重申一下,我的文件名为lambda_function.py,并包含一个名为lambda_handler的函数,该函数接受两个参数(如上所示)。此信息与Handler中的信息相匹配,如上所述。
我正在使用Mac电脑,如果这很重要的话。
更新2
如果我按照上述步骤操作,而是通过直接选择要压缩的文件来压缩文件,然后右键单击并选择“压缩”,我会收到错误
无法导入模块'lambda_function':无法导入名称'show_config'
此外,预编译的lambda-packages表示它们是为“至少Python 2.7”编译的,但我的lambda运行时是3.6。这可能是一个问题吗?
答案 0 :(得分:5)
问题是你的本地numpy和pandas是为本地机器的架构编译的。由于AWS Lambda使用自定义Linux,因此它们可能不兼容。
因此,如果您想使用它们,您有两种选择:
编译使用相同Amazon Linux的EC2实例的依赖关系 版本为AWS Lambda并创建部署包。
使用here
P.S。我已经阅读了帖子上的评论,所以我看到文件和功能的名称是正确的,numpy给你带来了麻烦。
答案 1 :(得分:1)
解决方案是从this源代码中删除numpy和scipy预编译的包。
答案 2 :(得分:0)
我有一个类似的问题:
Unable to import module 'lib/lambda_function': No module named 'lib/lambda_function'
对我(可能对您)而言,解决方法是在与lambda_function.py相同的目录中包含一个空白的__init__.py
。
__init__.py
解决了该问题?我知道必须将目录(在我的情况下为lib,在您的情况下为。)视为有效的Python包。
以下是该假设基于的参考文档: 5.2.1. Regular packages - Python 3.7.3 documentation
答案 3 :(得分:0)
我也在MacOS上也遇到了这个问题。我看到您提到了选择文件的方式会影响文件是否正常运行。原来这是真的!
在Mac上,如果您的.DS_Store / MacOS隐藏文件夹潜入该目录,则似乎会破坏Lambda!
解决方案是
rm -rf .DS_Store
在部署zip文件夹中。
答案 4 :(得分:0)
我收到了同样的错误,但是错误原因不同。如果其他疲惫的StackOverflow流浪者觉得有帮助,请在此处添加答案。
就我而言,我试图上传以下目录,其中package是一个示例python程序包依赖项,而我的功能代码包含在lambda_function.py中:
我正在压缩整个function
目录,将其部署到lambda时会导致以下文件结构:
为了正常运行,lambda_function.py
和package
目录都应位于顶级lambda目录中。就我而言,ConfigureAppFlow
。 function
目录是导致错误的额外层。
要解决此问题,我没有压缩我的function
目录,而是直接压缩了其中的两项:
部署到lambda(忽略_MACOSX文件夹)时,将导致以下文件结构:
总而言之,我确定会导致此问题的原因有很多,但是首先要检查的是,您要正确上传到lambda的zip文件会导致文件结构中放置lambda_function.py
以及顶级lambda目录中的所有依赖包。