sql_knievel
sql_knievel

Reputation: 1369

AWS Step Functions - include all step input but add a parameter

Let's say I have an AWS step function that simply passes the output from the first step to the second step. But now let's say I need to add an additional input value for that second step.

How do I set the parameters for the second step to keep ALL input fields (without specifying them individually) and add a new input value?

The closest I can get is setting the Parameters like this:

"Second Step": {
  "Type": "Task",
  "Resource": "arn:aws:lambda:blahblahblah",
  "InputPath": "$",
  "Parameters": {
    "Input.$":"$",
    "additionalValue": "ABC"
  }
}

But that results in pushing all of the input values under that new "Input" key, where I really just want them in the root of the dictionary. I could swear there was some magic expression I saw once that made this work the way I want it to, but now I can't find it.

AWS now has a simulator you can try this in. Set InputPath to $ and Parameters to {"Input.$":"$","additionalValue":"ABC"} to see an example of this situation.

Upvotes: 10

Views: 7721

Answers (2)

Milosz
Milosz

Reputation: 3074

I found something that works great using a chain of Amazon States Language intrinsic functions:

{
  "Comment": "Initializes and increments a counter without modifying the original workflow input.",
  "StartAt": "InitializeCounter",
  "States": {
    "InitializeCounter": {
      "Type": "Pass",
      "Next": "IncrementCounter",
      "Parameters": {
        "output.$": "States.JsonMerge($, States.StringToJson('{\"counter\": 0}'), false)"
      },
      "OutputPath": "$.output"
    },
    "IncrementCounter": {
      "Type": "Pass",
      "End": true,
      "Parameters": {
        "output.$": "States.JsonMerge($, States.StringToJson(States.Format('\\{\"counter\": {}\\}', States.MathAdd($.counter, 1))), false)"
      },
      "OutputPath": "$.output"
    }
  }
}

When I execute this with the input

{
  "Comment": "Insert your JSON here"
}

the output of InitializeCounter, which is the input to IncrementCounter, is

{
  "Comment": "Insert your JSON here",
  "counter": 0
}

and the output of IncrementCounter and indeed the whole workflow is

{
  "Comment": "Insert your JSON here",
  "counter": 1
}

.


(Of course, InitializeCounter could also have been defined as

{
  "Type": "Pass",
  "Next": "IncrementCounter",
  "Result": 0,
  "ResultPath": "$.counter"
}

but the purpose of this exercise is to devise a strategy that we could also use for the input of a Task/Activity state.)

Upvotes: 3

qkhanhpro
qkhanhpro

Reputation: 5220

You can have this kind of manipulation with ResultSelector. But it can only be applied at ouput step. With this approach you need to either

  • Alter the output of previous step with ResultSelector
  • Create a pass-through step that add the static additional value you wanted

Upvotes: 4

Related Questions