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 payload
antes de enviarlo a la siguiente etapa de tu workflow
en 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 grandTotal
en un payload
JSON y sabiendo el estado del Stock
enviar o no una notificación:
Primero deberiamos de tener una Lambda con un codigo como este
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
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
JSON
de 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 payload
a 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
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.
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.
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 workflow
que 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 workflow
futuro.
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, 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)