Initial commit: Terraform infrastructure, pipelines, docs and scripts
This commit is contained in:
@@ -0,0 +1,167 @@
|
||||
# 03 - Infraestructura AWS
|
||||
|
||||
> Descripción detallada de cada recurso de AWS que usa `proyectosacc`.
|
||||
|
||||
---
|
||||
|
||||
## 1. EC2 T3.small
|
||||
|
||||
La **EC2** (Elastic Compute Cloud) es el servidor virtual donde corre la aplicación SACC.
|
||||
|
||||
### Especificaciones
|
||||
- **Tipo de instancia**: `t3.small`
|
||||
- **vCPU**: 2
|
||||
- **RAM**: 2 GB
|
||||
- **Sistema operativo**: Ubuntu 22.04 LTS
|
||||
- **Disco raíz**: 20 GB SSD (`gp3`), con cifrado obligatorio
|
||||
|
||||
### ¿Qué hace?
|
||||
- **Ejecuta la API/backend de SACC** como un servicio de `systemd` (puerto `8080`).
|
||||
- Corre **Nginx Proxy** solo para redirigir las peticiones de la API hacia el backend.
|
||||
- **NO sirve el frontend React** (eso lo hace S3 + CloudFront).
|
||||
- Se conecta a la base de datos RDS para leer y guardar datos.
|
||||
- **Solo acepta conexiones SSH con llaves dedicadas**: el pipeline y los administradores usan un par de llaves SSH generado específicamente para `proyectosacc`. No se permite acceso con contraseña.
|
||||
|
||||
### Dato importante
|
||||
En Cómputo Contable Soft hay una regla obligatoria: **todas las instancias EC2 deben ser de la familia T3**. Esto garantiza el mejor balance entre costo y rendimiento.
|
||||
|
||||
---
|
||||
|
||||
## 2. RDS MariaDB
|
||||
|
||||
La **RDS** (Relational Database Service) es la base de datos gestionada por AWS.
|
||||
|
||||
### Especificaciones
|
||||
- **Motor**: MariaDB
|
||||
- **Tipo de instancia**: `db.t3.micro`
|
||||
- **vCPU**: 2
|
||||
- **RAM**: 1 GB
|
||||
- **Uso**: Base de datos de la aplicación SACC
|
||||
|
||||
### ¿Qué hace?
|
||||
- Guarda todos los datos de la aplicación: usuarios, clientes, productos, facturas, etc.
|
||||
- AWS se encarga de hacer respaldos automáticos, aplicar parches de seguridad y monitorear el rendimiento.
|
||||
|
||||
### Ventaja principal
|
||||
No tenemos que instalar ni mantener MariaDB nosotros mismos en el servidor. AWS lo hace por nosotros.
|
||||
|
||||
---
|
||||
|
||||
## 3. S3 Bucket
|
||||
|
||||
El **S3** (Simple Storage Service) es el almacén de archivos de AWS.
|
||||
|
||||
### ¿Qué guardamos aquí?
|
||||
1. **El frontend React compilado** (`build/`) como un sitio web estático. CloudFront lee estos archivos para servirlos a los usuarios.
|
||||
2. Los archivos compilados (artefactos `.jar`) de la API backend.
|
||||
3. Versiones anteriores por si necesitamos hacer un *rollback*.
|
||||
4. Logs y respaldos temporales.
|
||||
|
||||
### Ejemplo de rutas dentro del bucket
|
||||
```
|
||||
s3://ccsoft-proyectosacc-frontend/index.html
|
||||
s3://ccsoft-artifacts-sacc4/develop/proyectosacc-app-1.0.0.jar
|
||||
```
|
||||
|
||||
### ¿Por qué S3?
|
||||
- Es muy económico.
|
||||
- Es duradero (AWS garantiza que no se pierdan los archivos).
|
||||
- El pipeline puede subir y descargar archivos fácilmente.
|
||||
|
||||
---
|
||||
|
||||
## 4. CloudFront
|
||||
|
||||
**CloudFront** es la red de distribución de contenido (CDN) de AWS.
|
||||
|
||||
### ¿Qué hace?
|
||||
- Distribuye el frontend React desde el bucket S3 a los usuarios de todo el mundo.
|
||||
- Reduce la latencia porque los archivos se sirven desde el "edge location" más cercano al usuario.
|
||||
- Termina el cifrado SSL/TLS (HTTPS) usando el certificado de ACM.
|
||||
- Se conecta a S3 mediante **Origin Access Control (OAC)** para que el bucket no sea público directamente.
|
||||
|
||||
### Relación con S3 y la API
|
||||
CloudFront lee los archivos estáticos (`index.html`, CSS, JS) desde S3. Además, tiene un behavior `/api/*` que redirige las peticiones de la API hacia la EC2. De esta forma, tanto el frontend como el backend comparten el mismo dominio `https://sacc.ccsoft.mx`, pero los usuarios nunca acceden directamente al bucket S3.
|
||||
|
||||
---
|
||||
|
||||
## 5. Route 53
|
||||
|
||||
**Route 53** es el servicio de DNS de AWS.
|
||||
|
||||
### Registro configurado
|
||||
- **Nombre**: `sacc.ccsoft.mx`
|
||||
- **Tipo**: A (Alias)
|
||||
- **Destino**: **CloudFront Distribution** (no la IP de la EC2)
|
||||
|
||||
### ¿Qué hace?
|
||||
Cuando un usuario escribe `https://sacc.ccsoft.mx` en su navegador, Route 53 le dice: "ve a CloudFront". Sin Route 53, los usuarios tendrían que escribir una URL larga de CloudFront.
|
||||
|
||||
---
|
||||
|
||||
## 6. ACM (AWS Certificate Manager)
|
||||
|
||||
**ACM** es el servicio que gestiona certificados SSL/TLS.
|
||||
|
||||
### ¿Qué es un certificado SSL?
|
||||
Es un documento digital que permite que la conexión entre el usuario y el servidor esté cifrada. Se ve como el candadito verde 🔒 al lado de la dirección web.
|
||||
|
||||
### ¿Cómo lo usamos?
|
||||
1. Solicitamos un certificado en ACM para el dominio `sacc.ccsoft.mx`.
|
||||
2. ACM valida que el dominio nos pertenece.
|
||||
3. El certificado se adjunta a la **distribución de CloudFront**.
|
||||
4. Los usuarios acceden por **HTTPS** de forma segura. El certificado ya no vive en Nginx de la EC2.
|
||||
|
||||
---
|
||||
|
||||
## 7. Security Groups
|
||||
|
||||
Un **Security Group** es como un "guardia de seguridad" virtual que controla quién puede entrar y salir de la EC2.
|
||||
|
||||
### Reglas de entrada (inbound)
|
||||
|
||||
| Puerto | Origen | ¿Para qué? |
|
||||
|--------|--------|-----------|
|
||||
| `22` | IP del pipeline / VPN | Conexión SSH para despliegues de la API |
|
||||
| `80` | `0.0.0.0/0` (todo internet) | Tráfico HTTP hacia la API (puede redirigir a HTTPS) |
|
||||
| `443` | `0.0.0.0/0` (todo internet) | Tráfico HTTPS hacia la API |
|
||||
| `8080` | IPs de la VPC / CloudFront | Acceso directo a la API backend |
|
||||
|
||||
> 💡 **Nota**: los puertos `80` y `443` en la EC2 ya no sirven el frontend React. Solo reciben peticiones a la API. El frontend se sirve desde CloudFront.
|
||||
|
||||
### Reglas de salida (outbound)
|
||||
|
||||
| Puerto | Destino | ¿Para qué? |
|
||||
|--------|---------|-----------|
|
||||
| Todo (`0-65535`) | `0.0.0.0/0` | La EC2 puede salir a internet (descargar paquetes, consultar APIs, etc.) |
|
||||
|
||||
### Regla de seguridad importante
|
||||
El puerto `22` (SSH) **solo debe abrirse desde IPs confiables**. Nunca dejarlo abierto a todo el mundo (`0.0.0.0/0`).
|
||||
|
||||
---
|
||||
|
||||
## 8. Nginx Proxy en la EC2
|
||||
|
||||
**Nginx** es un servidor web que en este proyecto actúa como **proxy inverso exclusivo para la API**.
|
||||
|
||||
### ¿Qué hace Nginx?
|
||||
1. Escucha en los puertos `80` y/o `443`.
|
||||
2. Recibe las peticiones dirigidas a la API (por ejemplo, `sacc.ccsoft.mx/api`).
|
||||
3. Redirige el tráfico al backend que corre en el puerto interno `8080`.
|
||||
4. **NO sirve archivos estáticos del frontend React** (eso es trabajo de S3 + CloudFront).
|
||||
|
||||
### Ejemplo mental simple
|
||||
```
|
||||
Navegador/app ──▶ Nginx (443) ──▶ API SACC (8080)
|
||||
```
|
||||
|
||||
### ¿Por qué Nginx y no Apache?
|
||||
En `proyectosacc` se decidió usar **Nginx** porque:
|
||||
- Consume menos memoria RAM.
|
||||
- Es más rápido manejando muchas conexiones simultáneas.
|
||||
- La configuración de proxy inverso es más sencilla.
|
||||
|
||||
---
|
||||
|
||||
*Anterior: [`02-arquitectura-general.md`](02-arquitectura-general.md)*
|
||||
*Siguiente: [`04-usuarios-y-permisos.md`](04-usuarios-y-permisos.md)*
|
||||
Reference in New Issue
Block a user