DEV Community

Cover image for JSONata y AWS Step Functions: Manipulación de Payloads Paso a Paso
Hector Fernandez CloudparaTodo for AWS Community Builders

Posted on • Edited on

3 1 1 1 1

JSONata y AWS Step Functions: Manipulación de Payloads Paso a Paso

Si ya estás trabajando con AWS Step Functions o tienes conocimiento de Lambda, en esta publicación te diré como puedes hacer transformaciones en tus cargas de trabajo sin utilizar cómputo, un anuncio del pasado re:invent 2024 que vino a cambiar la forma de lo que veníamos haciendo.

Te voy a enseñar la forma de usar JsoNata para transformar tu payloadantes de enviarlo a la siguiente etapa de tu workflowen AWS Step Functions, sin necesidad de usar código, cómputo ni lambdas (ahorrando dinero y dolores de cabezas).


Transformación de Payload

Imagina que debemos extraer el grandTotalen un payload JSON y sabiendo el estado del Stock enviar o no una notificación:

AWS Step Functions Grand total

Primero deberiamos de tener una Lambda con un codigo como este

Lambda function para grandtotal

Para solo usar este código:
const grandTotal = event.Order.Product.reduce((total, product) => {
const itemTotal = product.Price * product.Quantity;
return total + itemTotal;
}, 0);

Luego tener el codigo de Lambda para chequear el stock

Lambda function para chequeo de stock

Todo esto lo estamos haciendo ya que necesitamos hacer ese simple calculo de total y de stock. AL tener estas AWS Lambdas nos supondría costos asociados por la ejecución y la tarea de mantenimiento a flujos que no aportan valor por sí solos.

Pasarás de tener infinitas lambdas, pasando inputs entre pasos, ese resultado pasándolo al paso siguiente y así N cantidad de veces, ahora vas a tener simplemente una transformación directa, y lo mejor de todo: esos resultados los puedes usar posteriormente en otros estados.🤯
Arguments seran tus nuevos inputs, y ahora tus Output podran tener datos de tus variables que veremos en breves.


💻 Breve introducción a JsoNata y AWS Step Functions y.. ¿por qué deberías usarlo?

Primero, lo primero:

AWS Step Functions es un servicio que te permite diseñar flujos de trabajo complejos como en las arquitecturas orientadas a eventos.

JsoNata es una lenguaje perfecto para transformar y manipular datos JSONde manera sencilla.

Cómo saber si tu implementación ya usa JsoNata, debe verse algo así

{% %}

simple ¿No?

Usando estas dos herramientas juntas, te permitirán hacer maravillas sin escribir una sola línea de código la mayoría de las veces. ¡Veamos cómo hacerlo!


Beneficios Clave:

Ahorro de costos: Reduce el uso de cómputo, menos acciones que hacer en tus lambdas por lo tanto menos tiempo de ejecución.

Simplicidad: Simplifica tus flujos de trabajo, haciéndolos más legibles y fáciles de mantener.

Reutilización: Las transformaciones las tendrás que hacer una única vez.

Compatibilidad: Las transformaciones en estados de AWS Step Functions son compatible con casi cualquier servicio disponible en AWS, y JSONAta tambien lo es.


Variables, aprendamos a utilizarlas:

Antes de poder ver cualquier línea de código, STOP. debemos saber que cuando nosotros enviamos un payloada una máquina de estado, está la almacena en una variable reservada llamada States, en particular States.Input esa variable será nuestra forma de poder acceder a los valores recibidos y posteriormente poder hacer alguna modificación si fuese el caso.

Te recomiendo que puedas leer la documentación oficial para entender más sobre esto y en caso de que tengas que cambiar tu enfoque desde JsonPath a JsoNata puedas hacer los cambios necesarios.

Ahora que tenemos acceso a variables, podemos almacenar partes de nuestros cálculos, transformaciones, funcionan de la misma manera que en tu lenguaje de programación favorito funcionan las variables, así que no hay mucho que agregar.


Demo-time: Vamos a modificarlo usando JSONata

La idea es crear este diagrama, como puedes observar mucho más simple
AWS Step functions sin lambda

Que hermoso.... ¿no? sólo un par de interacciones

Para hacer todo esto posible nos estamos valiendo de la siguiente funcion nativa de JSONata llamada $sum()

"GrandTotal": "{% $sum($states.input.Order.Product.(Price * Quantity)) %}"


✨ Truco avanzado

