AWS Step functions: uso del tipo state Wait

JJOC007
4 min readDec 1, 2023

Antes de ver el post te recomiendo ver primero: Introducción a AWS Step Functions usando Terraform como herramienta de infrastructura como código

El estado “Wait” en AWS Step Functions es una herramienta poderosa y flexible para gestionar flujos de trabajo en la nube. Este estado es esencialmente un mecanismo de pausa, que permite a los flujos de trabajo esperar un período de tiempo determinado o hasta que ocurra un evento específico antes de proceder con el siguiente paso. Es crucial en escenarios donde la sincronización y la coordinación temporal son importantes.

Funcionamiento del Estado “Wait”:

Espera Fija: Puedes configurar el estado “Wait” para que tu flujo de trabajo haga una pausa por un tiempo específico, expresado en segundos o hasta una hora y fecha exacta. Esta opción es útil para retrasos predecibles, como esperas entre intentos de una operación o para dar tiempo a que se completen procesos externos.

Ejemplo:

"wait_ten_seconds" : {
"Type" : "Wait",
"Seconds" : 10,
"Next": "NextState"
}

Espera Dinámica: También es posible configurar el estado “Wait” para esperar hasta que se cumpla un cierto evento, como la llegada de un mensaje a una cola de SQS o la actualización de un recurso en particular. En este modo, el flujo de trabajo se reanuda inmediatamente después de que se cumple la condición, lo que lo hace ideal para eventos impredecibles.

Ejemplo:

"wait_until" : {
"Type": "Wait",
"TimestampPath": "$.expirydate",
"Next": "NextState"
}

Como podemos ver en el ejemplo anterior el momento de espera viene dado por una variable de entrada “$.expirydate” la cual debe venir del state anterior

Casos de uso comunes para el uso del estado Wait:

  • Procesos de Aprobación: En flujos de trabajo que requieren aprobaciones humanas, el estado “Wait” puede pausar el proceso hasta que se reciba una respuesta.
  • Coordinación de Tareas Asincrónicas: En escenarios donde varias tareas se ejecutan en paralelo y una de ellas debe esperar a que las otras se completen.
  • Retrasos Programados: Util en casos donde se necesita un retraso entre pasos, como en el procesamiento por lotes o en el envío escalonado de notificaciones.

Ejemplo:

Tenemos un flujo de trabajo que se divide en 3 etapas o acciones:

Create: creación del proceso. El proceso va a contar con un id y un estado, el estado debe avanzar hasta estado effective para que luego se pueda hacer una acción de finalizado o reversión. Es importante aclarar que el estado de effective del proceso no se da de manera inmediata, puede tardar de 10 a 20 segundos

Execute Action: En este punto el proceso debe estar en estado effective para poder ejecutar la acción. Las acciones permitidas son finish o rollback según sea el caso. Luego de esto el estado del proceso va a ser finishing o rollbacking.

End: esta etapa va a validar que el proceso haya finalizado o se haya revertido exitosamente.

States del ejemplo:

Create: Esté state hace un llamado a una lambda que va a inicializar el proceso

"Create": {
"Type": "Task",
"Resource": "${aws_lambda_function.number_validator_lambda.arn}",
"Parameters": {
"input.$": "$",
"action": "create"
},
"Next": "WaitForExecuteAction"
}

WaitForExecuteAction: Luego de que el proceso es iniciado se debe esperar un tiempo para luego validar el estado actual y ejecutar la acción (finish / rollback)

"WaitForExecuteAction": {
"Type": "Wait",
"Seconds": 10,
"Next": "ExecuteAction"
}

ExecuteAction: luego de la espera se debe ejecutar la lambda que valida el estado actual del proceso, si es effective debe ejecutar la acción sino el flujo debe fallar:

"ExecuteAction": {
"Type": "Task",
"Resource": "${aws_lambda_function.number_validator_lambda.arn}",
"Parameters": {
"number.$": "$.number",
"update.$": "$.update",
"status.$": "$.status",
"action": "execute_action"
},
"Next": "WaitForEnd"
}

WaitForEnd: luego de esto se debe esperar un tiempo adicional para que el proceso quede en finished o rollbacked

"WaitForEnd": {
"Type": "Wait",
"Seconds": 10,
"Next": "EndDeploy"
}

EndDeploy: por último se debe validar que el proceso efectivamente haya finalizado, sino debe fallar el flujo

"EndDeploy": {
"Type": "Task",
"Resource": "${aws_lambda_function.number_validator_lambda.arn}",
"Parameters": {
"number.$": "$.number",
"update.$": "$.update",
"status.$": "$.status",
"action": "end"
},
"Next": "Ended"
},

Ended: paso de finalizado del flujo

"Ended": {
"Type": "Succeed"
}

En resumen, el estado “Wait” en AWS Step Functions es una herramienta poderosa para la gestión eficiente de flujos de trabajo. Su habilidad para manejar pausas tanto fijas como basadas en eventos permite a los desarrolladores construir aplicaciones más inteligentes y responsivas, que pueden reaccionar de manera efectiva a las condiciones cambiantes y a las necesidades del negocio.

Ejemplo completo: https://github.com/jjoc007/poc_step_function_validator/tree/main

Si te gusta dale 👏 al post y ⭐ al repo.

Referencias:

--

--