首页 > 解决方案 > 无法导入模块“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 识别出我的包裹在那里。

标签: pythonamazon-web-servicesaws-lambdapip

解决方案


如果您需要 Pillow,在您的函数中使用它的最简单方法是通过具有公共层(包括枕头)的流行存储库,例如github 上的keithrozario / Klayers 。要使用它,您将根据您的 region定位图层的 ARN 。python 3.8 的 ARN 列表在这里

例如,us-east-1为 Python 3.7 添加的层将是:

在此处输入图像描述

更新

我刚刚创建了自定义层,instabot并且可以确认它可以正常工作。

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

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

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

  2. 转到文件夹并创建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。所以我们在创建图层之前手动删除它。我们将改用numpyAWS 提供的层。

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

如果我们不移除 numpy,层将 >50MB。

  1. 将图层创建为 zip:
zip -9 -r mylayer.zip python 
  1. mylayer.zip在 AWS 控制台中创建 lambda 层。不要忘记指定Compatible runtimesto python3.8

  2. 向您的函数添加两层:

第一个是AWSLambda-Python38-SciPy1xAWS 用 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!')
    }

推荐阅读