无法导入模块“ lambda_function”:没有名为*的模块

时间:2020-10-12 00:33:24

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

我正在尝试运行使用其他软件包的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识别我的包裹在那里。

1 个答案:

答案 0 :(得分:1)

如果您需要Pillow,则在功能中使用它的最简单方法是通过具有公用层(包括枕头)的流行存储库,例如github上的keithrozario / Klayers。要使用它,您将根据您所在的区域找到图层的ARN 。 python 3.8的ARN列表为here

例如,对于us-east-1,为Python 3.7添加的层为:

enter image description here

更新

我刚刚使用instabot创建了自定义图层,并可以确认它是否有效。

所使用的技术包括最近的 AWS博客中所述的 docker工具

因此,对于这个问题,我验证了,如下所示:

  1. 创建空文件夹,例如mylayer

  2. 转到该文件夹​​并创建内容为{p>的requirements.txt文件

instabot
  1. 运行以下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"
  1. 删除numpy

instabot需要很大的numpy。因此,我们手动将其删除, 之前 创建一个图层。我们将改用AWS提供的numpy层。

sudo rm -rvf ./python/lib/python3.8/site-packages/numpy*

如果不删除numpy,则该层将大于50MB。

  1. 以zip格式创建图层:
zip -9 -r mylayer.zip python 
  1. 在AWS控制台中基于mylayer.zip创建lambda层。 不要忘记为Compatible runtimes指定python3.8

  2. 在您的函数中添加两层:

第一个是AWSLambda-Python38-SciPy1x,由AWS与numpy提供, 而第二个是我们上面创建的那个。所以 您的函数将使用两层。

  1. 使用以下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!')
    }