使用负载从 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"
}
}
}
}
我有一个 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"
}
}
}
}