/api, CloudFront se la pasa a una sola máquina EC2. Esa máquina escribe en PostgreSQL, y PostgreSQL solo se oye a sí mismo.
José Medina · Francisco Sandoval · Eraldo Martínez
El teléfono guarda la visita. AWS la recibe cuando vuelve cualquier internet.
Esta página es el procedimiento completo, clic por clic, para los tres. La Sumativa 2 se entrega como informe. La cuenta puede esperar apagada.
L1 a L5 son los cinco recorridos del diagrama lógico. Aprieta uno para dejar solo ese camino.
00Región y alarma, antes de crear nada
Qué significa
La consola se abrió en Estados Unidos (Ohio). El dibujo y el informe dicen São Paulo, código sa-east-1. Una red creada en Ohio no aparece al cambiar de región, y el relato de la memoria quedaría en otro continente.
La alarma es un correo cuando el gasto del mes se acerca a un tope. Se crea primero porque la máquina, una vez encendida, empieza a contar.
Qué se aprieta
- Arriba a la derecha, donde dice Estados Unidos (Ohio), elegir América del Sur (São Paulo).
- Buscar Budgets. Crear un presupuesto de costo, mensual, US$ 5.
- Avisos al correo en 80 % y en 100 %.
- En Facturación, activar la alerta de uso de capa gratuita, por si algún servicio todavía entra.
01La red privada del proyecto
Qué significa
Una VPC es la red propia dentro de AWS. 10.0.0.0/16 reserva un bloque grande. De ese bloque se usa una sola calle, la subred 10.0.1.0/24, en la zona sa-east-1a.
El .1 de esa calle, 10.0.1.1, es la puerta que AWS pone a la subred. La máquina usará 10.0.1.10.
La Internet Gateway es la reja de esa calle hacia internet. Va en la tabla de rutas como destino 0.0.0.0/0. Así la máquina puede contestar a CloudFront.
NAT Gateway es otra caja, con cobro fijo de unas decenas de dólares al mes, para esconder máquinas que no tienen dirección pública. Aquí hay una sola máquina y sí necesita hablar hacia afuera. La casilla queda en ninguno.
Qué se aprieta
- Buscar VPC → Create VPC → VPC and more.
- Nombre:
crm. IPv4 CIDR:10.0.0.0/16. IPv6: ninguno. - Zonas de disponibilidad: 1. Subredes públicas: 1. Subredes privadas: 0.
- NAT gateways: None. VPC endpoints: ninguno.
- Crear. Luego abrir la subred pública y activar Auto-assign public IPv4.
10.0.0.0/16, una subred 10.0.1.0/24, una Internet Gateway y una ruta 0.0.0.0/0 hacia esa reja. NAT en cero.02La cerradura de la máquina
Qué significa
El security group crm-api es la lista de puertas de la máquina. Se permiten dos.
La puerta 80 recibe la página de datos. El origen 0.0.0.0/0 significa cualquier dirección de internet. Hace falta así porque CloudFront, en este plan, no sale siempre desde la misma IP. Quien conozca la IP suelta de la máquina también puede golpear el puerto 80. La base no está detrás de esa puerta.
La puerta 22 es la administración, SSH. El origen es My IP: la dirección desde la que estás mirando la consola. El resto del mundo no entra a configurar el equipo.
El puerto 5432 es PostgreSQL. No se agrega. La base escucha en 127.0.0.1, que significa “solo yo, esta misma máquina”.
Qué se aprieta
- VPC → Security groups → Create. Nombre:
crm-api. VPC:crm. - Entrada: HTTP, puerto 80, origen
0.0.0.0/0. - Entrada: SSH, puerto 22, origen My IP.
- No agregar 5432. No agregar 443 en la máquina.
03La única máquina
Qué significa
EC2 es un computador alquilado. El modelo t4g.micro tiene 2 procesadores pequeños y 1 GiB de memoria, arquitectura Arm. En esta cuenta vieja igual se paga. Sigue siendo el modelo más chico que aguanta Ubuntu y PostgreSQL juntos.
La imagen es Ubuntu Server 24.04, 64-bit (Arm). Si eliges la de 64-bit (x86), el modelo t4g no arranca.
El disco es gp3 de 8 GiB. Alcanza para el sistema, la base de las visitas y la API.
La dirección pública sale sola al encender, porque la subred tiene auto-asignación. Esa dirección cambia cuando la máquina se detiene y se vuelve a prender. Una Elastic IP comprada aparte seguiría cobrando aun con la máquina apagada, así que no se reserva.
La llave crm-tesis.pem es el archivo para entrar por SSH. Se descarga una vez. Sin ese archivo no hay administración.
Qué se aprieta
- EC2 → Launch instance. Nombre:
crm-api. - AMI: Ubuntu Server 24.04, arquitectura Arm.
- Tipo: t4g.micro. Llave nueva:
crm-tesis, tipo RSA. Guardar el.pem. - Red: VPC
crm, subred pública, auto-assign public IP activado. Security group:crm-api. - Disco: 8 GiB gp3. Lanzar.
10.0.1.10 o la que haya asignado la calle 10.0.1.0/24.04La memoria y la puerta de las visitas
Qué significa
Dentro de la máquina viven dos programas. PostgreSQL guarda las visitas. La API es un programa en Python que escucha en el puerto 80 y solo entiende dos pedidos: leer la lista y agregar una visita con objetivo y fecha.
Esa API de demostración todavía no es el panel completo. El panel de la práctica sigue hablando con Firebase hasta un paso posterior. Aquí se prueba el camino de red: internet → máquina → base.
La clave de la base se inventa en el CREATE USER y se copia a mano dentro de /opt/crm_api.py. Si el archivo se queda con el texto CLAVE_LARGA, la API no entra a la base.
Qué se escribe
En PowerShell, junto al archivo .pem:
icacls crm-tesis.pem /inheritance:r icacls crm-tesis.pem /grant:r "$($env:USERNAME):(R)" ssh -i crm-tesis.pem ubuntu@LA_IP_PUBLICA
Ya dentro de Ubuntu:
sudo apt update sudo apt install -y postgresql python3-psycopg2 sudo -u postgres psql -c "CREATE USER crm WITH PASSWORD 'elige_una_clave';" sudo -u postgres psql -c "CREATE DATABASE crm OWNER crm;" sudo -u postgres psql -d crm -c "CREATE TABLE visitas ( id_visita serial primary key, objetivo text, fecha text, creada timestamptz default now() );"
El programa /opt/crm_api.py usa esa misma clave, escucha en 0.0.0.0 puerto 80 y se conecta a 127.0.0.1. Un servicio systemd llamado crm-api lo levanta al encender la máquina.
ss -lntp | grep -E '5432|80' curl -s http://127.0.0.1/api/visitas
127.0.0.1, el 80 aparece en 0.0.0.0, y el curl responde [].05Los archivos de la página
Qué significa
S3 es un cajón de archivos. Ahí se sube el frente de la PWA: HTML, CSS, JavaScript e íconos. El cajón queda cerrado al público. Nadie abre index.html con una dirección directa del cajón.
El nombre del cajón es único en todo AWS. Si crm-agro-tesis-hitr08 ya existe, se le agrega un sufijo.
Subir estos archivos no cambia el panel de la práctica. Ese panel, hoy, sigue leyendo Firestore desde el navegador. Este cajón es el origen estático del diseño en AWS.
Qué se aprieta
- Buscar S3 → Create bucket. Nombre único. Región: São Paulo.
- Dejar marcado Block all public access.
- Subir el contenido de
crm-agricola-tesis\frontendde modo queindex.htmlquede en la raíz del cajón, no dentro de una carpeta extra.
index.html al primer nivel y el acceso público sigue bloqueado.06El nombre que usa el teléfono
Qué significa
CloudFront es el mostrador. Entrega un nombre dxxxx.cloudfront.net. El teléfono y la jefatura usan ese nombre, nunca la IP suelta de la máquina.
Tiene dos orígenes. El primero es el cajón S3, con OAC: un permiso para que solo este mostrador lea el cajón. El segundo es el DNS público de la EC2, por HTTP, puerto 80.
El comportamiento por defecto entrega la pantalla. Un segundo comportamiento, ruta /api/*, manda las visitas a la máquina, sin caché, y acepta GET y POST.
El plan se llama Free. El plan Pro es otro producto, de pago. La franquicia gratuita de CloudFront, del orden de 1 TB y 10 millones de pedidos al mes, cubre una defensa.
Qué se aprieta
- Buscar CloudFront. Crear distribución en el plan Free, precio 0.
- Origen: el bucket. Origin access: OAC. Copiar la política del aviso amarillo y pegarla en el bucket.
- Redirigir HTTP a HTTPS. Documento raíz:
index.html. - Segundo origen: DNS público de la EC2, protocolo HTTP only, puerto 80.
- Behavior
/api/*: ese origen, caché CachingDisabled, métodos GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE.
.cloudfront.net abre la pantalla.07La prueba que demuestra el camino
Qué significa
Primero se escribe una visita a través del nombre público. Después se lee la lista. Si la segunda respuesta trae esa visita, el recorrido L3 y L4 funcionó: el teléfono pudo hablar con la máquina y la máquina pudo hablar con la base.
La pantalla de la PWA, en el mismo nombre, demuestra L1 y L2: CloudFront leyó el cajón.
Esta prueba no enciende los paneles de vendedor y jefatura contra AWS. Esos paneles siguen en Firebase hasta que cada ruta del programa apunte a esta API.
Qué se escribe
curl -s -X POST https://dxxxx.cloudfront.net/api/visitas ^
-H "Content-Type: application/json" ^
-d "{\"objetivo\":\"Visita de prueba\",\"fecha\":\"2026-10-26\"}"
curl -s https://dxxxx.cloudfront.net/api/visitas
id_visita y el GET devuelve esa misma fila. En el navegador, el nombre de CloudFront muestra el frente.08Apagar cuando nadie está practicando
Qué significa
Detener la instancia corta el cobro de la hora y de la IP pública. El disco de 8 GiB sigue existiendo y cobra poco. El cajón S3 y CloudFront se quedan, porque casi no pesan en una demo.
Al volver a encender, AWS le da otra IP pública y otro DNS. El origen de CloudFront que apunta a la máquina hay que actualizarlo con ese DNS nuevo. Si no, la pantalla sigue abriendo y /api falla.
Qué se aprieta
- EC2 → instancias →
crm-api→ Instance state → Stop. - Para la defensa: Start. Copiar el DNS público nuevo.
- CloudFront → origen de la API → pegar ese DNS → esperar a que el estado vuelva a desplegado.
09Qué lleva cada uno al informe
La página explica el armado. El Word sigue siendo la entrega. Donde el informe diga que AWS ya se midió, el texto pasa a diseño: estos pasos son la especificación.
Paso 0 y el cierre. Presupuesto, región, y que la conclusión hable de diseño. Tres horizontes, matriz y TRL 4–5, con la PWA que ya corre como evidencia.
Pasos 1 a 3. VPC, subred, security group, máquina, y las tres imágenes. La tabla de costos en pesos: hora encendida contra mes dejado prendido. El Cisco del laboratorio, 20–40 W, va en otra línea.
Pasos 4 a 7. Cola en el teléfono, subida con cualquier internet, qué guarda la API de prueba y qué sigue en Firebase. Capturas del panel que ya funciona.
| Enlace | De | A | Qué se dice en voz alta |
|---|---|---|---|
| L1 | Celular o PC | CloudFront | Pide la pantalla por HTTPS, puerto 443. |
| L2 | CloudFront | S3 | Lee el HTML en privado. |
| L3 | Celular | EC2 | Manda la visita. El usuario ve 443. La máquina recibe 80. |
| L4 | API | PostgreSQL | Escribe en 127.0.0.1:5432. Ese tramo no sale de la máquina. |
| L5 | La casa del equipo | EC2 | SSH, puerto 22, solo desde My IP. |
Palabras que aparecen en la consola
| VPC | La red propia. Aquí, 10.0.0.0/16. |
|---|---|
| Subred | Una calle de esa red. Aquí, 10.0.1.0/24. |
| Internet Gateway | La reja de la calle hacia internet. |
| NAT Gateway | Una salida de pago para máquinas escondidas. En este diseño la casilla queda en None. |
| Security group | La cerradura. Puertos 80 y 22. Sin 5432. |
| EC2 | La máquina. Una t4g.micro con Ubuntu 24.04 Arm. |
| 127.0.0.1 | La propia máquina. PostgreSQL escucha ahí. |
| S3 | El cajón de los archivos de la página. Cerrado al público. |
| OAC | El permiso para que CloudFront, y solo CloudFront, lea ese cajón. |
| CloudFront | El nombre público. Cierra el HTTPS y reparte pantalla o /api. |
| Elastic IP | Una IP pública reservada. Aquí no se compra: se usa la que viene con la máquina encendida. |
Elaboración del equipo para HITR08. Precios de referencia de t4g.micro en sa-east-1: US$ 0,0134 por hora, más US$ 0,005 por hora de IPv4 pública mientras la instancia está encendida. La página se abre en el navegador y no requiere publicar nada.