HITR08 · Cómo se arma en AWS Empieza por el dibujo

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.

Qué es cada cosa, en una frase El celular pide la pantalla a CloudFront. CloudFront la saca de un cajón privado en S3. Si la dirección empieza por /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.
Cuenta de cuatro años La capa gratuita de EC2 ya venció. En São Paulo una t4g.micro encendida sale cerca de US$ 0,013 por hora, más US$ 0,005 de la IP pública. Apagada, ese cobro se detiene.
demarcación Celular PWA y cola local PC jefatura el mismo nombre Cualquier internet LTE o Wi-Fi CloudFront nombre público · HTTPS puerto 443 S3 privado HTML, CSS, JS sin enlace público VPC 10.0.0.0/16 · calle 10.0.1.0/24 · São Paulo SG EC2 · API 10.0.1.10 · puerto 80 PostgreSQL 127.0.0.1 :5432

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.

Si preguntanSão Paulo acerca el servicio a Chile. Ohio saldría más barato por hora, y el proyecto igual lo deja escrito en sa-east-1.

Qué se aprieta

  1. Arriba a la derecha, donde dice Estados Unidos (Ohio), elegir América del Sur (São Paulo).
  2. Buscar Budgets. Crear un presupuesto de costo, mensual, US$ 5.
  3. Avisos al correo en 80 % y en 100 %.
  4. En Facturación, activar la alerta de uso de capa gratuita, por si algún servicio todavía entra.
Quedó bien siEl selector dice São Paulo y el presupuesto aparece en US$ 5.
Se cobra siSe crea la máquina antes de esta alarma y se deja encendida.

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.

Si preguntanUna subred pública es una calle cuya ruta de salida apunta a la Internet Gateway. Pública no significa que cualquiera entre: eso lo decide la cerradura del paso 2.

Qué se aprieta

  1. Buscar VPC → Create VPC → VPC and more.
  2. Nombre: crm. IPv4 CIDR: 10.0.0.0/16. IPv6: ninguno.
  3. Zonas de disponibilidad: 1. Subredes públicas: 1. Subredes privadas: 0.
  4. NAT gateways: None. VPC endpoints: ninguno.
  5. Crear. Luego abrir la subred pública y activar Auto-assign public IPv4.
Quedó bien siHay una VPC 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”.

Si preguntan por el 443 del dibujoEl teléfono ve HTTPS en el puerto 443. Ese cierre ocurre en CloudFront. La máquina recibe el encargo ya en el puerto 80. El 443 del diagrama es la vista del usuario. El 80 es la vista de la instancia.

Qué se aprieta

  1. VPC → Security groups → Create. Nombre: crm-api. VPC: crm.
  2. Entrada: HTTP, puerto 80, origen 0.0.0.0/0.
  3. Entrada: SSH, puerto 22, origen My IP.
  4. No agregar 5432. No agregar 443 en la máquina.
Quedó bien siLa lista de entrada tiene dos reglas y nada más.

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

  1. EC2 → Launch instance. Nombre: crm-api.
  2. AMI: Ubuntu Server 24.04, arquitectura Arm.
  3. Tipo: t4g.micro. Llave nueva: crm-tesis, tipo RSA. Guardar el .pem.
  4. Red: VPC crm, subred pública, auto-assign public IP activado. Security group: crm-api.
  5. Disco: 8 GiB gp3. Lanzar.
Quedó bien siLa instancia dice Running y tiene una IPv4 pública. En la ficha de red, la privada es 10.0.1.10 o la que haya asignado la calle 10.0.1.0/24.
Se cobra siSe elige un balanceador, una IP elástica suelta, RDS, Client VPN o un NAT “para que quede más seguro”.

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
Quedó bien si5432 aparece en 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

  1. Buscar S3 → Create bucket. Nombre único. Región: São Paulo.
  2. Dejar marcado Block all public access.
  3. Subir el contenido de crm-agricola-tesis\frontend de modo que index.html quede en la raíz del cajón, no dentro de una carpeta extra.
Quedó bien siAl abrir el cajón se ve 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

  1. Buscar CloudFront. Crear distribución en el plan Free, precio 0.
  2. Origen: el bucket. Origin access: OAC. Copiar la política del aviso amarillo y pegarla en el bucket.
  3. Redirigir HTTP a HTTPS. Documento raíz: index.html.
  4. Segundo origen: DNS público de la EC2, protocolo HTTP only, puerto 80.
  5. Behavior /api/*: ese origen, caché CachingDisabled, métodos GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE.
Quedó bien siLa distribución pasa a Enabled y el nombre .cloudfront.net abre la pantalla.
Se cobra siEl asistente queda en el plan Pro, o si se agrega Route 53 solo para tener un dominio propio.

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
Quedó bien siEl POST devuelve un 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

  1. EC2 → instancias → crm-api → Instance state → Stop.
  2. Para la defensa: Start. Copiar el DNS público nuevo.
  3. CloudFront → origen de la API → pegar ese DNS → esperar a que el estado vuelva a desplegado.
Quedó bien siLa instancia dice Stopped y el presupuesto no sigue subiendo por hora.

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.

José

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.

Francisco

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.

Eraldo

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.

El banco de defensaCisco 1800, MikroTik, laptop y celulares prueban VLANs en la mesa. No reemplazan esta VPC y no son el producto que se ofrece.
EnlaceDeAQué se dice en voz alta
L1Celular o PCCloudFrontPide la pantalla por HTTPS, puerto 443.
L2CloudFrontS3Lee el HTML en privado.
L3CelularEC2Manda la visita. El usuario ve 443. La máquina recibe 80.
L4APIPostgreSQLEscribe en 127.0.0.1:5432. Ese tramo no sale de la máquina.
L5La casa del equipoEC2SSH, puerto 22, solo desde My IP.

Palabras que aparecen en la consola

VPCLa red propia. Aquí, 10.0.0.0/16.
SubredUna calle de esa red. Aquí, 10.0.1.0/24.
Internet GatewayLa reja de la calle hacia internet.
NAT GatewayUna salida de pago para máquinas escondidas. En este diseño la casilla queda en None.
Security groupLa cerradura. Puertos 80 y 22. Sin 5432.
EC2La máquina. Una t4g.micro con Ubuntu 24.04 Arm.
127.0.0.1La propia máquina. PostgreSQL escucha ahí.
S3El cajón de los archivos de la página. Cerrado al público.
OACEl permiso para que CloudFront, y solo CloudFront, lea ese cajón.
CloudFrontEl nombre público. Cierra el HTTPS y reparte pantalla o /api.
Elastic IPUna 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.