Si quieres probar el flujo, recuerda que en AWS Step Functions tienes la opción de probar el flujo, donde podrás indicar el input y hacer modificaciones en caliente.

Prueba de estado

Este es un ejemplo usando algunas funciones nativas, pero te dejo la tarea que pruebes otros casos usando otro tipo de función.


Decisiones Lógicas en tu Flujo

¿Necesitas que tu flujo tome decisiones basadas en el contenido del payload? JSONata te permite hacer consultas lógicas:

Podemos usar esta nueva funcionalidad, para simplemente hacer una consulta, en este caso preguntamos por el stock de los productos, si el stock recibido es igual a cero, entonces enviamos la notificación, en caso contrario continua el flujo normal.

Preguntas usando JSONata

En este ejemplo estamos usando la función$count para ayudarnos con este cálculo, pero podríamos hacer esto tan complejo como quisiéramos.
Por eso es de suma importancia poder entender bien las funciones de JSONata y cuales de ellas se encuentran disponibles para su uso en AWS Step Functions.

🤖

Te dejo para que practiques estos ejemplos:

  • ¿Qué sucede si solo necesitas ciertos elementos de un array?
  • ¿Quieres limpiar tu JSON de información innecesaria?

Funciones avanzadas JSONata

Explora funciones como $map, $filter, $reduce para transformaciones de datos más complejas.

$map permite transformar cada elemento de un array. Ejemplo: extraer solo los SKU de productos:
"SKUs": "{% $map(States.Input.Order.Product, function($v) { $v.SKU}) %}"

$filter permite seleccionar elementos basados en una condición. Ejemplo: filtrar productos con stock bajo:
"LowStockProducts": "{% $filter(States.Input.Order.Product, function($v) { $v.Stock < 10 }) %}"

$reduce:permite acumular valores. Ejemplo: calcular el peso total de todos los productos:
"TotalWeight": "{% $reduce(States.Input.Order.Product, function($acc, $v) { $acc + $v.Description.Weight }, 0) %}"


✨ Ventajas y Consideraciones

Usar JsoNata sobre Lambda tiene varias ventajas: reduce el tiempo de desarrollo, disminuye costos de computación y mejora la claridad de tus flujos de trabajo. Además, cada transformación se lleva a cabo en el contexto de la ejecución, lo que significa que puedes hacer uso de las variables de estado dinámicamente.
Ojo al estar en tiempo de ejecución del contexto, dependerá del tipo de workflowque tengas definido, por ejemplo no es lo mismo una máquina de estado express que una normal. Si quieres que hablemos sobre esa diferencia déjame saber en los comentarios y lo hablamos en un próximo video.

Integraciones:

DynamoDB: Consultar o modificar datos en DynamoDB directamente desde Step Functions utilizando JSONata para crear las expresiones de consulta.

SQS: Enviar o recibir mensajes de SQS, transformando el payload del mensaje a procesar con JSONata.
S3: Recuperar archivos JSON desde S3 y transformarlos antes de procesarlos en el flujo de trabajo. Altamente útil en ambientes de IA

Todo esto te ayuda a tener menos código de cierta manera que debe ser mantenible en el tiempo y te brinda nuevas oportunidades para adaptar en tu workflowfuturo.


Limitaciones

  • Cada valor no puede superar 256 KB, y el total de las variables no puede superar los 10MB en total. Úsalo oportunamente, ya que anteriormente hasta teníamos que tener un bucket de S3 para almacenar esta info.

  • Las variables solamente se actualizan al finalizar una ejecución de estado, es decir no podemos utilizar una variable dentro de un estado propiamente.

  • La función nativa de Jsonata $eval no está disponible, debes utilizar otras funciones, más detalles en la documentación oficial.

  • Las variables e información guardada durante cada step, tienen un scope limitado, fijate que tu scope o visualización sea acorde a tu caso de uso.


Ahora ya sabes como manipular datos en AWS Step Functions usando JsoNata es más fácil de lo que parece. Menos código, mejor rendimiento.


🤓 Quién soy

Héctor Fernández

Héctor Fernández, AWS Community Builder y creador del Podcast Cloud para todos. Te ayudo a crecer en tu carrera dentro del mundo cloud, te invito a seguirme para leer más contenido como éste.

Connect with me

LinkedIn : https://www.linkedin.com/in/hectorfernandezdev/
GitHub : https://github.com/hectorfernandezdev
Podcast: https://podcast.hectorfernandez.dev/

Top comments (0)