AWS CloudFormation Lambda Python坏处理程序

21

我需要通过CloudFormation创建AWS Lambda(Python)函数,虽然函数已经被创建好了,但每次尝试执行Lambda时都会出现以下错误。我尝试了许多方法,但还是没能使它正常运行。

{
  "errorMessage": "Bad handler 'lambda_handler'"
}

这是我如何通过CloudFormation创建Lambda的方法。

  1. 创建一个简单的Python hello程序,其中包含打印语句(尽可能简单)

代码:

def lambda_handler():
    print('lambda_handler is called...');
    print('Lambda is printing...');
  1. 将Python代码进行压缩并放置在S3中(我已经尝试过包含和不包含文件夹的方式)。

  2. 创建一个具有以下资源的CloudFormation模板。

JSON:

"Resources": {
  "LF1ZOLJ": {
    "Type": "AWS::Lambda::Function",
    "Properties": {
      "Handler": "lambda_handler",
      "Code": {
        "S3Bucket": "mybuckname",
        "S3Key": "simplepython.zip"
      },
      "Description": "cfn-create-lambda",
      "Role": "arn:aws:iam::305760000000:role/lambda_basic_execution",
      "Runtime": "python2.7",
      "Timeout": 60
    },
    "Metadata": {
      "AWS::CloudFormation::Designer": {
        "id": "xxxxxxxxxxxxxxxxxxxxxxxx"
      }
    }
  }
}
  1. 前往 Cloudformation 并使用模板创建一个堆栈。堆栈已成功创建。

  2. 使用“Hello World”事件模板测试 Lambda 时,出现了错误。

"errorMessage": "Bad handler 'lambda_handler'"

如果我查看 CloudWatch 日志,会看到:

Bad handler 'lambda_handler': need more than 1 value to unpack.

我没有传递参数。这是 Python 中的“Hello World”Lambda 函数。如果我在 Lambda 服务中手动创建此 Lambda 函数,则可以执行它而不会出现任何错误。仅当使用 Cloudformation 创建 Lambda 时才会出现此错误。

请指点正确的方向。先感谢您。

4个回答

23

谢谢你的帮助,问题已经解决了。我认为AWS应该在他们的文档中涵盖这个问题,以便其他人也能清楚地看到。这是我做的。

    "Handler": "simple_python_filename.lambda_handler",
    "Code": {
      "S3Bucket": "mybuckname",
      "S3Key": "simple_python.zip"

我的zip文件名为"simple_python.zip",在压缩文件中我的文件名为"simple_python_filename.py",其中包含一个函数名为"lambda_hander"。同时请确保将.py文件放置在压缩文件的根目录下。


14

我认为问题出在“Handler”声明上。

它应该包含模块名称和函数名称,即应该是module_name.lambda_handler,其中module_name是包含处理程序函数的文件的名称。

当我使用Python的boto3创建Lambda函数时,我也遇到了同样的错误 - 这个解决方法对我有用。


9

AWS Lambda lambda_handler错误界面的图像

如果您因为看到我发布的图片中的错误而来到这里,解决方法是在 AWS Lambda 代码屏幕的处理程序字段中,在您的处理程序名称前加上 lambda_function

例如,如果您的处理程序名称在您的代码中是 lambda_handler,则您必须在代码屏幕的处理程序字段中使用 lambda_function.lambda_handler

这意味着分配给您的 Python Lambda 函数的默认模块名称就是 lambda_function

上述错误的修复图像


1
这正是我的问题,它同样适用于Terraform,即AWS Lambda函数对象的handler字段格式为lambda_function_name.name_of_the_function_on_the_file。 - Juan
1
这也是我的问题。我的 Lambda 处理程序位于不同的文件中,名为 app,因此对我来说它是 app.lambda_handler - alex

0

为像我们这样通过搜索引擎找到这篇非常老的帖子的人发布新回复。

对于我们有效的解决方案包括以下云形成:

LambdaFunction:
  Type: AWS::Lambda::Function
  Properties:
    Runtime: python3.8
    Timeout: 5
    Handler: index.lambda_handler
    Role: !GetAtt LambdaFunctionRole.Arn
    Code:
      ZipFile:
        !Sub
          - |-
            def lambda_handler(event, context):
              print("Inside handler!")
              #Previous first line which was breaking the code

              return { 
                'message' : 'some value populated by code we are redacting for simplicity'
              }

正如您所看到的,我们之前的代码行引发了错误,导致我们撰写这篇文章。我们需要将其放置在新的第一行print("Inside handler!")下面。在我们将引起错误的代码行降低到函数代码的较低行之后,Lambda服务能够返回更有意义的错误消息,从而使我们能够修复根本原因错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接