How do I use JSON Lambda output in Step Functions

1

I have a (Python) Lambda function which returns a JSON object. I'd like to join that object on to my Step Functions state, and access its sub-fields in the next state... Something like:

# Lambda Function
def handler(event, context):
    return json.dumps({ "ThingARN": "...", "AnotherField": "..." })
{
  "StartAt": "LambdaStuff",
  "States": {
    "LambdaStuff": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "MyCoolLambdaFunction",
        "Payload.$": "$"
      },
      "ResultPath": "$.LambdaResult",
      "Next": "NextActivity"
    },
    "NextActivity": {
      "Type": "Task",
      "Resource": "...",
      "Parameters": {
        "ARN.$": "$.LambdaResult.ThingARN"
      },
      "ResultPath": "$.AnotherResult",
      "End": true
    }
  }
}

...But my state machine is failing (cancelling the NextActivity task) because what gets populated to $.LambdaResult is a big object with Lambda metadata and the stringified result payload - like this:

{
  "ExecutedVersion": "$LATEST",
  "Payload": "{\"ThingARN\": \"...\", \"AnotherField\": \"...\"}",
  "SdkHttpMetadata": {
    "HttpHeaders": { ... }, // All kinds'a stuff
    "HttpStatusCode": 200
  },
  "SdkResponseMetadata": {
    "RequestId": "..."
  },
  "StatusCode": 200
}

This docs page seems to imply that what I'm trying to do is possible, but the example is clearly very simplified/stripped-down.

All the other worked examples I've found (e.g. "InputPath, OutputPath and ResultPath Example") just seem to have Lambdas returning simple strings, rather than structured objects.

I guess I'm missing something obvious?

AWS
전문가
Alex_T
질문됨 4년 전10397회 조회
1개 답변
0
수락된 답변

If you invoke your lambda function from SFN using the full function ARN in the Resource attribute, you will get back only what was returned from the Lambda function. Also, you do not want to json.dump the object that you return. Just return a map and that will be included in your output.

For instance, the following function:

def lambda_handler(event, context):
    # TODO implement
    body = {
        'Test': 'abc',
        'Value': 123
    }
    return body

When invoked like this:

"Hello": {
  "Type": "Task",
  "Resource": "arn:aws:lambda:eu-west-1:xxxxxxxxx:function:HelloWorld:$LATEST",
  "ResultPath": "$.LambdaResult",
  "Next": "World"
},

With the following input:

{
  "Input": "My input"
}

returned the following:

{
  "Input": "My input",
  "LambdaResult": {
    "Test": "abc",
    "Value": 123
  }
}
profile pictureAWS
전문가
Uri
답변함 4년 전

로그인하지 않았습니다. 로그인해야 답변을 게시할 수 있습니다.

좋은 답변은 질문에 명확하게 답하고 건설적인 피드백을 제공하며 질문자의 전문적인 성장을 장려합니다.

질문 답변하기에 대한 가이드라인

관련 콘텐츠