jsonamazon-web-servicesjsonpathaws-step-functions

AWS Step Function - Adding dynamic value to Pass state type


I have the following state defined in my state machine.

 "loop":{
      "Type": "Pass",
      "Result":{
        "totalCount": "$.newFieldsResponse.body.count",
        "currentCount": 0,
        "step": 1
      },
      "ResultPath": "$.iteration",
      "Next":"iterateLoop"
    },

I expect the output of the state to be:

"newFieldsResponse": {
      "isSuccess": true,
      "error": "",
      "body": {
        "count": 2,
        "fields": [...]
      }
    },
    "iteration": {
      "totalCount": 5,
      "currentCount": 0,
      "step": 1
    }
  }

iteration property is added to the input with totalCount property to be set to count of items in fields array.

However, the output for "iteration" property is set as:

"iteration": {
      "totalCount": "$.newFieldsResponse.body.count",
      "currentCount": 0,
      "step": 1
    }

It looks like the value "$.newFieldsResponse.body.count" is not getting resolved and is output as is.

Is there something I am doing wrong ? Can someone please advice on how to make it work ?


Solution

  • Looks like this may not be possible. The workaround I did is to use "Parameters" property. From AWS documentation: "For key-value pairs where the value is selected using a path, the key name must end in *.$. ".

    So resolved the above by :

    1. Changing Pass state to remove any dynamic value reference
    "loop":{
          "Type": "Pass",
          "Result":{
            "currentCount": 0,
            "step": 1
          },
          "ResultPath": "$.iteration",
          "Next":"iterateLoop"
        },
    
    1. creating a Parameters property where I need the values as below:
     "iterateLoop":{
          "Type":"Task",
          "Resource": "arn:aws:lambda:....r",
          "Parameters":{
            "totalCount.$": "$.newFieldsResponse.body.count",
            "currentCount.$": "$.iteration.currentCount",
            "step.$": "$.iteration.step"
          },
          "ResultPath": "$.iteration",
          "Next":"continueLoop"
        },
    

    totalCount, currentCount and step all read the value from using a path in the state input. The key needs to be appended with a ".$" at the end.