De AWS Cognito a DynamoBD usando Disparadores o Triggers

Lucas Lopez
5 min readJul 21, 2018

--

En artículos anteriores vimos como usar AWS Cognito, un servicio de Identidad como Servicio — Identity-As-A-Service. Una de las características de AWS Cognito que me parecen más interesante es el uso de Triggers o Disparadores para extender los flujos por defecto. Estos disparadores son funciones serverless utilizando otro servicio de Amazon, AWS Lambda.

Disparadores en AWS Cognito

Los disparadores de eventos o triggers nos permiten personalizar acciones para enviar un mensaje personalizado, antes o luego de la autenticación o luego de la confirmación. La información completa de los eventos está disponible en la documentación. En nuestro ejemplo vamos a usar el disparador Posterior a la confirmación o Post confirmation.

Tabla en DynamoDB — Parte I

En este ejemplo vamos a ver como se puede generar una entrada en DynamoDB luego de que el usuario confirme la cuenta. La tabla va a guardar la información del usuario registrado. La creación de la tabla y las características de DynamoDB & NoSQL no es parte de este artículo pero es súper simple. Como el resto de los servicios de AWS, se puede realizar directamente desde la consola.

Posterior a la confirmación — Parte I

Lo primero es crear una función en AWS Lambda. Se puede crear usando distintos lenguajes de programación. En este ejemplo vamos a usar Node.JS ya que nos permite usar en editor online.

Luego de creada la función, la misma aparece en las opciones desplegables, solo hace falta seleccionarla y listo. Cuando Cognito invoca a la función, lo hace con un esquema de datos del eventos determinado. Esto es importante para poder definir el caso de prueba.

Política de seguridad

Ahora hay que implementar la lógica de la función pero antes que nada hay que configurar la política de seguridad que le va a permitir a la función lambda acceder a la tabla en DynamoDB. Si no la función va a generar un error cuando tratemos de guardar el registro en la tabla. Las políticas de seguridad se crean y administran desde el servicio IAM de Amazon Web Services.

A continuación como queda el JSON de la política de seguridad

Posterior a la confirmación — Parte II

Ya podemos escribir la función que va a tomar el evento. La función tiene que incluir las librerías necesarias para acceder a DynamoDB.

El código es simple, tenemos que asignar los valores del evento a la estructura que vamos a usar para insertar en DynamoDB y finalmente invocar la función para realizar el insert. Algo que me paso al ser mi primera vez usando DynamoDB, los strings a insertar no pueden ser vacíos. Si queremos que el campo esté en el ítem aunque sea vacío, es necesario insertarlo como null.

Y la función esta lista.

Caso de Test

Para poder probar la función, es necesario que configuremos un caso de prueba que sea igual a los datos que la función va a recibir de Cognito cuando la invoque. La documentación muestra los parámetros para cada uno de los disparadores de Cognito. En nuestro caso, el caso de prueba se ve como a continuación:

Luego de crear el caso de prueba, podemos probar la función.

Prueba completa

Usando la app que armamos en el artículo anterior, al momento de registrar y confirmar el usuario, Cognito va a ejecutar la función antes de retornar a la app. Si comprobamos la tabla en DynamoDB vamos a encontrar los datos que se insertaron desde la función gracias a la información que le paso el disparador.

Tabla en DynamoDB — Parte II

Como extra, veamos que tenemos que hacer si en vez de completar una única tabla queremos afectar dos tablas. Primero tenemos que crear la nueva tabla y modificar la política de seguridad.

Posterior a la confirmación — Parte III

Luego, solo es necesario modificar la función lambda pero hay una salvedad. Al tener que ejecutar en dos tablas, hay que considerar que las llamadas a funciones de DynamoDB son asincrónicas y qué hay que esperar a que terminen ambas. La forma de lograr esto en Node.js es utilizando Promises. En código sería el siguiente.

Para ser sincero, la primera vez escribí un función similar, no tuve en cuenta esta situación y me confundí creyendo que era otro el problema.

Notas finales

Los disparadores o triggers en AWS Cognito son una caracteristica excelente que puede usarse para extender los flujos de gestion de usuarios e identidades mas alla de lo que AWS Cognito ofrece por defecto. La unica consideracion es que las funciones Lambda tienen un costo aparte a Cognito, aunque el free tier incluye una cantidad gratis de ejecuciones de funciones Lambda.

Aclaración

Es muy probable que luego de terminar este articulo cancele la cuenta AWS que use de ejemplo por si prueba algunas de las URL y les da error.

Gracias Totales por leer!!!

Links

Todas las opiniones expresadas son mías y no representan opiniones de ninguna entidad con la que he estado, estoy o estaré afiliado.

All views expressed are my own and do not represent opinions of any entity whatsoever with which I have been, am now, or will be affiliated

--

--

Lucas Lopez

Avid Technologist at heart, a lifetime of projects, experience in software development and project management areas.