Solución:
Puedes hacer uso de InputPath
y ResultPath
. En initStep
solo enviaría los datos necesarios a un servicio externo (probablemente junto con algún identificador único de ejecución). En el ValidaitonWaiting
paso puede establecer las siguientes propiedades (en la definición de máquina de estado):
-
InputPath
: ¿Qué datos se proporcionarán aGetActivityTask
. Probablemente quieras configurarlo en algo como$.execution_unique_id
dóndeexecution_unique_id
Es un campo en sus datos que el servicio externo usa para identificar la ejecución (para que coincida con una solicitud específica duranteinitStep
). -
ResultPath
: Donde la salida de la actividad de ValidationWaiting se guardará en los datos. Puedes configurarlo para$.validation_output
y el resultado json del servicio externo estará presente allí.
De esta manera, puede enviar a un servicio externo solo los datos que realmente necesita y no perderá el acceso a los datos que estaban previamente (antes ValidationWaiting
paso) en la entrada.
Por ejemplo, podría tener la siguiente definición de la máquina de estado:
{
"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
}
}
}
he usado Pass
estados para initStep
y ValidationWaiting
para simplificar el ejemplo (no lo he ejecutado, pero debería funcionar). Result
el campo es específico para Pass
tarea y es equivalente al resultado de sus funciones Lambda o Actividad.
En este escenario Complete
paso obtendría la siguiente entrada:
{
"executionId": "some:special:id",
"data": {},
"someOtherData": {"value": key"},
"validationOutput": {
"validationMessages": ["a", "b"]
}
}
Entonces el resultado de ValidationWaiting
el paso se ha guardado en validationOutput
campo.
Basándome en la respuesta de Marcin Sucharski, se me ocurrió mi propia solución.
Necesitaba usar Type: Task
ya que initStep
es una lambda, que envía SQS.
Yo no necesitaba InputPath
en ValidationWaiting
, pero sólo ResultPath
, que almacenan los datos recibidos en actividad.
Trabajo con el marco sin servidor, aquí está mi solución final:
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