来自 Python 的 AWS 错误: 没有名为 lambda_function 的模块

我正在创建一个 AWS Lambda python 部署包。我正在使用一个外部依赖性请求。我使用 AWS 文档安装了外部依赖项。下面是我的 Python 代码。

import requests


print('Loading function')


s3 = boto3.client('s3')




def lambda_handler(event, context):
#print("Received event: " + json.dumps(event, indent=2))


# Get the object from the event and show its content type
bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8')
try:
response = s3.get_object(Bucket=bucket, Key=key)
s3.download_file(bucket,key, '/tmp/data.txt')
lines = [line.rstrip('\n') for line in open('/tmp/data.txt')]
for line in lines:
col=line.split(',')
print(col[5],col[6])
print("CONTENT TYPE: " + response['ContentType'])
return response['ContentType']
except Exception as e:
print(e)
print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
raise e

创建了 project-dir 目录的内容 Zip 并上传到 lambda (Zip 目录内容,而不是目录)。当我执行这个函数时,我得到了下面提到的错误。

START RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058 Version: $LATEST
**Unable to import module 'lambda_function': No module named lambda_function**


END RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058
REPORT RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058  Duration: 19.63 ms  Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 9 MB
283143 次浏览

错误是由于 lambda 函数的文件名造成的。在创建 Lambda 函数时,它会请求 Lambda 函数处理程序。你必须把它命名为 Python_File_Name.Method_Name。在这个场景中,我将其命名为 lambda.lambda_handler(lambda.py是文件名)。

请在快照下面找到。 enter image description here

我发现 Nithin 的回答很有帮助:

查一下这些值:

  1. Python 脚本中 lambda _ handler 函数的名称 在 AWS 示例中使用的名称是 lambda_handler 在本例中,值为 lambda_handler
  2. 在 Lambda 指示板中,在 Lambda 指示板的 配置部分的 管理员文本框中找到 Handler 的名称 函数(如 Nithin 的屏幕截图所示) lambda_function.lambda_handler.
  3. Python 脚本的名称。假设它是 cool.py

使用这些值,您需要将处理程序(如屏幕快照所示)重命名为 cool.lambda_handler。这是消除 “无法导入模块 lambda_function错误消息的一种方法。如果要将 python 脚本中的处理程序重命名为 sup,那么需要将 lambda 指示板中的处理程序重命名为 cool.sup

此问题的另一个来源是对压缩文件的权限。它的 必须的至少是世界范围的可读性。(分钟 chmod 444)

我在压缩 Python 文件之前运行了下面的代码,它工作得很好。

chmod u=rwx,go=r

在为 AWS Lambda (用于 Python)创建部署包时,有太多的 抓到你了。我花了很多时间在调试会话上,直到我找到了一个很少失败的公式。

我已经创建了一个自动化整个过程的脚本,因此使其不易出错。我还写了教程,解释如何一切工作。你可能想看看这个:

Python Lambda 部署[教程 + 脚本]

如果您正在上传压缩文件。确保压缩的是目录的内容,而不是目录本身。

在尝试了以上所有解决方案后,我发现这是一条艰难的道路。如果在 zip 文件中使用子目录,请确保在每个子目录中都包含 __init__.py文件,这对我来说很有用。

我也有错。 原来我的 zip 文件包含代码父文件夹。当我检查压缩文件时,lambda_function文件在父文件夹 ./lambda下。

使用 zip命令,修复错误:

