¡Hemos vuelto! (o volvido porque puedo) y les traigo como construir una API simple con un solo endpoint que consume mediante una función lambda (es decir que nuestra API es serverless) en Amazon Web Services contenido desde una base de datos DynamoDB
Asi que arranquemos
Configurar y crear DynamoDB
Tene en cuenta que antes de utilizar Dynamo, es necesario que crees una cuenta gratuita de AWS, la cual te permite utilizar estas herramientas por un valor de casi 5.000 USD en un año (se gastan rapido si no lo controlas, tene cuidado)
Una vez creada tu cuenta, vamos a la barra de busqueda (search) de la consola de AWS y buscamos “DynamoDB”, como aca
Antes se continuar, ¿qué es Dynamo DB?
“Amazon DynamoDB es un servicio de base de datos noSQL ofrecido por Amazon como parte de Amazon Web Services. DynamoDB expone un modelo de datos similar y deriva su nombre de Dynamo (un sistema de almacenamiento interno utilizado inicialmente para su propio sitio web), pero tiene una implementación subyacente diferente. Dynamo tenía un diseño multimaestro que requería que el cliente resolviera conflictos de versiones y DynamoDB usa replicación síncrona en múltiples centros de datos para una alta durabilidad y disponibilidad“
Volviendo a su implementación, una vez que encontramos DynamoDB y le dimos click, vamos al menu lateral izquierdo y hacemos click en “Tables”
Y nos va a abrir a la derecha el siguiente menu
Hacemos click en “Create Table” (el boton naranja) teniendo en cuenta de que en DynamoDB no es necesario crear una base de datos que contenga las tablas, aunque podemos crear un Cluster DAX, que en está ocasión no es necesario.
Una vez que hacemos click a “Create Table” vamos a ver lo siguiente
Completamos los campos con el nombre de tabla que queramos, en este caso la llame “Affirmations” y la partition key va a ser nuestro Id pero vamos a dejarlo como String (al ser NoSQL y no tener una base contenedora, el tipo de dato no es estricto o autoincremental, en este caso)
Una vez creada la tabla, vamos a agregarle contenido, en mi caso van a ser afirmaciones que saque de unos libros de Carl Sagan, y que en general estan buenas cuando nos agarra el sindrome del impostor.
Para agregar contenido, hacemos lo siguiente, nos dirigimos a “Explore Items”, clickeamos en “Create Items”
Y hacemos lo siguiente por cada registro de Dynamo que queramos guardar
En Id, vamos a agregar un numero, 1 para el primer registro, 2 para el siguiente y asi sucesivamente por cada registro nuevo, despues vamos a “Add new atribute” y seleccionamos “string” y en el “Attribute name” vamos a nombrarlo como “Text” y el “Value” contiene el texto que quieras, en este caso una afirmación.
Y asi hasta llenar nuestra tabla, que una vez terminada deberia verse asi

Creando nuestra función Lambda
Una vez cargado el contenido en nuestra base de datos, vamos al buscador de la consola de AWS y buscamos “Lambda”, hacemos click y vamos a ver
Clickeamos en “Create function”, nos va a solicitar un nombre, el tipo de paquete que seleccionamos “Zip” y elegimos el Runtime de Node JS versión 18.x+
Entramos a nuestra función y vamos a “Configuration”, buscamos “Permissions” y abajo de todo tenemos que agregar una nueva “Policy”, en este caso vamos a agregar la que se llama DynamoDB que como la cuenta es nueva, deberia ser la unica, una vez agregada deberia verse asi
Luego vamos a ir a “Code” dentro de nuestra función lambda y agregar el siguiente codigo:
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import {
DynamoDBDocumentClient,
QueryCommand
} from "@aws-sdk/lib-dynamodb";
const client = new DynamoDBClient({});
const dynamo = DynamoDBDocumentClient.from(client);
const tableName = "Affirmations";
function getRandomNumber(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min) + min);
}
export const handler = async (event, context) => {
let body;
let statusCode = 200;
const headers = {
"Content-Type": "application/json",
};
let params = {
ExpressionAttributeValues: {
':id': getRandomNumber(1,37).toString()
},
KeyConditionExpression: 'Id = :id',
TableName : tableName
};
try {
body = await dynamo.send(
new QueryCommand(params)
);
body = body.Items;
} catch (err) {
statusCode = 400;
body = err.message;
} finally {
body = JSON.stringify(body);
}
return {
statusCode,
body,
headers,
};
};
Se puede modificar la linea de los minimos y maximos, que en este caso es (1, 37) por la cantidad de registros en tu tabla, teniendo en cuenta de que al mapear todos los registros de la tabla vamos a lograr que nuestra API nos devuelva una frase de forma pseudo-aleatoria.
Guardamos el codigo y volvemos a la barra de busqueda de la consola de AWS, donde vamos a buscar “API Gateway”
Construyendo nuestra API con API Gateway
Dentro de API Gateway vamos a ver lo siguiente

Seleccionamos “build” para crear una HTTP API y vamos a ver lo siguiente:

En “API name”, vamos a otorgarle un nombre a nuestra API y en “Add integration” vamos a buscar lo siguiente:

Lo que estamos integrando es la función Lambda que creamos en el paso anterior, le hacemos click a “Next” y vamos a ver algo asi
Aca vamos a configurar nuestras rutas, que en este caso va a utilizar el metodo GET y la ruta del endpoint va a llamarse “/items”
Hacemos click en “Next y vamos a ver la definición de instancias
Aca no modificamos nada, dejamos tildado el “Auto-deploy” y clickeamos “Next” que nos va a llevar a la ultima vista de configuración previa a construir nuestra API en AWS que utiliza lambda y DynamoDB
Hacemos el review, bajamos al final y vamos a ver el boton de “Create” en naranja, le hacemos click y esperamos, cuando termine vamos a poder ver en nuestra lista de APIs, lo siguiente
Dentro de nuestra API vamos a ver el link de la misma, en nuestro caso, el link de la API que cree es el siguiente
https://8xvc6u036c.execute-api.us-east-2.amazonaws.com/items
Cada vez que refresquemos el sitio, nos va a devolver un registro diferente de la base de datos, esto se puede consumir con un plugin para leer objetos json en el navegador o mismo con Postman, deberia verse asi
Consuman la API todo lo que quieran, no hay problema, espero que les sirva y lo puedan implementar en sus desarrollos.
También pueden modificar la función lambda si les interesa crear aplicaciones serverless.
¡Hasta la proxima!