AWS Step Function: check for null

Viewed 6904

Step Function is defined like that:

{
  "StartAt": "Decision_Maker",
  "States": {
    "Decision_Maker":{
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.body.MyData",
          "StringEquals": "null", //that doesn't work :(
          "Next": "Run_Task1"
        }],
        "Default": "Run_Task2"
    },
    "Run_Task1": {
      "Type": "Task",
      "Resource": "url_1",
      "Next": "Run_Task2"
    },
    "Run_Task2": {
      "Type": "Task",
      "Resource": "url_2",
      "End": true
    }
  }
}

Basically it's a choice between 2 tasks. Input data is like this:

{
    "body": {
        "prop1": "value1",
        "myData": {
            "otherProp": "value"
        }
    }
}

The problem is that sometimes there's no myData in JSON. So input may come like this:

{
    "body": {
        "prop1": "value1",
        "myData": null
    }
}

How do I check whether or not myData is null?

3 Answers

The order matters. Set the "IsPresent": false first, then the "IsNull": true, finally the scalar comparison last.

    "Check MyValue": {
      "Comment": "Check MyValue",
      "Type": "Choice",
      "Default": "ContinueWithMyValue",
      "Choices": [
        {
          "Or": [
            {
              "Variable": "$.MyValue",
              "IsPresent": false
            },
            {
              "Variable": "$.MyValue",
              "IsNull": true
            },
            {
              "Variable": "$.MyValue",
              "BooleanEquals": false
            }
          ],
          "Next": "HaltProcessing"
        },
        {
          "Variable": "$.MyValue",
          "BooleanEquals": true,
          "Next": "ContinueWithMyValue"
        }
      ]
    },

As per my experience, Choice Type can't deal nulls. Best way could be pre-processing your input using a lambda in the very first state and return the event formatting it as "null". Below code snippet might help.

def lambda_handler(event, context):
if event['body']['MyData']:
    return event
else:
    event['body']['MyData']="null"
    return event

Note: This also handles empty string.

Related