问题描述
我有一个 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']
我的阶跃函数定义是:
{
"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
和 Payload 和 Json body 的第二种方法(无需包裹在 Input 中)
{
"StartAt":"invoke-lambda","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引起的异常触发的异常添加Retry。
{
"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"
}
}
}
}