zip -r ../lambda.zip ./*

我也遇到了同样的问题,如果我没记错的话,这是 Lynda.com 教程中的一个练习。 我犯的错误是没有选择 Python 3.6作为运行时,这是 lada 函数控制台中的一个选项。

你需要压缩所有的需求,使用这个脚本

#!/usr/bin/env bash
rm package.zip
mkdir package
pip install -r requirements.txt --target package
cat $1 > package/lambda_function.py
cd package
zip -r9 "../package.zip" .
cd ..
rm -rf package

用法:

package.sh <python_file>

@ nithin, AWS 在 Lambda函数中发布了 layers概念。你可以创建你的图层,在那里你可以上传尽可能多的库,然后你可以连接层与 lambda 函数。 想了解更多细节,请访问: < a href = “ https://docs.aws.amazon.com/lambda/update/dg/configuration-layers.html”rel = “ nofollow norefrer”> https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html

lambda_handler的格式必须是 lambda_filename.lambda_functionName。 假设您想运行 lambda_handler函数并且它是在 lambda_function.py中,那么您的处理程序格式是 lambda_function.lambda_handler

出现此错误的另一个原因是模块依赖性。

您的 lambda_function.py必须位于 zip 文件的根目录中。

2019年的展望:

AWS Lambda 现在支持 Python 3.7,许多人(包括我自己)选择将其用作内联 Lambda 的运行时。

然后,我必须导入一个外部依赖项,并按照所引用的 OP 遵循 AWS Docs。(本地安装—— > zip —— > 上传)。

我有导入模块错误,我意识到我的本地电脑有 Python 2.7作为默认的 Python。当我调用 pip 时,它安装了我对 Python 2.7的依赖项。

因此,我在本地切换到与 lambda 控制台中选定的运行时版本匹配的 Python 版本,然后重新安装外部依赖项。这为我解决了问题。例如:

$ python3 -m pip install --target path/to/lambda_file <external_dependency_name>

这里有一个快速的步骤通过。

假设您有一个名为 deploy的文件夹,其中包含调用 lambda_function.py的 lambda 文件。我们假设这个文件是这样的。(p1p2代表第三方软件包。)

import p1
import p2


def lambda_handler(event, context):
# more code here


return {
"status": 200,
"body" : "Hello from Lambda!",
}

对于每个第三方依赖项,您需要从 deploy文件夹中获取 pip install <third-party-package> --target .

pip install p1 --target .
pip install p2 --target .

完成这一步之后,下面是您的结构应该是什么样子的。

deploy/
├── lambda_function.py
├── p1/
│   ├── __init__.py
│   ├── a.py
│   ├── b.py
│   └── c.py
└── p2/
├── __init__.py
├── x.py
├── y.py
└── z.py

最后,您需要将 deploy文件夹中的所有内容 zip到一个压缩文件中。在 Mac 或 Linux 上,从 deploy文件夹中看,该命令类似于 zip -r ../deploy.zip *。请注意,-r标志是用于递归子文件夹的。

文件 zip 文件的结构应该反映原始文件夹。

deploy.zip/
├── lambda_function.py
├── p1/
│   ├── __init__.py
│   ├── a.py
│   ├── b.py
│   └── c.py
└── p2/
├── __init__.py
├── x.py
├── y.py
└── z.py

上传压缩文件并为 Lambda 指定 <file_name>.<function_name>以进入您的进程,例如上面示例中的 lambda_function.lambda_handler

分享我对同一问题的解决方案,以防它对任何人都有帮助。

问题: 我得到错误: “[错误]运行时。Import ModuleError: 在执行 AWS 文章[2]中提供的 AWS-big-data-blog 代码[1]时,无法导入模块‘ lambda _ function’: 没有名为‘ StringIO’的模块。

解决方案: 将运行时从 Python 3.7更改为 Python 2.7

Https://github.com/bsnively/aws-big-data-blog/blob/master/aws-blog-vpcflowlogs-athena-quicksight/cloudwatchlogstofirehose/lambdacode.py Https://aws.amazon.com/blogs/big-data/analyzing-vpc-flow-logs-with-amazon-kinesis-firehose-amazon-athena-and-amazon-quicksight/

您可以配置您的 Lambda 函数以层的形式引入额外的代码和内容。层是包含库、自定义运行时或其他依赖项的 ZIP 归档文件。使用层,您可以在函数中使用库,而无需将它们包含在部署包中。层允许您将部署包保持在较小的范围内,这使得开发更加容易。

参考文献:-

  1. Https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html
  2. Https://towardsdatascience.com/introduction-to-amazon-lambda-layers-and-boto3-using-python3-39bd390add17

确保将文件夹结构中的所有依赖项压缩为 Python/[您的所有依赖项],以使其按照本文档的要求工作。

Https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path

我的问题是。Py 文件和依赖项不在 zip 的“ root”目录中。例如库和 lambda 函数的路径。必须是:

<lambda_function_name>.py
<name of library>/foo/bar/

没有

/foo/bar/<name of library>/foo2/bar2

例如:

drwxr-xr-x  3.0 unx        0 bx stor 20-Apr-17 19:43 boto3/ec2/__pycache__/
-rw-r--r--  3.0 unx      192 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/__init__.cpython-37.pyc
-rw-r--r--  3.0 unx      758 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/deletetags.cpython-37.pyc
-rw-r--r--  3.0 unx      965 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/createtags.cpython-37.pyc
-rw-r--r--  3.0 unx     7781 tx defN 20-Apr-17 20:33 download-cs-sensors-to-s3.py

请在 Import requests后面加上以下一个

import boto3

我在你的代码中看不到的东西。

这里的问题是,Python 版本用于构建您的 Lambda 函数依赖项(在您自己的机器上)与为您的 Lambda 函数选择的 Python 版本不同。这种情况很常见,特别是在依赖项的 Numpy 库部分。

示例: 您的机器的 python 版本: 3.6——-> Lambda python 版本3.6

你的压缩包目录也必须是世界可读的。

要确定这是否是您的问题(Linux) ,请使用:

find $ZIP_SOURCE -type d -not -perm /001 -printf %M\ "%p\n"

固定使用:

find $ZIP_SOURCE  -type d -not -perm /001 -exec chmod o+x {} \;

文件可读性也是一个要求。要确定这是否是您的问题使用:

find $ZIP_SOURCE -type f -not -perm /004 -printf %M\ "%p\n"

固定使用:

find $ZIP_SOURCE  -type f -not -perm /004 -exec chmod o+r {} \;

如果您有这个问题,并且您正在使用 Linux,那么在创建或检出 git Python 包时,请检查 umask 是否设置得当,例如,将其放入您的打包脚本或。巴希尔:

umask 0002

将 python 文件名更改为 lambda _ function. py,例如在我的示例中,文件名是 app.py 一旦我将文件名改为 lambda _ function. py,错误就消失了

DR 试试 chmod 755 python

我知道这已经是一个很长的线程,但如果你仍然不能解决下面的问题后,阅读所有社区成员张贴在这里的所有潜在的解决方案,你可以尝试解决我的问题的解决方案。

{
"errorMessage": "Unable to import module 'xxx': No module named 'yyy'",
"errorType": "Runtime.ImportModuleError",
"stackTrace": []
}

明确地说,我谈论的是针对 Python 运行时的 AWS Lambda 层(而不是部署包)的 zip 文件。在我的例子中,所有的依赖项都放在一个根据 医生命名为 python的文件夹中。

AWS Lambda Include library dependencies in a layer

注意,使用名为 python的文件夹优于其他文件夹结构,因为它不依赖于 Python 的版本。

然后,您应该尝试使用下面的代码片段在 Lambda 中执行 ls:

import os


def lambda_handler(event, context):
print(os.listdir('/opt'))
print(os.listdir('/opt/python'))

以下是预期产出:

['python']
['OpenSSL', '__pycache__', ... 'urllib3', 'urllib3-1.24.2.dist-info']

在我的例子中,在问题解决之前,输出是

{
"errorMessage": "[Errno 13] Permission denied: '/opt/python'",
"errorType": "PermissionError",
"stackTrace": [
"  File \"/var/task/lambda_function.py\", line 16, in lambda_handler\n    print(os.listdir('/opt/python'))\n"
]
}

因此,这显然是一个权限问题。在执行了 chmod 755 pythonzip -r9 lambda-layer python并将 lambda-layer.zip上传到 Lambda 之后,问题就解决了。

我是通过一个容器而不是压缩文件来构建 Lambda 的。

在我的案例中,解决这个问题的方法是将项目复制到“ ${ LAMBDA _ TASK _ ROOT }”文件夹中,而不仅仅是我选择的一个自定义文件夹。

FROM public.ecr.aws/lambda/python:3.8


WORKDIR ${LAMBDA_TASK_ROOT}
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY . .
CMD ["lambda_function.lambda_handler"]

尽管我之前设置了 WORKDIR,甚至尝试在 LAMBDA 中使用“ WORKDIR 覆盖”设置,但它只有在使用“ ${ LAMBDA _ TASK _ ROOT }”文件夹时才能工作。

为其他有同样问题的人添加这个答案,其他的解决方案都不适合他们。如果您已经将代码上传到 lambda,并尝试在不单击 展开的情况下对其进行测试,那么将会出现相同的错误; 在能够运行测试之前,必须的将部署 lambda。 enter image description here

确保你的 lambda 函数名和处理程序名匹配。例如: 如果您的 lambda 函数名为“ index.py”,并且您已经将处理程序名称指定为“ lambda_function.lambda_handler”,那么您将得到一个错误“ 无法导入模块“ lambda _ function”: 没有名为“ lambda _ function”的模块”。

决心: 您必须将 lambda _ handle 名称从‘ lambda_function.lambda_handler’更新为‘ index.lambda_handler

我正在进行一个 AWS 培训课程,通过 Lambda 功能。这看起来很基本,但是你必须在测试事件工作之前选择 展开-特别是如果你已经上传了不包含 lambda_function.lambda_handler方法的代码-这是我的错误。我在训练中并不清楚这一点,因此在这个愚蠢的错误上浪费了30多分钟。

不确定它是否在上面提到过,但是. zip 文件名和 zip 的内容应该匹配。 例如: file: lambda.zip 和 content: lambda.py

转到 Lambda 函数,然后选择 Layers,然后滚动到 Runtime 设置并单击 Edit。

enter image description here

您还可以在 YAML 文件中使用特定的处理程序配置 SAM。

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Serverless Specification template describing your function.
Resources:
getRecommendation:
Type: 'AWS::Serverless::Function'
Properties:
Handler: pythonfilename.lambda_handler
Runtime: python3.7
CodeUri: .
Description: ''
MemorySize: 128
Timeout: 3
Role: 'arn:aws:iam::xxxxx:role/lambdaroleIam'

这是因为您的代码可能包含一些 lambda 函数不知道的包(例如 python 的 request 模块)。为了解决这个问题,AWS 在 Lambda 函数中引入了层的概念,在那里你可以上传尽可能多的库,然后你可以把层和 Lambda 函数连接起来。

我知道我是在回复一个老帖子,但是以防有人碰到这个问题:

今天,我在 M1 Mac 上使用 CloudForm 部署 Python Lambda 函数时遇到了同样的问题。文件名和处理程序似乎是正确的,但是 Lambda 框架仍然无法找到我的模块。

最后,我将函数配置为使用 x86_64体系结构。将 CloudForm 模板更改为使用 arm64体系结构修复了这个问题。

我做了一些研究才意识到,我在本地有 python3.10,因此在文件夹结构中,lambda 只接受 python3.9。在我的例子中,我可以将文件夹的名称从 python3.10改为 python3.9(python/lib/python3.9/site-package) ,但是您应该确保使用的是 lambda 允许的 python 版本。