Este proyecto fue desarrollado como parte de la asignatura de Tecnologías del lado del servidor: Cloud Computing dentro del Máster Universitario en Informática Móvil (MIMO). El objetivo fue implementar una API REST completa utilizando Node.js y Express, con autenticación mediante JWT, persistencia en SQLite y despliegue en AWS siguiendo buenas prácticas de escalabilidad y automatización.
Objetivos del proyecto
- Implementar una API REST conforme a una especificación OpenAPI.
- Gestionar autenticación y autorización con JWT.
- Implementar operaciones CRUD para los recursos de películas y valoraciones.
- Aplicar validaciones de datos y manejo adecuado de códigos de estado HTTP.
- Desplegar la API en AWS con una infraestructura escalable y automatizada usando Packer y Terraform.
Funcionalidades principales
1. Autenticación y seguridad
- Endpoint de login (
POST /sessions) para generar tokens JWT. - Protección de rutas sensibles mediante middleware de autenticación.
- Manejo de errores de autenticación con respuestas adecuadas (
401 Unauthorized).
2. Gestión de películas (/movies)
- GET /movies: Devuelve todas las películas con los campos requeridos (ID, título, género, duración, rating).
- Paginación opcional para mejorar la eficiencia en consultas grandes.
- Manejo de errores con respuestas adecuadas (
404 Not Found,500 Internal Server Error).
3. Gestión de valoraciones (/ratings)
- CRUD completo para que los usuarios puedan crear, leer, actualizar y eliminar valoraciones.
- Validaciones:
ratingdebe estar entre 0 y 5.comentarioscon máximo 500 caracteres.
- Restricciones de acceso:
- Solo usuarios autenticados pueden modificar o eliminar sus valoraciones.
- Manejo de errores con códigos adecuados (
401 Unauthorized,422 Unprocessable Entity,201 Created).
4. Gestión de la lista de películas por ver (/watchlist)
- Permite a los usuarios añadir y gestionar películas pendientes de ver.
- Validación de IDs de películas antes de añadirlas.
- Manejo de estados de películas vistas/no vistas.
- Respuestas adecuadas:
409 Conflictpara películas duplicadas.422 Unprocessable Entitypara IDs inválidos.404 Not Foundpara películas inexistentes.
Implementación técnica
Tecnologías utilizadas
- Node.js + Express: Desarrollo de la API REST.
- SQLite: Base de datos ligera y eficiente.
- JWT (jsonwebtoken): Implementación de autenticación.
- Docker: Contenerización del entorno de desarrollo.
- AWS (EC2, S3, IAM): Infraestructura en la nube.
- Packer: Creación de imágenes AMI para AWS.
- Terraform: Automatización del despliegue en la nube.
Persistencia y base de datos
- Uso de SQLite para almacenar información de usuarios, películas y valoraciones.
- Migraciones y esquema definido para garantizar la integridad de los datos.
- ORM Sequelize para facilitar la gestión de la base de datos.
Despliegue en AWS
1. Creación de AMI con Packer
Se generó una Amazon Machine Image (AMI) con la configuración necesaria para ejecutar la API:
- Instalación de Node.js y dependencias.
- Configuración del entorno y variables necesarias.
- Creación de un script para la ejecución automática del servicio.
2. Infraestructura con Terraform
Se implementó la infraestructura con Terraform, asegurando escalabilidad y automatización:
- Instancia EC2 configurada con la AMI generada.
- Balanceador de carga para distribuir el tráfico.
- Auto Scaling Group para aumentar o reducir instancias según demanda.
- Almacenamiento en RDS para persistencia de datos en la nube.
- Gestión de IAM roles y permisos para garantizar la seguridad.
Automatización y escalabilidad
- Infraestructura autoscalable que permite ajustar el número de instancias en función de la carga.
- Manejo de errores para garantizar alta disponibilidad y minimizar tiempos de inactividad.
- Persistencia de datos asegurada con almacenamiento en AWS.
Conclusiones y aprendizajes
Este proyecto permitió consolidar conocimientos en desarrollo backend con Express, autenticación JWT, bases de datos SQL, así como en infraestructura cloud y automatización del despliegue en AWS. Se aplicaron buenas prácticas de seguridad, validaciones de datos y manejo de errores, logrando un sistema robusto y escalable.