AWS Lambda - 无法导入模块'lambda_function'

时间:2018-04-09 13:56:23

标签: python amazon-web-services aws-lambda

和我之前的许多其他人一样,我正在尝试运行AWS Lambda函数,当我尝试测试它时,我得到了

  

“errorMessage”:“无法导入模块'lambda_function'”

My Handler设置为lambda_function.lambda_handler,我确实有一个名为lambda_function.py的文件,其中包含一个名为lambda_handler的函数。这是一个截图作为证据: enter image description here

当我在附带的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')

这是我正在上传的目录的解压缩版本的屏幕截图: enter image description here

我还可以发布我的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.通过右键单击并选择“压缩”

来压缩new_lambda文件夹

我的结果:

  

无法导入模块'lambda_function':没有名为的模块   'lambda_function'

重申一下,我的文件名为lambda_function.py,并包含一个名为lambda_handler的函数,该函数接受两个参数(如上所示)。此信息与Handler中的信息相匹配,如上所述。

我正在使用Mac电脑,如果这很重要的话。

更新2

如果我按照上述步骤操作,而是通过直接选择要压缩的文件来压缩文件,然后右键单击并选择“压缩”,我会收到错误

  

无法导入模块'lambda_function':无法导入名称'show_config'

此外,预编译的lambda-packages表示它们是为“至少Python 2.7”编译的,但我的lambda运行时是3.6。这可能是一个问题吗?

5 个答案:

答案 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中: enter image description here

我正在压缩整个function目录,将其部署到lambda时会导致以下文件结构: enter image description here

为了正常运行,lambda_function.pypackage目录都应位于顶级lambda目录中。就我而言,ConfigureAppFlowfunction目录是导致错误的额外层。

要解决此问题,我没有压缩我的function目录,而是直接压缩了其中的两项:enter image description here

部署到lambda(忽略_MACOSX文件夹)时,将导致以下文件结构:enter image description here

总而言之,我确定会导致此问题的原因有很多,但是首先要检查的是,您要正确上传到lambda的zip文件会导致文件结构中放置lambda_function.py以及顶级lambda目录中的所有依赖包。