# 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)*
