Reputation: 1369
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
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
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
ResultSelector
Upvotes: 4