Backend desarrollado con Spring Boot para la gestión de productos de la plataforma TechStore.
TechStore API es un microservicio REST desarrollado en Java 21 y Spring Boot que permite realizar operaciones CRUD sobre productos. La aplicación se encuentra containerizada mediante Docker y desplegada en AWS utilizando Docker Swarm, GitHub Actions y Amazon ECR.
La solución está compuesta por los siguientes componentes:
- Spring Boot API
- PostgreSQL
- Docker
- Docker Swarm
- GitHub Actions (CI/CD)
- Amazon ECR
- AWS EC2
- Función Serverless (FaaS)
Arquitectura general:
Cliente → API REST (Spring Boot)
↓
Docker Container
↓
Docker Swarm
↓
AWS EC2
↓
PostgreSQL
GitHub
↓
GitHub Actions
↓
Amazon ECR
↓
Docker Swarm
- Java 21
- Spring Boot
- Spring Data JPA
- Spring Security
- JWT
- PostgreSQL
- Maven
- Docker
- Docker Compose
- Docker Swarm
- GitHub Actions
- AWS EC2
- AWS ECR
El proyecto utiliza un Dockerfile Multi-Stage para optimizar el tamaño de la imagen y mejorar la seguridad.
Características:
- Construcción mediante Maven dentro del contenedor.
- Imagen final basada en Eclipse Temurin JRE Alpine.
- Reducción del tamaño de la imagen.
- Separación entre etapa de compilación y ejecución.
Construcción local:
docker build -t techstore-api .Ejecución:
docker run -p 8080:8080 techstore-apiEl proyecto incluye un archivo docker-compose.yml que permite desplegar:
- PostgreSQL
- API Spring Boot
Ejecución:
docker compose up -dSe implementó un pipeline utilizando GitHub Actions.
Ubicación:
.github/workflows/ci-cd.yml
Etapas:
- Descarga del código
- Configuración de Java 21
- Compilación mediante Maven
- Validación de construcción del proyecto
- Verificación automática del repositorio Amazon ECR
- Creación automática del repositorio si no existe
- Construcción automática de imagen Docker
- Publicación automática en Amazon ECR
Las imágenes Docker son almacenadas en Amazon Elastic Container Registry (ECR).
Repositorio:
techstore-api
Tags generados:
latest
github.sha
Se configuró un clúster Docker Swarm compuesto por:
Responsable de:
- Administración del clúster
- Programación de servicios
- Gestión de réplicas
Responsable de:
- Ejecución de contenedores
- Participación en servicios distribuidos
Inicialización:
docker swarm initAgregar Worker:
docker swarm join --token <TOKEN> <IP_MANAGER>:2377Verificar nodos:
docker node lsDesplegar stack:
docker stack deploy -c docker-compose.yml techstoreVer servicios:
docker service lsLa aplicación utiliza variables de entorno para la conexión a PostgreSQL.
Variables:
SPRING_DATASOURCE_URL
SPRING_DATASOURCE_USERNAME
SPRING_DATASOURCE_PASSWORD
SERVER_PORT
Configuración en application.properties:
server.port=${SERVER_PORT:8080}
spring.datasource.url=${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/techstore}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME:postgres}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD:admin123}El proyecto incluye una función serverless desarrollada en Java.
Ubicación:
lambda/
Funcionalidad:
- Recepción de precio y stock.
- Cálculo automático de IVA.
- Cálculo del valor total del inventario.
- Simulación de procesamiento asíncrono empresarial.
Ejemplo de entrada:
{
"precio": 10000,
"stock": 5
}Ejemplo de salida:
{
"precio": 10000,
"stock": 5,
"iva": 1900,
"valorTotalStock": 59500
}La aplicación fue diseñada para ejecutarse sobre Docker Swarm utilizando múltiples réplicas.
Configuración:
deploy:
replicas: 2Beneficios:
- Alta disponibilidad.
- Distribución de carga.
- Recuperación automática ante fallos.
La API utiliza autenticación JWT.
Antes de consumir cualquier endpoint protegido es necesario obtener un token mediante el endpoint de login.
POST http://<IP_PUBLICA_EC2>:8080/auth/login
Content-Type: application/json{
"username": "admin@techstore",
"password": "admin123"
}{
"token": "eyJhbGciOiJIUzI1NiJ9..."
}Una vez obtenido el token, debe utilizarse como Bearer Token en los endpoints protegidos.
Ejemplo:
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...- Obtener la IP pública actual de la instancia EC2.
- Realizar un POST a
/auth/login. - Utilizar las credenciales proporcionadas.
- Copiar el token JWT recibido.
- Configurarlo como Bearer Token en Postman.
- Consumir los endpoints protegidos.
Requisitos:
- Docker
- Docker Compose
- Java 21
- Maven (opcional)
Iniciar servicios:
docker compose up -dAntes de ejecutar el pipeline CI/CD es necesario configurar los siguientes Secrets en GitHub:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_SESSION_TOKEN
AWS_REGION
Los valores dependerán de la cuenta AWS utilizada.
La aplicación se ejecuta sobre instancias EC2.
Debido a que AWS Academy asigna direcciones IP públicas dinámicas, la IP de acceso puede cambiar cuando las instancias son reiniciadas.
Por este motivo es necesario verificar la IP pública actual antes de realizar pruebas.
Ejemplo:
http://<IP_PUBLICA_EC2>:8080
Se realizaron pruebas exitosas de:
- Construcción de imágenes Docker.
- Publicación de imágenes en Amazon ECR.
- Ejecución del pipeline GitHub Actions.
- Despliegue en Docker Swarm.
- Integración de nodos Manager y Worker.
- Consumo de endpoints mediante Postman.
- Autenticación JWT.
- Escalabilidad mediante réplicas Docker Swarm.
Durante el desarrollo se intentó implementar servicios administrados adicionales como AWS RDS y AWS Lambda.
La cuenta AWS Academy utilizada presentaba restricciones IAM que impedían:
- rds:CreateDBInstance
- iam:CreateRole
- iam:PassRole
Por esta razón:
- PostgreSQL fue desplegado dentro del clúster Docker Swarm.
- Se entrega el código fuente completo de la función serverless.
- La arquitectura se adaptó a los recursos disponibles en el entorno académico.
Se implementó un Dockerfile Multi-Stage optimizado utilizando Maven y Eclipse Temurin Alpine para reducir el tamaño de la imagen y mejorar la seguridad.
Se implementó un pipeline en GitHub Actions que automatiza la compilación, construcción y publicación de imágenes Docker en Amazon ECR.
El pipeline realiza la verificación y creación automática del repositorio Amazon ECR utilizado para almacenar las imágenes Docker requeridas por el sistema.
Se configuró un clúster Docker Swarm compuesto por un nodo Manager y un nodo Worker para el despliegue distribuido de servicios.
Se desarrolló una función FaaS en Java para el cálculo de stock valorizado e IVA, incluyendo código fuente, archivos de configuración y documentación para despliegue.
Sebastian Pino Bastian Moya
Proyecto desarrollado para la asignatura de Arquitectura Cloud y Microservicios.