使用Paypload从StepFunction调用lambda时出错 [英] Error when invoking lambda from StepFunction with paypload

查看:97
本文介绍了使用Paypload从StepFunction调用lambda时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a lambda and it's one of the steps of a StepFunction statemachine, the lambda handler looks like this below :

def lambda_handler(event, context):

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

如果我使用有效负载在Lambda本身中开始运行,则此lambda执行成功:

This lambda execution succeeded if f I start a run in Lambda itself with payload:

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

但是,如果我启动步进功能运行,它将失败并显示错误:

However if I kick off a stepfunction run, it will fail with error:

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

我的stepfunction定义是:

My stepfunction definition is:

{
    "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
      }
    }
  }

我不确定如何调试和解决此问题,请问有人可以帮忙吗?

I'm not sure how to debug and solve this issue, might someone be able to help please?

推荐答案

有两种方法可以从step函数调用lambda函数.

There are two ways to call the lambda function from step function.

第一种方法,直接通过将Resource名称指定为lambda Arn并将整个输入传递给Parameters.这会将给定的输入直接传递给Lambda

First Method, directly by giving the Resource name as lambda Arn and passing the entire input to Parameters. This passes given input as is to 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主体的第二种方法(无需包装在Input中)

Second Method using Resource lambda:invoke and Payload with Json body(no need to wrap within Input)

{
   "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引起的异常而触发的异常添加重试".

If input to Lambda is from either previous step or from input to step function input, we can use "Payload.$": "$" or even "Payload.$": "$.subPath"(to pass part of json) Also it is recommended to add a Retry for exceptions that are triggered because of Exceptions caused by 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"
      }
    }
  }
}

这篇关于使用Paypload从StepFunction调用lambda时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