Johann F. Rojas
A la fecha, ya liberaron la versión v3 del SDK de AWS. Ahora pueden traer el cliente individual con:
npm install @aws-sdk/client-dynamodb
Dejo el link de la documentación:
Construir una función Lambda que consulte DynamoDB con Serverless Framework es el primer paso para montar un CRUD serverless completo. Aquí aprenderás a refactorizar un proyecto base, instalar el SDK de AWS y escribir tu primera query a una base de datos NoSQL, todo administrado desde un mismo archivo de configuración.
Cómo se conecta la arquitectura serverless del proyecto CRUD
El flujo es directo y vale la pena tenerlo claro antes de tocar código. El usuario envía peticiones HTTP a API Gateway, que enruta hacia cuatro funciones Lambda, y cada Lambda conversa con DynamoDB, una base de datos 100% serverless que encaja perfecto en este stack porque también la administras con Serverless Framework [01:00].
Y aquí viene lo interesante: toda la infraestructura vive bajo la misma herramienta. Eso reduce fricción y te deja un proyecto coherente de punta a punta.
¿Qué es DynamoDB? Es una base de datos NoSQL serverless de AWS que se integra de forma nativa con Lambda y se puede provisionar desde Serverless Framework sin manejar servidores.
Cómo refactorizar el proyecto base para crear la función getUsers
Partiendo del proyecto de la clase anterior, lo primero es darle nombres con sentido. Renombra la carpeta hello-world a getUsers, porque ahora la función traerá usuarios desde una base de datos [02:05].
Después abre tu serverless.yaml y ajusta tres puntos clave:
service a crud-serverless-users para reflejar el objetivo del proyecto.provider con Node.js y conserva el plugin serverless-offline para pruebas locales.getUsers y define el path como users.Este paso parece cosmético, pero te ahorra dolores de cabeza cuando el proyecto crece y aparecen más Lambdas.
Cómo instalar e importar el AWS SDK para hablar con DynamoDB
Para que tu Lambda pueda comunicarse con DynamoDB necesitas el AWS SDK, una librería oficial de Amazon Web Services que agrupa sublibrerías para interactuar con sus servicios [03:40].
Instálalo con npm:
bash npm install aws-sdk --save-dev
Luego, dentro de tu archivo handler.js, importa el SDK y crea un cliente específico para DynamoDB:
javascript const AWS = require('aws-sdk'); const dynamoDB = new AWS.DynamoDB.DocumentClient();
El truco está en usar DocumentClient en lugar del cliente base. Este cliente simplifica la sintaxis de los params y te ahorra escribir tipados de DynamoDB a mano.
¿Qué hace el DocumentClient de DynamoDB? Es un cliente que abstrae los tipos nativos de DynamoDB y te permite trabajar con objetos JavaScript planos al hacer queries, put y get.
Cómo construir el objeto params para hacer una query a DynamoDB
Un params en DynamoDB es el equivalente a una sentencia SQL, pero con la sintaxis propia que define AWS. Pueden volverse complejos, así que apoyarte en la documentación oficial es parte natural del trabajo del desarrollador serverless [05:30].
Buscando DynamoDB JavaScript SDK query encuentras el ejemplo para DocumentClient. A partir de ahí, adapta el objeto a tu caso:
javascript const params = { TableName: 'crud-serverless-users-table', KeyConditionExpression: 'pk = :pk', ExpressionAttributeValues: { ':pk': 1 } };
Lo que estás diciendo en lenguaje plano es: trae el usuario cuya primary key sea igual a 1. Conviene que el TableName siga el mismo nombre del service con un sufijo -table para mantener orden.
Cómo ejecutar la query y devolver la respuesta desde Lambda
DynamoDB expone el método .query() y, como es asíncrono, lo conviertes en promesa con .promise(). La respuesta debe seguir el formato que API Gateway espera de Lambda: un objeto con statusCode y body.
javascript module.exports.getUsers = (event, context) => { return dynamoDB.query(params).promise().then(res => ({ statusCode: 200, body: JSON.stringify({ user: res }) })); };
Fíjate que el body siempre va serializado como string. Es uno de los detalles que más errores genera al iniciar.
Qué errores aparecen al probar la Lambda en local con serverless offline
Al ejecutar serverless offline start y consumir el endpoint dev/users, aparecen tres errores muy típicos. Vale la pena reconocerlos porque te los vas a topar más de una vez [10:15].
handler en serverless.yaml apunta a un nombre de función que ya no existe. La regla es simple: el handler debe ser archivo.nombreDeLaFuncion exactamente igual a como exportas la función.# antes del nombre del atributo sin definirlo en ExpressionAttributeNames. Quitar el numeral resuelve el error.¿Por qué falla mi Lambda con resource not found? Porque el código intenta consultar una tabla de DynamoDB que todavía no se ha provisionado. Necesitas crear la tabla antes de ejecutar la query.
Este último error es justamente la puerta al siguiente paso: provisionar la tabla de DynamoDB desde Serverless Framework y dejarla lista para recibir consultas.
¿Te has topado con alguno de estos errores antes? Cuéntame en los comentarios cuál te dio más pelea al configurar tu primera Lambda con DynamoDB.
var params = { ExpressionAttributeValues: { ':pk': '1' }, KeyConditionExpression: 'pk = :pk', TableName: 'crud-serverless-users-table' };
Johann F. Rojas
A la fecha, ya liberaron la versión v3 del SDK de AWS. Ahora pueden traer el cliente individual con:
npm install @aws-sdk/client-dynamodb
Dejo el link de la documentación:
Daniel C. Patiño
Dynamo documentation:
Afu Tse
Creo que aun no esta disponible el curso de DynamoDB
Me sale "error 500"
Yor Jaggy Castaño Pino
ProfesorHola afutse, puedes referirte a este curso de Databases en AWS donde abordamos lo necesario de DynamoDB para este curso, en la seccion de Introducción a DynamoDB Referencia a DynamoDB
Prontamente tendremos este enlace que nos indicas disponible con un nuevo y radiante curso de DynamoDB :rocket:
Alejandra Paola Rubio Casallas
Cuando ejecuto el comando serverless offline start, me esta generando el siguiente error; Unhandled exception in handler 'get-users'. ✖ UnrecognizedClientException: The security token included in the request is invalid. Alguien sabe como puedo resolverlo?
Jose Luis Castañeda Osornio
Yo ajuste un poco el codigo para poder tener un response y poderlo editar en cualquier parte del codigo
const aws = require('aws-sdk'); const dynamonDB = new aws.DynamoDB.DocumentClient(); const getUsers = async (event, context) => { const response = { "statusCode": 200, "body": '' } let params = { ExpressionAttributeValues: { ':pk': '1' }, KeyConditionExpression: 'pk = :pk', TableName: 'crud-serverless-users-table' }; dynamonDB.query(params).promise().then(res =>{ console.log(res); response.statusCode = 201; response.body = {'user': res}; }) response.body = JSON.stringify(response.body); return response } module.exports = { getUsers }
Gagandeep Dass
Me ha gustado mucho cuando has ido probando paso por paso y mostrando que errores salían, aunque eso hace que el video acabe siendo largo creo que es muy importante que se muestre porque ayuda a entender y comprender un poco mas el codigo.
Cristian Camilo Hernández Ramirez
Plugin example:
I found a plugin called Serverless Prune Plugin
Every time you run
sls deploy
Your lambda gets updated if there's any change.
In the lambda settings (In your AWS console) you will find that there's a section called "Versions"
In that section, AWS saves an immutable capture of your function every time you updated it
The problem is that the number of versions can grow out of hand rather quickly.
With sls prune you will be able to delete those versions and have just the most recent one.
Gonzalo Bartolome Guaimas
Error:
NOTE: The AWS SDK for JavaScript (v2) will be put into maintenance mode in 2023
Solución:
npm uninstall aws-sdk npm install aws-sdk@2.729.0