和许多人一样,我正在尝试运行一个AWS Lambda函数,但在测试时出现了以下错误:
"errorMessage": "无法导入模块'lambda_function'"
我的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. 在文档中创建一个名为new_lambda的文件夹
3. 将我的lambda_function.py和来自lambda-packages的numpy文件夹以及我使用Docker为AWS编译的scipy库(根据文章:https://serverlesscode.com/post/scikitlearn-with-amazon-linux-container/)复制到new_lambda中
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。这可能会成为问题吗?
lambda_function.py
是否在部署的 ZIP 根目录中,而不是在One-Shot-Learning-Lambda
文件夹内。 - laikagit clean -xdf
(删除所有未受版本控制的文件)。否则请重新安装numpy。原始错误是:无法导入名称“multiarray”。 - Spencer Goff