header_lecciones_v5

Crea una base de datos DynamoDB para desarrollar una app serverless

por Carlos Cardona y Guillermo Grajales, el 16 de septiembre de 2019

base_de_datos_dynamo_para_app_serverless

Hemos llegado al final de nuestro tutorial para crear una aplicación serverless desde cero. En esta última parte aprenderemos cómo crear una base de datos DynamoDB. 

Si te perdiste algún detalle de nuestro tutorial, entra aquí para conocer cómo preparar el entorno de desarrollo, o aquí para saber cómo hospedar una página de Angular en S3, o aquí para crear una función lambda en Node.js  

¿Qué es DynamoDB?

DynamoDB es una base de datos NoSQL y forma parte de Amazon Web Services. Gracias al SDK de AWS puede administrarse en los lenguajes más populares, incluido Javascript. 

Para obtener más información acerca de DynamoDB y su funcionamiento, entra aquí.

Con el fin de mostrar la utilidad de la CLI, esta sección se desarrolla con ella y no con la consola web que se ha venido utilizando a lo largo de esta guía. Para poder acceder a todas las funcionalidades de DynamoDB, es necesario que el perfil con el que se trabaja localmente tenga asociada la política de acceso para DynamoDB.

Crear una tabla

A diferencia de las bases de datos SQL, DynamoDB no necesita que se especifique un esquema para crear una tabla, solamente es necesario establecer una primary key.

En DynamoDB la primary key puede ser simple o compuesta. 

  • Primary key simple: tiene un solo atributo, conocido como partition key. No pueden existir dos elementos con la misma partition key dentro de una tabla.
  • Primary key compuesta: este tipo de key se compone de dos atributos; una partition key y una sort key. En una tabla que tiene estas dos keys pueden existir elementos que tengan la misma partition key, pero la sort key debe ser diferente.

Es importante saber qué tipo de primary key se va a usar antes de crear la tabla. En esta guía se creará una tabla sencilla de usuario con una primary key simple.

Para crear una tabla con la CLI, se usa el comando aws dynamodb create-table. A continuación, se muestra un ejemplo para crear una tabla Users con partition key UserId:

El comando tiene unas opciones que son obligatorias y otras facultativas. Para ver en detalle todas las opciones, se puede visitar el enlace siguiente: comando create-table.

Aquí se explican las opciones que se han usado en el comando para crear la tabla “Usuarios”.

--table-name: especifica el nombre de la tabla

--attribute-definitions: define las keys que va a tener la tabla y el tipo de dato de cada una. Usa la sintaxis de AttributeName=KeyName,AttributeType=number o string o boolean (N, S, B)

--key-schema: define el tipo de cada key establecida con el comando anterior. Usa la sintaxis de AttributeName=KeyName,KeyType=HASH o RANGE (HASH: partition key, RANGE: sort key). 

--provisioned-throughput: capacidad de lectura y escritura sobre la tabla. Especificadas con la sintaxis ReadCapacityUnits=5, WriteCapacityUnits=5. Para obtener más información acerca de estos parámetros, haz clic aquí.

Al ejecutar el comando de creación de tabla, se obtiene algo como lo siguiente:

Guardar datos con Node.js 8

A continuación, se muestra un ejemplo en que se guarda un usuario en la tabla que se acaba de crear.

En el código anterior se configuraron las credenciales para utilizar un perfil específico; además, se estableció la región donde está la base de datos y el endpoint de esta, proporcionado por Amazon. Cabe aclarar que el endpoint incluye la región; en caso de que esta no sea us-east-1, se debe asignar la que se esté trabajando actualmente. 

El resto del código es bastante explicativo por sí solo; se establecen los parámetros que se van a guardar y la tabla en la cual se van a guardar. Es importante destacar que en el ítem por guardar debe establecerse como mínimo la primary key que se haya establecido para la tabla, en este caso UserId. Los demás datos pueden variar de la forma que se quiera.

