How to share data in `AWS Step Functions` without passing it between the steps
You can make use of InputPath
and ResultPath
. In initStep
you would only send necessary data to external service (probably along with some unique identifier of Execution). In the ValidaitonWaiting
step you can set following properties (in State Machine definition):
InputPath
: What data will be provided toGetActivityTask
. Probably you want to set it to something like$.execution_unique_id
whereexecution_unique_id
is field in your data that external service uses to identify Execution (to match it with specific request duringinitStep
).ResultPath
: Where output of ValidationWaiting Activity will be saved in data. You can set it to$.validation_output
and json result from external service will be present there.
This way you can send to external service only data that is actually needed by it and you won't lose access to any data that was previously (before ValidationWaiting
step) in the input.
For example, you could have following definition of the State Machine:
{
"StartAt": "initStep",
"States": {
"initStep": {
"Type": "Pass",
"Result": {
"executionId": "some:special:id",
"data": {},
"someOtherData": {"value": "key"}
},
"Next": "ValidationWaiting"
},
"ValidationWaiting": {
"Type": "Pass",
"InputPath": "$.executionId",
"ResultPath": "$.validationOutput",
"Result": {
"validationMessages": ["a", "b"]
},
"Next": "Complete"
},
"Complete": {
"Type": "Pass",
"End": true
}
}
}
I've used Pass
states for initStep
and ValidationWaiting
to simplify the example (I haven't run it, but it should work). Result
field is specific to Pass
task and it is equivalent to the result of your Lambda functions or Activity.
In this scenario Complete
step would get following input:
{
"executionId": "some:special:id",
"data": {},
"someOtherData": {"value": key"},
"validationOutput": {
"validationMessages": ["a", "b"]
}
}
So the result of ValidationWaiting
step has been saved into validationOutput
field.
Based on the answer of Marcin Sucharski I've came up with my own solution.
I needed to use Type: Task
since initStep
is a lambda, which sends SQS.
I didn't needed InputPath
in ValidationWaiting
, but only ResultPath
, which store the data received in activity.
I work with Serverless framework, here is my final solution:
StartAt: initStep
States:
initStep:
Type: Task
Resource: arn:aws:lambda:#{AWS::Region}:#{AWS::AccountId}:function:init-step
Next: ValidationWaiting
ValidationWaiting:
Type: Task
ResultPath: $.validationOutput
Resource: arn:aws:states:#{AWS::Region}:#{AWS::AccountId}:activity:validationActivity
Next: Complete
Catch:
- ErrorEquals:
- States.ALL
ResultPath: $.validationOutput
Next: Complete
Complete:
Type: Task
Resource: arn:aws:lambda:#{AWS::Region}:#{AWS::AccountId}:function:complete-step
End: true