使用负载从 Step Function 调用 lambda 时出错

Error when invoking lambda from StepFunction with paypload

我有一个 lambda,它是 StepFunction 状态机的步骤之一,lambda 处理程序如下所示:

def lambda_handler(event, context):

    year = event['year'] #payload
    month = event['month'] #payload
    example_function(year, month)

如果我在 Lambda 本身中使用负载启动 运行,则此 lambda 执行成功:

{
  "year": "2019",
  "month": "06"
}

但是,如果我启动一个 stepfunction 运行,它将失败并显示错误:

[ERROR] KeyError: 'year'
Traceback (most recent call last):
  File "/var/task/xxx.py", line 34, in lambda_handler
    year = event['year']

我的 stepfunction 定义是:

{
    "Comment": "xxxxxxxxx",
    "StartAt": "invoke lambda",
    "States": {
      "invoke lambda" : {
        "Type": "Task",
        "Resource": "arn:aws:states:::lambda:invoke",
        "Parameters": {
          "FunctionName":"xxxxxxxxxx",
          "Payload": {
            "Input": {
              "year": "2019",
              "month": "06"
            }
          }
        }
        "End": true
      }
    }
  }

我不确定如何调试和解决这个问题,请问有人能帮忙吗?

从step函数调用lambda函数有两种方法。

第一种方法,直接将资源名称命名为 lambda Arn,并将整个输入传递给参数。这会将给定的输入按原样传递给 Lambda

{
   "StartAt":"invoke-lambda",
   "States":{
      "invoke-lambda":{
         "End":true,
         "Type":"Task",
         "Resource":"arn:aws:lambda:us-east-1:660008888333:function:HelloWorld",
         "Parameters":{
            "year":"2019",
            "month":"06"
         }
      }
   }
}

第二种方法使用资源 lambda:invoke 和带有 Json 主体的有效载荷(无需在输入中换行)

{
   "StartAt":"invoke-lambda",
   "States":{
      "invoke-lambda":{
         "End":true,
         "Type":"Task",
         "Resource":"arn:aws:states:::lambda:invoke",
         "Parameters":{
            "FunctionName":"arn:aws:lambda:us-east-1:660008888333:function:HelloWorld",
            "Payload":{
               "year":"2019",
               "month":"06"
            }
         }
      }
   }
}

如果 Lambda 的输入来自上一步或从输入到步进函数输入,我们可以使用 "Payload.$": "$" 甚至 "Payload.$": "$.subPath"(传递 json 的一部分) 还建议为因 AWS 引起的异常而触发的异常添加重试。

{
  "StartAt": "invoke-lambda",
  "States": {
    "invoke-lambda": {
      "End": true,
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:us-east-1:660008888333:function:HelloWorld",
        "Payload.$": "$",
        "InvocationType": "RequestResponse"
      }
    }
  }
}