El código anterior puede ejecutarse con Node.js, teniendo presente que el perfil elegido tenga los permisos para modificar una tabla de DynamoDB. En caso de que solo exista el perfil por defecto (default), no es necesario escribir la parte del código donde se configuran las credenciales.

Una vez se haya ejecutado el código, puedes revisar con la CLI si efectivamente se ha modificado la tabla, usando para ello el comando aws dynamodb scan --table-name NombreTabla

El resultado muestra que efectivamente se agregó el ítem que se especificó en el código.

Leer datos con Node.js 8

Ahora se muestra un ejemplo de cómo leer todos los datos de la tabla Users que se creó anteriormente si al código de la sección anterior se le agrega la siguiente porción:

En este caso, como se quieren leer todos los datos de la tabla, en los parámetros (params), solo se especifica el nombre de la tabla. Se usa el método scan del DocumentClient para leer todos los ítems de la tabla. Al ejecutar el código completo con la porción de código anterior, se obtiene en consola lo siguiente:

El resultado es un JSON con tres keys: Items, Count y ScannedCount. Items es un arreglo con los datos que tiene la tabla, y Count, un número que indica la cantidad de elementos que tiene la tabla.

Se deja a elección del lector terminar las dos operaciones de CRUD restantes: update y delete. Para ello se recomienda la lectura de la documentación de la API de DocumentClient de JavaScript, que puedes encontrar aquí.

 

Ejemplo de aplicación

En esta sección se explicará un ejemplo de un formulario sencillo que permite ingresar los datos básicos de un usuario y guardarlos en la base de datos. Además, en el ejemplo se da la posibilidad de obtener todos los usuarios existentes en la base de datos.

El ejemplo muestra el uso de las funciones lambda, la base de datos DynamoDB y una página hospedada en S3. El repositorio de la aplicación se encuentra en demo_aws.

1. La función lambda

La función lambda de este ejemplo fue desarrollada para aceptar dos métodos HTTP: GET y POST. En el archivo de configuración serverless.yml se observa el evento configurado para aceptar los dos métodos, cada uno de ellos con paths diferentes.

Con base en las secciones anteriores se creó la clase DynamoHelper, que se encarga de guardar y leer a los usuarios.

En el handler se utiliza el parámetro event para determinar si el método con el que se llama a la función es GET o POST.

Se declaró la constante headers para enviar en la respuesta, de acuerdo con lo que se explicó aquí.

2. La base de datos

En este ejemplo se utilizó la misma tabla que se creó anteriormente. El formulario tiene campos de nombre, apellido, correo electrónico y cédula. La cédula se utilizó como el UserId.

Los demás parámetros se configuraron así:

  • Nombre: firstName
  • Apellido: lastName
  • Correo electrónico: email

3. Página hospedada en S3

El repositorio contiene una carpeta llamada frontend. En dicha carpeta está el proyecto de Angular. Antes de compilar y subir el proyecto al bucket de S3, debe realizarse una modificación en el archivo aws-lambda.service.ts, específicamente en la porción de código que se muestra a continuación: 

Después de modificar el endpoint, se debe compilar el proyecto y subir al bucket que hospeda la página web los archivos que se mencionaron antes.

Resultado al leer los usuarios:

Y este es el fin de nuestra lección para crear una app serverless desde cero. 

Guía para crear una aplicación serverless en 4 pasos

Temas:Tecnologia e Innovación

Lecciones Pragma

Lecciones en Academia Pragma

Aquí encontrarás tutoriales técnicos para que apliques en temas de desarrollo de software, cloud, calidad en software y aplicaciones móviles. 

También puedes visitar nuestro Blog con contenido actual sobre Transformación Digital, Marketing, Conocimiento de Usuario y más. 

Blog

Suscríbete a la academia

Descarga la Guía para trabajar con ambientes IBM Websphere Portal