Contenido del curso

Insertar usuarios en DynamoDB con Lambda POST

Resumen

Insertar usuarios en DynamoDB usando una función Lambda con método POST requiere refactorizar la estructura del proyecto, ajustar el archivo serverless.yml y modificar la lógica del handler. Esta guía te muestra cómo pasar de una Lambda que solo responde GET a un sistema modular con varias funciones desplegadas en AWS.

La idea es simular un escenario real: tú continúas un proyecto que alguien más empezó y necesitas agregar la funcionalidad de creación de usuarios sin romper lo existente.

¿Cómo refactorizar la estructura de carpetas para múltiples Lambdas?

Cuando tu proyecto crece y necesitas funciones para create, read, update y delete, mantener todo en un solo handler deja de ser sostenible. La buena práctica en la industria es crear una carpeta por cada función Lambda [02:00].

Para este caso, creas una carpeta createUsers paralela a getUsers. Dentro copias los archivos base del proyecto: las carpetas de DynamoDB, serverless, node_modules, el package-lock.json y el package.json. Recuerda que el serverless.yml siempre vive en la raíz del proyecto, no dentro de las subcarpetas.

¿Por qué separar cada Lambda en su propia carpeta? Permite código modular, despliegues independientes y facilita el mantenimiento cuando varias personas trabajan en el mismo proyecto.

Una vez movidos los archivos, debes renombrar la función dentro del handler de createUsers para que ya no se llame getUsers. Es un detalle pequeño pero crítico: si dos handlers exportan el mismo nombre, vas a tener conflictos al desplegar.

¿Cómo configurar el serverless.yml para POST y GET?

El archivo serverless.yml deja de tener una sola función y pasa a declarar dos: una para getUsers con método HTTP GET y otra para createUsers con método POST.

Los puntos clave del refactor son:

  • Actualizar la ruta del handler para que apunte a la nueva estructura de carpetas, por ejemplo createUsers/handler.createUsers.
  • Cambiar el método HTTP de cada función según corresponda: GET para consultar, POST para insertar.
  • Simplificar el path: el GET usa /users/{id} mientras que el POST usa solamente /users, porque el ID se genera en el servidor.

Esta separación de rutas y métodos es lo que permite que una misma URL base atienda peticiones distintas según el verbo HTTP.

¿Cómo escribir la lógica del handler para insertar en DynamoDB?

El handler del POST parte del código del GET, pero tiene diferencias importantes. La primera es que el ID del usuario no debe venir en el body de la petición, porque eso abre vulnerabilidades de seguridad. En su lugar, lo generas en el servidor con la función randomUUID de la librería crypto de Node.js [09:00].

javascript import { randomUUID } from 'crypto';

export const createUsers = async (event) => { const id = randomUUID(); const userBody = JSON.parse(event.body); userBody.primaryKey = id;

const params = { TableName: 'usersTable', Item: userBody };

console.log(params.Item); await dynamoDB.put(params).promise();

return { statusCode: 200, body: JSON.stringify({ user: params.Item }) }; };

La segunda diferencia es que para insertar no necesitas expression attribute values ni condition expressions. Eliminas esas líneas y trabajas directamente con un objeto Item. La tercera es que reemplazas la función query por put, que es la operación de DynamoDB para crear registros.

¿Cómo extraigo el body de una petición POST en Lambda? Usas JSON.parse(event.body). El parámetro event trae el cuerpo como string, así que necesitas parsearlo para convertirlo en objeto manipulable.

Incluir un console.log(params.Item) antes del put te permite revisar después en CloudWatch exactamente qué se insertó. Es una práctica útil para debuggear sin abrir la consola de DynamoDB cada vez.

¿Cómo probar la Lambda en local con Postman y Serverless Offline?

Para testear sin desplegar a AWS, ejecutas el comando serverless offline start [16:30]. Esto levanta tanto Serverless como DynamoDB de forma local y te da una URL del tipo http://localhost:3000/dev/users.

En Postman configuras la petición así:

  • Método: POST.
  • URL: la que entrega Serverless Offline.
  • Body en formato raw con sintaxis JSON.
  • Contenido del body con los campos que quieres insertar, por ejemplo nombre, teléfono y dirección.

Un ejemplo de body sería:

{ "name": "Jagui", "phone": "3001234567", "address": "Carrera Séptima con 71-21" }

Si te aparece un error 502 Bad Gateway con el mensaje randomUUID is not a function, revisa la sintaxis del import. Es un error común: debes importar randomUUID como destructuring desde crypto, no como default.

Cuando la respuesta llega con código 200 en aproximadamente 264 milisegundos, ya tienes confirmación de que el usuario se insertó en DynamoDB local con su primary key generado dinámicamente.

¿Cómo optimizar el empaquetado al desplegar a AWS?

Al correr serverless deploy por primera vez notas que el paquete pesa 63 MB. Eso es excesivo, porque estás subiendo la carpeta de DynamoDB local y todos los node_modules, que no se necesitan en producción [22:00].

La solución es usar la propiedad package en el serverless.yml con empaquetado individual y patrones de exclusión:

yaml package: individually: true patterns: - '!dynamodb/' - '!node_modules/'

Con esta configuración, cada Lambda se empaqueta por separado y se excluyen las carpetas pesadas. El resultado baja de 63 MB a 19 MB, una mejora considerable.

¿Qué es Lambda Layers? Es la solución profesional de AWS para compartir dependencias entre funciones Lambda sin duplicar código en cada paquete. Es el siguiente paso natural después del empaquetado individual.

Una vez desplegado, AWS te entrega dos URLs públicas: una para GET y otra para POST. Las pruebas con Postman contra el endpoint en la nube responden en aproximadamente 153 milisegundos, e insertan el usuario en la tabla real de DynamoDB.

Para confirmar que todo el flujo funciona, copias el ID generado en el POST y lo usas en una petición GET con la URL /users/{id}. Si el GET devuelve los datos del usuario recién creado, tu arquitectura serverless con CRUD parcial está lista.

¿Te funcionó la inserción en tu propia base de datos Dynamo? Comparte una captura en los comentarios y cuéntanos qué error encontraste si no salió a la primera.