简体   繁体   中英

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 ?

This is possible through "Parameters" in pass state

JSON

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

It works in a combination of two of the solutions here exposed:

  1. Add Parameter in Pass step
  2. Add *.$ in the name of the var you want to pass:
 {
  "loop": {
    "Type": "Pass",
    "parameters": {
      "totalCount.$": "$.newFieldsResponse.body.count",
      "currentCount": 0,
      "step": 1
    },
    "ResultPath": "$.iteration",
    "Next": "iterateLoop"
  }
 }

I too got stuck on this before I figured it out.

Pass states can be used, but @ankitkanojia and @shashi 's answers need a minor modification.

If you want to use input paths, the keys inside parameters need to end in ".$" ("totalCount.$")

So the state specification should be as follows:

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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM