python中的AWS Lambda导入模块错误

Nit*_*nil 70 python amazon-web-services aws-lambda

我正在创建一个AWS Lambda python部署包.我正在使用一个外部依赖请求.我使用AWS文档http://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html安装了外部依赖项.下面是我的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
Run Code Online (Sandbox Code Playgroud)

创建了zip项目-dir目录的内容并上传到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
Run Code Online (Sandbox Code Playgroud)

请帮我调试错误.

Nit*_*nil 90

错误是由于lambda函数的文件名.在创建lambda函数时,它将要求Lambda函数处理程序.您必须将其命名为Python_File_Name.Method_Name.在这种情况下,我将其命名为lambda.lambda_handler(lambda.py是文件名).

请在下面找到快照. 在此输入图像描述

  • 我的代码只是在 lambda 中作为代码——而不是作为文件。 (3认同)
  • @BenWheeler:即使它是内联代码,它也是你实际编写它的文件.您可以在窗口左侧看到文件名和整个目录结构. (3认同)

2an*_*3th 57

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

  • 压缩时,请确保您也使用 -r 标志! (3认同)

小智 21

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

在压缩它之前我在python文件上运行了以下内容并且它工作正常.

chmod u=rwx,go=r
Run Code Online (Sandbox Code Playgroud)

  • 这个.我正在使用Python的ZipFile以编程方式将lambda函数打包到ZIP中,它默认为"0600",正如你所提到的还不够.此外,集成的Lambda源代码编辑器(在亚马逊网页上)将很乐意读取该文件,而不会发出权限问题警告. (4认同)
  • 第二。我通过使用此处显示的方法设置文件权限来使其工作:http://stackoverflow.com/a/434689/931277 (2认同)

ope*_*onk 15

这是一个快速的步骤。

假设您有一个名为 的文件夹deploy,其中包含您的 lambda 文件lambda_function.py。让我们假设这个文件看起来像这样。(p1p2代表第三方包。)

import p1
import p2

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

    return {
        "status": 200,
        "body" : "Hello from Lambda!",
    }
Run Code Online (Sandbox Code Playgroud)

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

pip install p1 --target .
pip install p2 --target .
Run Code Online (Sandbox Code Playgroud)

完成此操作后,您的结构应如下所示。

deploy/
??? lambda_function.py
??? p1/
?   ??? __init__.py
?   ??? a.py
?   ??? b.py
?   ??? c.py
??? p2/
    ??? __init__.py
    ??? x.py
    ??? y.py
    ??? z.py
Run Code Online (Sandbox Code Playgroud)

最后,您需要zipdeploy文件夹内的所有内容压缩成一个文件。在 Mac 或 Linux 上,该命令看起来像zip -r ../deploy.zip *来自deploy文件夹内。请注意,该-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
Run Code Online (Sandbox Code Playgroud)

上传 zip 文件并指定<file_name>.<function_name>Lambda 以进入您的流程,lambda_function.lambda_handler例如上面的示例。

  • 此外,不要像“zip -r deploy.zip deploy”那样压缩整个文件夹。这将在 zip 文件中创建一个部署文件夹。 (3认同)

use*_*554 12

我发现Nithin的回答很有帮助.这是一个具体的演练:

查找这些值:

  1. python脚本中lambda_handler函数的名称.AWS示例中使用的名称是"lambda_handler",看起来像"def lambda_handler(event,context)".在这种情况下,值为"lambda_handler"
  2. 在Lambda仪表板中,在lambda仪表板的"配置"部分的"处理程序"文本框中找到该处理程序的名称(如Nithin的屏幕截图所示).我的默认名称是"lambda_function.lambda_handler".
  3. 你的python脚本的名称.让我们说它是"cool.py"

使用这些值,您需要将处理程序(如屏幕截图所示)重命名为"cool.lambda_handler".这是摆脱"无法导入模块'lambda_function'"errorMessage的一种方法.如果你要将python脚本中的处理程序重命名为"sup",那么你需要将lambda仪表板中的处理程序重命名为"cool.sup"


joa*_*aes 9

只是有这么多的陷阱创建AWS LAMBDA(对于Python)部署软件包时.我花了几个小时来调试会话,直到找到一个很少失败的公式.

我创建了一个脚本,可以自动完成整个过程,因此不易出错.我还编写了教程,解释了一切是如何工作的.您可能想要查看它:

无忧无虑的Python Lambda部署[教程+脚本]

  • 伟大的帖子,但我错过了最难的部分的细节,如何打包本机库.这真是不正常,这有多复杂 (2认同)

Pri*_*mit 7

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

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

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


小智 7

转到 Lambda 函数,然后选择层,然后滚动到运行时设置并单击编辑。

在此输入图像描述

您还可以使用 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'
Run Code Online (Sandbox Code Playgroud)


小智 5

在尝试了上述所有解决方案后,我发现了这种困难的方法。如果您在zip文件中使用子目录,请确保__init__.py在每个子目录中都包含该文件,并且对我有用。


小智 5

我也有错误。原来我的zip文件包含代码父文件夹。当我unzip检查zip文件时,该lambda_function文件位于父文件夹下./lambda

使用zip命令,修复错误:

zip -r ../lambda.zip ./*
Run Code Online (Sandbox Code Playgroud)


Uri*_*riP 5

我通过容器而不是 zip 文件构建 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"]
Run Code Online (Sandbox Code Playgroud)

尽管我之前设置了 WORKDIR,甚至尝试在 Lambda 中使用“WORKDIR override”设置,但它仅在我使用“${LAMBDA_TASK_ROOT}”文件夹时才有效。