Durante siete módulos has seguido a Marta, a Dani y a Lucía. Has visto cómo AlpinaShop pasó de un servidor alquilado en un proveedor español a una plataforma en Google Cloud con entrega continua, observabilidad, SLO, gobierno y una factura un 60 % más baja. Has visto las decisiones y también los errores: el MIG que se arrastró cinco módulos, el endpoint de recomendaciones que hubo que apagar, la clave de cuenta de servicio perdida durante catorce meses.

Pero has visto decidir a otros.

Este módulo es distinto. Aquí no hay una AlpinaShop a la que seguir: hay un folio en blanco, un conjunto de restricciones y una fecha. Vas a elegir un problema, diseñar una solución, construirla, probarla, desplegarla, medirla, pagarla y defenderla. De principio a fin, tú solo.

Y hay una razón práctica por la que esto importa más que cualquier lección anterior: nadie te va a contratar por haber leído sobre Cloud Run. Te van a contratar porque puedes enseñar una URL que funciona, un repositorio con la infraestructura escrita como código, un panel con métricas reales y una factura de 14 € al mes que sabes explicar línea a línea. Eso es un portafolio. Lo demás son apuntes.

Esta primera lección es el pliego de condiciones del proyecto. Define qué se te pide, con qué requisitos mínimos, bajo qué límite de coste, con qué entregables, con qué rúbrica te vas a evaluar y en qué plazo. Léela entera antes de escribir una línea de código o de crear un solo proyecto de GCP. Es literalmente la lección que evita que dentro de tres semanas tengas medio sistema y ninguna idea de si está bien.

Contenido

  1. Qué se te pide exactamente y por qué así
  2. Cómo elegir el problema: criterios de un proyecto de portafolio que funciona
  3. Cuatro propuestas desarrolladas
  4. Traer tu propio problema (y la advertencia que no puedes saltarte)
  5. Requisitos funcionales mínimos obligatorios
  6. Requisitos no funcionales obligatorios
  7. La restricción de coste: el requisito que más te va a enseñar
  8. Entregables y su formato
  9. La rúbrica de evaluación
  10. Planificación: esfuerzo por fase y cronograma
  11. Gestión del riesgo: los cinco errores que hunden un proyecto final
  12. Cómo trabajar con la documentación oficial
  13. Qué hacer cuando algo no funciona
  14. Tu decisión de hoy

  1. Qué se te pide exactamente y por qué así

El encargo, en una frase:

Construye en Google Cloud, de principio a fin y con tus propias manos, una plataforma completa para un problema que tú elijas, recorriendo las mismas etapas que has visto recorrer a AlpinaShop, y déjala documentada, medida, segura y reproducible desde cero.

No es "haz una demo". Una demo es un contenedor desplegado en Cloud Run con gcloud run deploy y una captura de pantalla. Eso lo hace cualquiera en veinte minutos y no demuestra nada, porque el trabajo real no está en desplegar: está en todo lo que rodea al despliegue.

Lo que sí demuestra criterio es esto:

Lo que enseña una demo Lo que enseña un proyecto completo
Sabes ejecutar un comando Sabes elegir entre tres servicios y justificarlo
Tienes algo desplegado Puedes volver a desplegarlo desde cero sin acordarte de nada
Funciona ahora Sabes cuándo deja de funcionar y te enteras antes que el usuario
No sabes lo que cuesta Sabes lo que cuesta por unidad de negocio
Los permisos son owner Cada carga de trabajo tiene el mínimo privilegio, sin claves JSON
Está en tu portátil Está en un repositorio, con historial y con pruebas

El proyecto está diseñado para tocar todas las capas del curso, no para profundizar en una. Es deliberado: un proyecto que solo demuestra BigQuery compite con miles de proyectos que demuestran BigQuery. Un proyecto que demuestra que sabes conectar cómputo, datos, identidad, red, entrega y observabilidad —y explicar por qué cada pieza está donde está— compite con muy pocos.

Cuánto tiempo cuesta. Entre 40 y 60 horas de trabajo real si vas por primera vez. Repartidas en 4-6 semanas a ritmo de tarde suelta y fin de semana, es perfectamente factible. Si te salen 15 horas, es que estás haciendo una demo. Si te salen 150, es que el alcance se te ha ido de las manos, y hay una sección entera sobre eso más abajo.

Qué NO se te pide. Conviene decirlo pronto, porque la mitad del riesgo de este módulo es hacer de más:

  • No se te pide una aplicación bonita. Una interfaz fea pero funcional puntúa igual que una preciosa.
  • No se te pide un modelo de machine learning propio. Una API preentrenada cumple el requisito de IA.
  • No se te pide alta disponibilidad multirregión. Una región basta y sobra.
  • No se te pide Kubernetes. Cloud Run es la opción recomendada por defecto.
  • No se te pide un volumen de datos grande. Mil filas ficticias demuestran lo mismo que diez millones y cuestan cero.
  • No se te pide que esté "terminado" en el sentido de un producto. Se te pide que esté completo en el sentido de que todas las capas existen y funcionan juntas.

  1. Cómo elegir el problema: criterios de un proyecto de portafolio que funciona

La elección del problema es la decisión con más consecuencias de todo el módulo, y se toma en la primera hora. Un mal problema convierte el proyecto en una tortura de seis meses; uno bueno lo convierte en cuatro fines de semana entretenidos.

Cinco criterios, en orden de importancia:

Criterio 1 — Entiendes el dominio sin tener que investigar

Si eliges "plataforma de trading algorítmico" y no sabes qué es un libro de órdenes, vas a gastar el 70 % del tiempo aprendiendo finanzas en lugar de aprendiendo GCP. El dominio debe ser tan obvio para ti que puedas escribir los requisitos funcionales de memoria en veinte minutos.

Buenos dominios: reservas, catálogos, inventarios, incidencias, seguimiento de flotas, cursos, citas, gestión de socios. Todo el mundo entiende cómo funciona una reserva.

Malos dominios: cualquier cosa con normativa compleja (sanidad real, banca, seguros), cualquier cosa con algoritmos que son el producto (motores de recomendación de verdad, optimización de rutas óptima), cualquier cosa que dependa de una integración externa que no controlas.

Criterio 2 — El alcance cabe en una frase sin la palabra "y"

Prueba a describir tu proyecto en una frase. Si necesitas dos "y", ya es demasiado grande.

  • ✅ "Una plataforma donde los usuarios reservan plazas en refugios de montaña."
  • ⚠️ "Una plataforma donde los usuarios reservan plazas en refugios y los guardas gestionan disponibilidad y hay un marketplace de guías."
  • ❌ "Un ERP para la gestión integral de refugios."

El alcance se recorta antes de empezar, no a mitad. Recortar a mitad significa tirar trabajo hecho.

Criterio 3 — Puedes generar datos ficticios plausibles

Vas a necesitar datos para la base de datos operativa, para el almacén analítico y para el componente de IA. Si tu dominio necesita datos que no puedes inventar de forma creíble (imágenes médicas etiquetadas, transacciones bancarias reales), cambia de dominio.

Un buen proyecto se puede sembrar con un script de 60 líneas de Python que genere 2.000 filas coherentes: fechas que tienen sentido, importes en un rango razonable, distribución con algo de estacionalidad para que el cuadro de mando no salga plano.

Criterio 4 — Ejercita varias capas de forma natural

El requisito de "aplicación + almacenamiento + base de datos + datos + analítica + IA" debe salir del problema, no forzarse encima. Si tienes que inventar una excusa para meter Pub/Sub, el proyecto está mal elegido.

Pregúntate: ¿hay algo que ocurra de forma asíncrona? ¿Hay ficheros que subir? ¿Hay algo que analizar históricamente? Si las tres respuestas son sí, el proyecto encaja solo.

Criterio 5 — Te apetece

Vas a pasar 50 horas con esto, muchas de ellas depurando permisos IAM a las once de la noche. Si el tema te aburre el primer día, el proyecto no se termina. Este criterio parece blando y es el que más proyectos mata.

La tabla de decisión

Puntúa cada idea que se te ocurra de 1 a 5 en cada criterio. Si alguna columna saca menos de 3, descártala:

Idea Dominio conocido Alcance acotado Datos ficticios Varias capas Interés Total
Reservas de refugios 5 5 5 4 4 23
Plataforma de trading 2 2 2 5 4 15
Portal de clínica veterinaria 4 4 5 5 3 21
Red social generalista 5 1 3 4 3 16

  1. Cuatro propuestas desarrolladas

Si no tienes una idea propia clara, usa una de estas cuatro. Están dimensionadas para el módulo, tienen datos inventables y ejercitan todas las capas obligatorias. Las cuatro son ficticias.

Propuesta A — RefugioReserva (plataforma de reservas de refugios de montaña)

El problema. Una federación ficticia de montañismo gestiona 12 refugios en el Pirineo. Hoy las reservas se hacen por teléfono y se apuntan en una hoja de cálculo por refugio. Hay sobreventa, no se sabe la ocupación real hasta que llega el fin de semana, y no hay forma de saber qué refugios funcionan mejor.

Qué construyes.

  • Web pública donde un excursionista busca refugio y fecha, ve plazas libres y reserva.
  • Zona privada donde el guarda de cada refugio consulta las reservas del día.
  • Subida de fotos del refugio a un bucket, con generación de miniaturas.
  • Cada reserva publica un evento que alimenta el almacén analítico.
  • Cuadro de mando de ocupación por refugio, mes y tipo de plaza.
  • Componente de IA: análisis de sentimiento de las opiniones que dejan los excursionistas (API preentrenada) o etiquetado automático de las fotos.

Datos ficticios. 12 refugios con nombre, coordenadas y capacidad; 2.000 reservas repartidas en 18 meses con estacionalidad de verano; 400 opiniones en texto libre.

Dificultad: media-baja. Es la propuesta de referencia de este módulo y la que se usa en todas las soluciones de los ejercicios.

Lo interesante que enseña. La gestión de la disponibilidad tiene una condición de carrera real (dos personas reservando la última plaza), lo que da pie a una transacción de verdad y a una prueba de integración con sentido.

Propuesta B — VetPortal (portal de una clínica veterinaria)

El problema. Una cadena ficticia de tres clínicas veterinarias necesita gestionar las fichas de los animales, las citas y las historias clínicas. Hoy usan un programa de escritorio instalado en un ordenador por clínica, sin acceso remoto.

Qué construyes.

  • Web autenticada donde el personal da de alta animales y propietarios, y agenda citas.
  • Subida de radiografías y fotos de la evolución de una lesión a un bucket con clase de almacenamiento por antigüedad.
  • Recordatorios de cita: la creación de una cita publica un mensaje que dispara un envío simulado.
  • Cuadro de mando de ocupación de agenda, motivos de consulta más frecuentes y facturación por clínica.
  • Componente de IA: extracción de entidades del texto libre de la historia clínica (API de lenguaje natural) para etiquetar diagnósticos, o clasificación de las imágenes subidas.

Datos ficticios. 3 clínicas, 8 veterinarios, 600 animales, 3.500 citas históricas, 1.200 notas clínicas en texto libre.

Dificultad: media.

⚠️ Aviso importante para esta propuesta. Aunque los datos de animales no son datos personales, los de sus propietarios sí lo son. Trabaja exclusivamente con nombres, teléfonos, correos y direcciones inventados. No copies una base de datos real de ninguna clínica, ni "anonimizada": la anonimización mal hecha es reidentificable y te mete en un problema de RGPD que no tiene nada que ver con aprender GCP.

Propuesta C — RutaFlota (gestor de flotas de reparto)

El problema. Una empresa ficticia de reparto de última milla con 30 furgonetas quiere saber dónde están sus vehículos, qué entregas llevan hechas y cuánto tarda cada ruta.

Qué construyes.

  • Ingesta de posiciones: un simulador publica cada 30 segundos la posición de cada furgoneta en un topic.
  • Servicio web con un mapa que muestra el estado actual de la flota y el detalle de cada ruta.
  • Almacenamiento de los albaranes firmados (imágenes) en un bucket.
  • Base de datos operativa con vehículos, rutas, paradas y entregas.
  • Cuadro de mando de puntualidad, kilómetros por ruta y entregas fallidas por motivo.
  • Componente de IA: OCR sobre los albaranes escaneados (API de visión) para extraer el número de pedido.

Datos ficticios. 30 vehículos, 12 rutas, 90 días de histórico con unas 400 entregas diarias, y un generador de posiciones GPS que sigue trayectorias plausibles.

Dificultad: media-alta. Es la propuesta con más volumen de datos y la que más ejercita el streaming, pero también la que más fácilmente se dispara de coste si dejas el simulador encendido. Léelo como una advertencia: aquí el requisito de coste es parte del reto.

⚠️ La posición geográfica de una persona identificable es un dato personal de categoría sensible. Trabaja con vehículos y conductores inventados, nunca con datos reales de una flota.

Propuesta D — AulaViva (plataforma de cursos online)

El problema. Una escuela ficticia de formación técnica quiere sustituir su montaje de vídeos en un disco compartido y matrículas por correo por una plataforma propia.

Qué construyes.

  • Catálogo público de cursos y zona privada del alumno con su progreso.
  • Materiales (PDF, vídeos) en un bucket, servidos con CDN y URL firmadas.
  • Base de datos operativa con cursos, lecciones, matrículas y progreso.
  • Eventos de "lección completada" que alimentan el almacén analítico.
  • Cuadro de mando de tasa de finalización por curso, lecciones donde la gente abandona y actividad semanal.
  • Componente de IA: generación de un resumen automático de cada lección con un modelo generativo, o búsqueda semántica sobre el contenido mediante embeddings.

Datos ficticios. 20 cursos, 250 lecciones, 800 alumnos y 40.000 eventos de progreso.

Dificultad: media. Es la propuesta que más se parece a este mismo curso, lo que la hace fácil de razonar y difícil de que te sorprenda.

Comparativa rápida

RefugioReserva VetPortal RutaFlota AulaViva
Dificultad Media-baja Media Media-alta Media
Horas estimadas 40-50 45-55 55-70 45-55
Riesgo de coste Bajo Bajo Alto Medio (CDN, vídeos)
Ejercita streaming Poco Poco Mucho Medio
Ejercita IA Sentimiento Entidades Visión/OCR Generativa
Dato personal implicado Bajo Alto Alto Medio
Recomendada si… Es tu primer proyecto en la nube Te interesa el dato estructurado Te interesa el tiempo real Te interesa la IA generativa

  1. Traer tu propio problema (y la advertencia que no puedes saltarte)

Traer un problema propio es la mejor opción si cumples los cinco criterios de la sección 2. Un proyecto que resuelve algo que tú entiendes y te importa se defiende mucho mejor en una entrevista que una plantilla, porque en cuanto te preguntan "¿y por qué esto?" tienes una respuesta de verdad.

Pero hay una línea que no se cruza:

⚠️ No uses datos reales de tu empresa, ni de la empresa de nadie.

Ni una exportación "que ya está anonimizada". Ni un volcado de la base de datos de desarrollo. Ni el fichero de clientes con los nombres cambiados. Ni las conversaciones del sistema de soporte "que no llevan nombres".

Tres motivos, cualquiera de ellos suficiente:

  1. Legal. El RGPD no distingue entre "producción" y "un proyecto que estoy haciendo para aprender". Si tratas datos personales necesitas base jurídica, finalidad, minimización y una relación contractual con el encargado del tratamiento. Un proyecto de portafolio en tu cuenta personal de GCP no tiene nada de eso.
  2. Contractual. Casi cualquier contrato laboral o de confidencialidad prohíbe sacar datos de la empresa a un entorno que la empresa no controla. Tu proyecto de GCP es exactamente eso.
  3. Práctico. Un proyecto de portafolio se enseña. Se pone en GitHub, se comparte la URL, se proyecta en una entrevista. Si contiene datos reales, acabas de publicarlos.

Lo que sí puedes hacer: replicar la estructura del problema real con datos inventados. El esquema, los flujos, las reglas de negocio y las dificultades técnicas son tuyos y no son confidenciales; los datos, no. Un generador de datos sintéticos de 80 líneas resuelve esto en una tarde.

Y si aun así tu proyecto va a tratar datos que se parecen a datos personales (nombres, correos, direcciones, aunque inventados), aplica desde el principio lo que viste en 04-07 y en 07-04: cifrado en reposo con claves gestionadas, mínimo privilegio, retención definida con borrado real, y logs que no escriban esos campos. No porque tus datos inventados lo necesiten, sino porque el hábito es el entregable.

Plantilla de una página para validar tu idea propia

Antes de aceptarla, rellena esto. Si alguna casilla queda vacía, la idea no está lista:

# Validación de idea de proyecto

**Nombre del proyecto:**
**Una frase:** (sin la palabra "y")

## El problema
¿Quién tiene el problema? ¿Qué hace hoy sin la plataforma? ¿Qué le duele?

## Alcance INCLUIDO (máximo 5 puntos)
1.
2.
3.

## Alcance EXPLÍCITAMENTE EXCLUIDO (mínimo 5 puntos)
1.
2.
3.
4.
5.

## Cómo cumple los requisitos obligatorios
| Requisito | Cómo lo cumple en mi proyecto |
| --- | --- |
| App web contenedorizada | |
| Almacenamiento de objetos | |
| Base de datos gestionada | |
| Ingesta o procesamiento de datos | |
| Cuadro de mando analítico | |
| Componente de IA | |

## Datos
¿De dónde salen? (deben ser 100 % inventados)
¿Cuántas filas? ¿Cómo los genero?

## Riesgo principal
¿Qué es lo que más probablemente me va a bloquear?

La sección de alcance excluido es la más importante del documento y la que todo el mundo deja en blanco. Escribir "no habrá pagos", "no habrá app móvil", "no habrá multiidioma", "no habrá roles más allá de admin y usuario", "no habrá notificaciones por correo reales" es lo que te salva dentro de tres semanas, cuando te apetezca añadir cualquiera de esas cosas.

  1. Requisitos funcionales mínimos obligatorios

Estos seis son obligatorios. Sea cual sea tu problema, deben existir. Están formulados como lista verificable: cada uno tiene un criterio de "hecho" comprobable con un comando.

# Requisito Criterio de "hecho" Cómo lo verificas
RF-1 Aplicación web contenedorizada y desplegada Hay una URL HTTPS pública que responde 200 y sirve la funcionalidad principal curl -s -o /dev/null -w "%{http_code}" https://tu-dominio
RF-2 Almacenamiento de objetos Existe al menos un bucket con contenido de la aplicación (imágenes, ficheros, documentos), servido de forma controlada gcloud storage ls gs://tu-bucket/**
RF-3 Base de datos gestionada Existe una BD gestionada (Cloud SQL, Firestore, Spanner…) con el modelo operativo y datos ficticios gcloud sql instances describe / gcloud firestore databases list
RF-4 Ingesta o procesamiento de datos Hay un flujo que mueve datos del sistema operativo al analítico (Pub/Sub, un job programado, Dataflow, una función) El almacén analítico tiene filas nuevas tras una acción en la app
RF-5 Cuadro de mando analítico Existe un panel con al menos 4 visualizaciones que responden a preguntas de negocio reales URL del informe de Looker Studio
RF-6 Al menos un componente de IA Hay una funcionalidad que usa un modelo. Puede ser una API preentrenada (Vision, Natural Language, Gemini) Una llamada de ejemplo con su respuesta guardada

Detalle de cada uno:

RF-1 — Aplicación web contenedorizada. Contenedorizada significa que existe un Dockerfile y que la imagen se construye en CI, no en tu portátil. La recomendación por defecto es Cloud Run (07-02): escala a cero, no pagas cuando nadie la usa, y el contrato es sencillo. Si eliges GKE, que sea porque tienes un motivo escrito, no por lucirte: un clúster encendido se come el presupuesto del proyecto entero.

RF-2 — Almacenamiento de objetos. No vale un bucket vacío creado para cumplir. Debe formar parte del flujo: el usuario sube algo, o la aplicación sirve algo desde ahí. Aplica lo de 02-02: acceso uniforme a nivel de bucket, nada público salvo lo que deba serlo, y una regla de ciclo de vida aunque sea trivial.

RF-3 — Base de datos gestionada. Gestionada, no un contenedor con PostgreSQL dentro. El árbol de decisión de 02-06 te dice cuál: relacional con transacciones → Cloud SQL; documentos con acceso por clave y escalado a cero → Firestore. Para la mayoría de estos proyectos, Cloud SQL PostgreSQL en la instancia más pequeña o Firestore son las respuestas correctas.

RF-4 — Ingesta o procesamiento. Es el requisito que más gente interpreta de menos. No basta con que la app escriba en la BD. Debe haber un flujo asíncrono o programado que lleve datos de un sitio a otro: un topic de Pub/Sub que recoge eventos, un job de Cloud Run que cada noche vuelca a BigQuery, una función que se dispara al subir un fichero. Es la pieza que demuestra que entiendes la diferencia entre el plano operativo y el analítico (04-01, 04-04).

RF-5 — Cuadro de mando. Cuatro visualizaciones que respondan preguntas, no cuatro gráficos bonitos. "¿Qué refugio tiene más cancelaciones?" es una pregunta. "Distribución de reservas" no lo es. Looker Studio sobre BigQuery es gratis y suficiente (04-07).

RF-6 — Componente de IA. Empieza siempre por una API preentrenada. Vision, Natural Language o Gemini resuelven el requisito en dos horas y funcionan. Entrenar un modelo propio con Vertex AI es opcional, cuesta dinero y es la fuente número uno de proyectos que no se terminan. Si te sobra tiempo al final, entonces sí: sustituye la API por un modelo tuyo y documenta la comparación con la línea base, exactamente como hizo Lucía en DA-003.

  1. Requisitos no funcionales obligatorios

Aquí es donde este proyecto se separa de una demo. Ocho requisitos, todos obligatorios, todos verificables:

# Requisito Criterio de "hecho" Lección de referencia
RNF-1 Infraestructura como código terraform destroy + terraform apply reconstruyen el sistema entero. Nada creado a mano queda sin código 06-07
RNF-2 CI/CD con al menos una prueba automatizada Un push a la rama principal ejecuta pruebas, construye la imagen y despliega. Si la prueba falla, no despliega 06-01
RNF-3 IAM con mínimo privilegio y sin claves JSON Cero cuentas de servicio con owner/editor. Cero claves descargadas. CI/CD por Workload Identity Federation 03-04, 06-02
RNF-4 Secretos fuera del código Ni una contraseña, cadena de conexión o API key en el repositorio. Todo en Secret Manager 03-06
RNF-5 HTTPS con dominio o subdominio propio La app responde en https://algo.tudominio.tld con certificado válido 03-07
RNF-6 Observabilidad: 1 panel + 1 alerta Existe un panel con las métricas doradas y al menos una política de alerta que notifica de verdad 06-04, 06-06
RNF-7 Un SLO definido y medido Hay un SLI, un objetivo numérico, una ventana y un presupuesto de error visible 07-06
RNF-8 Presupuesto con alerta Existe un presupuesto en la cuenta de facturación con umbrales al 50/90/100 % 01-04, 07-05

Los tres que la gente se salta y no debería:

RNF-1 (IaC de verdad). El criterio no es "tengo unos ficheros .tf". El criterio es que el sistema se reconstruye desde cero. La prueba se hace en 08-04 y es implacable: destruyes el entorno de desarrollo entero y lo vuelves a crear. Si no arranca, tu IaC no era IaC: era documentación con sintaxis de Terraform.

RNF-3 (sin claves JSON). Esta es la que más te va a diferenciar. La mayoría de proyectos de portafolio tienen un credentials.json en el repositorio o, en el mejor caso, en .gitignore. Configurar Workload Identity Federation entre GitHub Actions o Cloud Build y GCP cuesta media hora la primera vez y es exactamente lo que hace un profesional. Y recuerda el caso de AlpinaShop: una clave perdida durante catorce meses.

RNF-7 (SLO). Un SLO no es "quiero que vaya rápido". Es: "el 99 % de las peticiones a /api/* responden en menos de 800 ms, medido sobre ventana de 28 días". Con su presupuesto de error calculado y visible. Ocupa una tarde y es de lo que más impresiona en una entrevista, porque casi nadie de nivel junior sabe formularlo.

  1. La restricción de coste: el requisito que más te va a enseñar

Fija ahora un límite mensual y escríbelo. El proyecto debe poder construirse y mantenerse dentro del crédito de prueba de Google Cloud (300 USD / 90 días en el momento de escribir esto — verifícalo, las condiciones cambian) o, si el crédito se te ha agotado, por debajo de un límite mensual que tú fijas.

Valores de referencia razonables:

Límite mensual Qué te cabe Recomendado para
0 € (solo nivel gratuito) Cloud Run, Cloud Functions, Firestore, BigQuery (1 TB consulta/mes), 5 GB de Storage Quien no quiere gastar nada. Obliga a Firestore en vez de Cloud SQL
10-15 €/mes Lo anterior + Cloud SQL db-f1-micro o parada nocturna + dominio La opción recomendada. Es lo que cuesta el proyecto de referencia
30-40 €/mes Lo anterior + Cloud SQL con algo más de músculo + CDN + logs con retención Si quieres margen y no te importa el gasto
>50 €/mes Ya no es una restricción, es un presupuesto Solo si tienes un motivo

Por qué la restricción es parte del ejercicio y no un inconveniente. Cualquiera puede construir una arquitectura que funcione con dinero infinito. Lo que distingue a un buen ingeniero de la nube es construirla con el dinero que hay. La restricción de coste te va a forzar a tomar exactamente las decisiones que se toman en una empresa real:

  • Escalar a cero en lugar de tener capacidad reservada (Cloud Run vs. MIG).
  • Elegir la instancia más pequeña que cumple, y medir si cumple.
  • Apagar los entornos de desarrollo por la noche.
  • Particionar las tablas de BigQuery para no escanear 1,2 TB cada vez que se abre el panel.
  • No dejar un clúster de GKE encendido "para probar".
  • Poner ciclo de vida en los buckets desde el día uno.
  • Retener logs 30 días y no 400.

Todo eso es 07-05 aplicado a tu bolsillo, que es la mejor forma de aprenderlo.

El presupuesto es lo primero que se crea

Antes de crear un solo recurso. Literalmente el primer día, antes que nada:

# Sustituye por tus valores reales
export BILLING_ACCOUNT="0X0X0X-0X0X0X-0X0X0X"
export PROYECTO="miproyecto-dev"

# Presupuesto de 15 € al mes con avisos al 50 %, 90 % y 100 %
gcloud billing budgets create \
  --billing-account="${BILLING_ACCOUNT}" \
  --display-name="Presupuesto proyecto final" \
  --budget-amount=15EUR \
  --threshold-rule=percent=0.5 \
  --threshold-rule=percent=0.9 \
  --threshold-rule=percent=1.0 \
  --filter-projects="projects/${PROYECTO}"

Y el aviso que hay que repetir siempre: un presupuesto avisa, no impide. Si dejas encendido algo caro, el presupuesto te manda un correo mientras el contador sigue subiendo. Lo que impide de verdad son las cuotas (07-07) y la costumbre de mirar el informe de facturación cada pocos días. Ponte un recordatorio: cada martes y cada sábado, abrir el informe de costes. Treinta segundos.

⚠️ Todos los precios de este módulo son órdenes de magnitud, no tarifas. Los precios de Google Cloud cambian, varían por región y dependen de descuentos y del nivel gratuito. Consulta siempre la calculadora oficial y la página de precios del servicio antes de comprometer una cifra en tu documento de arquitectura.

  1. Entregables y su formato

Siete entregables. Los tres primeros son el proyecto; los cuatro siguientes son lo que hace que el proyecto se pueda evaluar y defender.

# Entregable Formato Dónde vive Se trabaja en
E-1 Repositorio de código Git, con historial de commits reales GitHub/GitLab público 08-03
E-2 Documento de arquitectura Markdown con diagramas mermaid docs/arquitectura.md 08-02
E-3 Infraestructura como código Terraform con módulos y backend remoto infra/ del repositorio 08-03
E-4 Aplicación desplegada URL HTTPS funcionando Cloud Run + dominio 08-03
E-5 Cuadro de mando Informe de Looker Studio compartido Enlace en el README 08-03
E-6 Documento de operación (runbook) Markdown docs/runbook.md 08-04
E-7 Presentación 12-15 diapositivas + guion docs/presentacion/ 08-05

Estructura del repositorio (se detalla en 08-03, pero decídela ya):

mi-proyecto/
├── README.md                 # La puerta de entrada. Se lee en 2 minutos.
├── app/                      # Código de la aplicación
│   ├── Dockerfile
│   ├── src/
│   └── tests/
├── infra/                    # Terraform
│   ├── modules/
│   ├── envs/
│   │   ├── dev/
│   │   └── prod/
│   └── README.md
├── data/                     # Generadores de datos ficticios, SQL, ETL
│   ├── seed/
│   └── sql/
├── ml/                       # Componente de IA
├── docs/
│   ├── arquitectura.md
│   ├── runbook.md
│   ├── adr/                  # Decisiones de arquitectura, una por fichero
│   │   ├── ADR-001-eleccion-computo.md
│   │   └── ADR-002-base-de-datos.md
│   ├── diario.md             # Diario de decisiones y problemas
│   └── presentacion/
├── cloudbuild.yaml
└── .gitignore

Crea este esqueleto hoy, aunque esté vacío. Los directorios vacíos con un README.md de una línea que diga qué irá ahí valen más que la mejor intención de organizarlo luego.

  1. La rúbrica de evaluación

Esta es la rúbrica con la que te vas a autoevaluar en 08-05. Léela ahora, porque saber cómo te van a puntuar cambia lo que construyes.

100 puntos, repartidos en siete bloques:

Bloque Puntos Qué se evalúa
A. Diseño y decisiones 20 Arquitectura coherente, decisiones justificadas, alternativas descartadas por escrito
B. Implementación funcional 20 Los 6 requisitos funcionales existen y funcionan de extremo a extremo
C. Infraestructura como código 15 Reproducibilidad real, módulos, estado remoto, nada creado a mano
D. Seguridad e identidad 15 Mínimo privilegio, sin claves, secretos gestionados, exposición mínima, TLS
E. Entrega y pruebas 10 CI/CD funcionando, pruebas que fallan cuando deben, despliegue reversible
F. Observabilidad, SLO y coste 10 Panel, alerta, SLO medido, presupuesto y coste dentro del límite
G. Documentación y presentación 10 README, arquitectura, ADR, runbook y presentación defendible

Detalle por bloque

A. Diseño y decisiones (20 puntos)

Criterio Insuficiente (0-40 %) Correcto (60-80 %) Excelente (100 %)
Arquitectura documentada No hay diagrama, o está desactualizado Un diagrama que refleja el sistema Tres niveles (contexto, componentes, despliegue), coherentes entre sí
Justificación de servicios "Usé Cloud Run" Se explica por qué Se explica por qué y qué se descartó, con el criterio
ADR No hay 1-2 ADR ≥3 ADR con contexto, opciones, decisión y consecuencias
Modelo de datos Implícito en el código Esquema documentado Esquema + ciclo de vida del dato + dónde vive cada cosa y por qué

B. Implementación funcional (20 puntos) — 3 puntos por requisito funcional cumplido (18) + 2 puntos si el flujo completo funciona de extremo a extremo sin intervención manual.

C. Infraestructura como código (15 puntos)

Criterio Puntos
Estado remoto en bucket con versionado 2
Proveedor fijado por versión, sin latest 1
Al menos dos módulos propios reutilizados 3
Variables por entorno, sin valores duplicados 2
terraform plan limpio (sin cambios) sobre el sistema desplegado 3
El entorno se recrea desde cero y funciona 4

D. Seguridad e identidad (15 puntos)

Criterio Puntos
Cero cuentas de servicio con owner/editor 3
Cero claves JSON descargadas (WIF en CI/CD) 3
Secretos en Secret Manager, nada en el repositorio 3
Base de datos sin IP pública 2
Ningún bucket accesible por allUsers salvo justificado 2
HTTPS con certificado válido y cabeceras razonables 2

E. Entrega y pruebas (10 puntos)

Criterio Puntos
Pipeline que construye y despliega automáticamente 3
Al menos una prueba automatizada que falla cuando rompes el código 3
Promoción de la misma imagen a producción, sin reconstruir 2
Procedimiento de reversión escrito y ensayado 2

F. Observabilidad, SLO y coste (10 puntos)

Criterio Puntos
Panel con las cuatro señales doradas 2
Al menos una alerta que ha notificado de verdad (provocada a propósito) 2
Logs estructurados con identificador de correlación 2
SLI + SLO + presupuesto de error documentado y medido 2
Coste real dentro del límite fijado, con desglose por servicio 2

G. Documentación y presentación (10 puntos)

Criterio Puntos
README que permite a otro arrancar el proyecto 2
Documento de arquitectura completo 2
Runbook con al menos 3 procedimientos operativos 2
Diario de decisiones mantenido durante el proyecto 1
Presentación de 10-15 min con demostración 3

Cómo leer tu puntuación

Puntuación Lectura
< 50 Es una demo, no un proyecto. Falta al menos una capa completa
50-69 Proyecto funcional con deuda importante. Sirve para aprender, no para enseñar
70-84 Proyecto de portafolio sólido. Es el objetivo realista de este módulo
85-94 Proyecto que un entrevistador recordará
95-100 Sospechoso. Vuelve a puntuarte siendo honesto, sobre todo en C y D

Ese último renglón no es una broma. La autoevaluación honesta es parte de la nota: en 08-05 verás que reconocer y priorizar la deuda técnica suma puntos, y esconderla los resta.

  1. Planificación: esfuerzo por fase y cronograma

Estimación para un proyecto de dificultad media, primera vez, trabajando solo:

Fase Lección Horas Qué produce
F0. Elección y requisitos 08-01 2-4 Idea validada, alcance escrito, límite de coste
F1. Diseño 08-02 5-8 Diagramas, ADR, modelo de datos, estimación de coste
F2. Base: proyectos, red, IaC 08-03 6-10 Terraform funcionando, red creada, presupuesto activo
F3. Identidad y datos 08-03 4-6 Cuentas de servicio, BD, buckets, datos sembrados
F4. Aplicación 08-03 8-12 App contenedorizada desplegada y funcionando
F5. CI/CD 08-03 4-6 Pipeline con pruebas, WIF sin claves
F6. Datos, analítica e IA 08-03 6-9 Ingesta, tablas analíticas, panel, componente de IA
F7. Exposición y observabilidad 08-03 4-6 Dominio, TLS, balanceador, panel, alerta, SLO
F8. Pruebas y despliegue 08-04 5-8 Pruebas, prueba de carga, ensayo de reversión, go-live
F9. Documentación y presentación 08-05 4-6 Docs completas, autoevaluación, presentación
Total 48-75 h

Multiplica por 1,5 si es tu primer proyecto en la nube. No es pesimismo: es la observación empírica de que la primera vez que configuras Workload Identity Federation tardas dos horas y la segunda, quince minutos.

Cronograma de referencia a seis semanas

gantt
    title Proyecto final — plan de 6 semanas (10 h/semana)
    dateFormat YYYY-MM-DD
    axisFormat Sem %W

    section Preparación
    Elegir problema y alcance      :done, f0, 2026-09-07, 3d
    Diseño y ADR                   :active, f1, after f0, 5d
    Hito 1 Diseño revisado         :milestone, m1, after f1, 0d

    section Construcción
    Proyectos, red, Terraform      :f2, after m1, 5d
    Identidad y datos              :f3, after f2, 3d
    Aplicación desplegada          :f4, after f3, 6d
    Hito 2 App viva en dev         :milestone, m2, after f4, 0d

    section Automatización
    CI/CD con pruebas              :f5, after m2, 4d
    Datos, analitica e IA          :f6, after f5, 5d
    Hito 3 Flujo extremo a extremo :milestone, m3, after f6, 0d

    section Cierre
    Exposicion y observabilidad    :f7, after m3, 4d
    Pruebas y go-live              :f8, after f7, 4d
    Documentacion y presentacion   :f9, after f8, 4d
    Hito 4 Proyecto entregado      :milestone, m4, after f9, 0d

Los cuatro hitos son puntos de control, no adornos. En cada uno te paras y compruebas:

Hito Criterio de paso Si no lo cumples
M1 — Diseño revisado Los tres diagramas existen, hay ≥3 ADR, la estimación de coste cabe en tu límite No empieces a construir. Recorta alcance
M2 — App viva en dev Hay una URL que responde y lee de la BD Simplifica la app. La funcionalidad no es el entregable
M3 — Flujo extremo a extremo Una acción en la app acaba visible en el cuadro de mando Reduce el flujo de datos a un job nocturno simple
M4 — Proyecto entregado La rúbrica te da ≥70 y el coste está dentro del límite Prioriza D (seguridad) y C (IaC) sobre funcionalidad nueva

Si vas con retraso, recorta funcionalidad, nunca requisitos no funcionales. Una aplicación con dos pantallas, IaC completa y seguridad impecable puntúa muy por encima de una con ocho pantallas y un credentials.json en el repositorio.

  1. Gestión del riesgo: los cinco errores que hunden un proyecto final

Estos cinco no son "errores comunes". Son las cinco causas por las que los proyectos de portafolio no se terminan. Reconócelos ahora y tendrás la mitad del trabajo hecho.

Error 1 — Alcance excesivo

Cómo se manifiesta. La semana 2 añades "sería fácil meter también pagos". La semana 3, notificaciones. La semana 4, una app móvil. La semana 6 tienes nueve cosas a medias y ninguna terminada.

Por qué pasa. Porque añadir funcionalidad es divertido y terminar no lo es. Y porque el alcance excluido no estaba escrito.

La contramedida. La lista de exclusiones de la sección 4, escrita y firmada por ti el primer día. Cuando se te ocurra algo nuevo, no lo descartes: apúntalo en una sección ## Siguientes pasos del README. Eso convierte la tentación en un entregable de la presentación, donde puntúa.

Error 2 — Empezar por el código

Cómo se manifiesta. El día uno abres el editor y empiezas la aplicación. Tres semanas después tienes una app bonita y ninguna infraestructura, ningún IaC, ninguna seguridad. Y entonces intentas "meterle Terraform" a algo que ya existe, que es el doble de trabajo.

Por qué pasa. Porque programar es lo que sabes hacer y lo demás da pereza.

La contramedida. El orden de 08-03: organización → red → identidad → estado → datos → aplicación. La aplicación es la fase 4 de 8, no la 1. Y hay una razón técnica dura: el projectId no se puede cambiar y la red no se puede rehacer sin destruirlo todo. Lo que se decide primero es lo que es caro de cambiar.

Error 3 — Dejar la seguridad para el final

Cómo se manifiesta. Todo con roles/owner "para que funcione ahora", una clave JSON descargada "temporalmente", la contraseña de la BD en una variable del código. La última semana intentas arreglarlo, rompes todo y acabas dejándolo como estaba.

Por qué pasa. Porque el mínimo privilegio duele al principio: cada permiso que falta es un error 403 y media hora de depuración.

La contramedida. Empezar restrictivo y abrir sólo lo que falla. gcloud policy-troubleshoot te dice exactamente qué permiso falta (lo tienes en 03-04). Duele la primera semana y no duele nunca más. Y el bloque D de la rúbrica vale 15 puntos que se pierden enteros si haces esto mal.

Error 4 — Olvidar el coste

Cómo se manifiesta. Dejas un clúster de GKE encendido un fin de semana. O un job de Dataflow en streaming. O una instancia de Cloud SQL grande "para que vaya rápido". El lunes tienes 180 € gastados y el crédito de prueba a la mitad.

Por qué pasa. Porque en la nube no ves el hardware. Un servidor apagado en tu casa no consume; una VM encendida en la nube sí, aunque no la uses.

La contramedida. Tres cosas, todas de la sección 7: el presupuesto creado antes que nada, la revisión del informe de costes dos veces por semana, y la costumbre de destruir el entorno de desarrollo cuando no lo uses. Esto último es un superpoder que sólo tienes si tu IaC es de verdad:

# Viernes por la tarde
terraform -chdir=infra/envs/dev destroy -auto-approve
# Sábado por la mañana
terraform -chdir=infra/envs/dev apply -auto-approve

Si eso funciona, tu proyecto de desarrollo cuesta cero cuando no trabajas. Y de paso estás ejecutando la prueba más dura de RNF-1 cada semana, gratis.

Error 5 — No documentar sobre la marcha

Cómo se manifiesta. La última semana te sientas a escribir el documento de arquitectura y no te acuerdas de por qué elegiste Firestore en lugar de Cloud SQL. Escribes una justificación inventada a posteriori, que se nota, y que además puede que no sea la razón real.

Por qué pasa. Porque documentar parece que no avanza el proyecto.

La contramedida. El docs/diario.md. Cada sesión de trabajo, tres líneas:

## 2026-09-14 (2 h)
- Hecho: red y subredes con Terraform, primer apply limpio.
- Decidido: una sola subred /24 en europe-west1. Descartado separar por
  entorno porque cada entorno es un proyecto distinto y no se hablan.
- Atascado: Cloud SQL con IP privada necesita la conexión de servicio
  privada; se me olvidaba el peering. 40 min perdidos.
- Siguiente: cuentas de servicio.

Tres líneas por sesión, veinte sesiones: sesenta líneas que se convierten solas en el documento de arquitectura, en los ADR y en la mitad de la presentación. Es la inversión con mejor retorno de todo el módulo.

Matriz de riesgo

Riesgo Probabilidad Impacto Mitigación Señal temprana
Alcance excesivo Alta Alto Exclusiones escritas + hitos Semana 3 sin M2
Empezar por el código Alta Alto Orden de fases de 08-03 No hay infra/ en el commit 20
Seguridad al final Muy alta Medio Restrictivo desde el día 1 Ves roles/editor en un .tf
Coste descontrolado Media Alto Presupuesto + destroy nocturno Factura >30 % del límite en semana 1
No documentar Muy alta Medio diario.md cada sesión No hay commits en docs/
Bloqueo técnico largo Media Medio Método de 5 pasos (sección 13) >3 h en el mismo error
Abandono Media Total Hitos cortos, alcance pequeño 10 días sin un commit

El último es el riesgo de verdad. La mitigación real contra el abandono es que el proyecto sea pequeño y te apetezca, que es lo que decían los criterios 2 y 5.

  1. Cómo trabajar con la documentación oficial

Vas a pasar una parte sustancial del proyecto leyendo documentación. Hacerlo bien es una habilidad, y estas son las reglas:

1. La documentación oficial es la fuente. Todo lo demás es contexto. Un blog de 2021, una respuesta de Stack Overflow de 2019 o un vídeo de YouTube pueden ayudarte a entender un concepto, pero no para copiar comandos: la CLI cambia, los roles se renombran, los servicios se deprecan. El curso mismo, por muy actualizado que esté a 2026, es una foto de un momento.

2. Las cuatro secciones que hay que conocer de cada servicio:

Sección Para qué sirve Cuándo la lees
Overview / Concepts Entender el modelo mental Antes de decidir usarlo
Quickstart Hacerlo funcionar en 10 minutos Al empezar a construir
How-to guides El caso concreto que necesitas Durante la construcción
Reference (API/CLI/Terraform) El parámetro exacto Cuando algo no funciona
Quotas & limits Lo que te va a limitar Antes de diseñar, no después
Pricing Lo que va a costar En 08-02, sin excepción

La sección de cuotas y límites es la que menos gente lee y la que más disgustos evita. Saber que Cloud Run tiene un límite de tiempo de petición, o que BigQuery tiene un máximo de operaciones de tabla al día, cambia el diseño.

3. El registro de Terraform es tan importante como la documentación de GCP. Para cada recurso que crees, registry.terraform.io/providers/hashicorp/google/latest/docs te da los argumentos exactos, cuáles son obligatorios, cuáles fuerzan recreación del recurso (ForceNew) y qué se puede importar. Ese ForceNew es la diferencia entre un apply de 20 segundos y uno que destruye tu base de datos.

4. Las notas de versión existen. Cada servicio tiene su página de release notes. Antes de dar por perdida una funcionalidad, mira si salió el mes pasado.

5. Cuando la documentación y el mensaje de error se contradicen, gana el mensaje de error. Y cuando el mensaje de error dice "permission denied", casi siempre tiene razón: no es un bug, te falta un permiso.

  1. Qué hacer cuando algo no funciona

Te vas a atascar. Varias veces. El método siguiente resuelve la gran mayoría de bloqueos en menos de veinte minutos, y lo importante es aplicarlo en orden en vez de probar cosas al azar:

Paso 1 — Lee el error entero. Completo, hasta el final, incluido el details y el enlace que a veces incluye. La mitad de los errores de GCP dicen literalmente qué permiso falta o qué API hay que activar.

# Los errores de la API quedan en los logs. Los últimos 20:
gcloud logging read 'severity>=ERROR' --limit=20 --format=json --project="${PROYECTO}"

Paso 2 — ¿Está la API activada? Es la causa número uno de errores inexplicables la primera semana:

gcloud services list --enabled --project="${PROYECTO}" | sort

Paso 3 — ¿Es un permiso? Si el error contiene 403, PERMISSION_DENIED o does not have permission, es un permiso, sin excepción:

gcloud policy-troubleshoot iam "//cloudresourcemanager.googleapis.com/projects/${PROYECTO}" \
  --principal-email="mi-sa@${PROYECTO}.iam.gserviceaccount.com" \
  --permission="storage.objects.create"

Paso 4 — ¿Es la red? Si el síntoma es un tiempo de espera agotado y no un rechazo, es red:

gcloud network-management connectivity-tests create prueba-bd \
  --source-instance=... --destination-instance=... --destination-port=5432
gcloud network-management connectivity-tests describe prueba-bd

Paso 5 — ¿El recurso es como crees que es? Un describe desmonta la mitad de las hipótesis equivocadas:

gcloud run services describe mi-servicio --region=europe-west1 --format=yaml

Y si tras veinte minutos sigues igual: cambia de tarea. Documenta el bloqueo en docs/diario.md con el error exacto y lo que ya has probado, y vete a otra fase. Volver al día siguiente con la cabeza fría resuelve más bloqueos que insistir tres horas seguidas. Este consejo parece de autoayuda y es puramente estadístico.

  1. Tu decisión de hoy

Antes de pasar a 08-02, cinco cosas. No son opcionales y no llevan más de dos horas:

  • [ ] Elegir el problema. Una de las cuatro propuestas o el tuyo, validado con la plantilla de la sección 4.
  • [ ] Escribir la frase. Una frase sin "y". Pégala en la primera línea del README.
  • [ ] Escribir las cinco exclusiones. Lo que tu proyecto no va a hacer.
  • [ ] Fijar el límite de coste. Un número en euros al mes, escrito en el README.
  • [ ] Crear el repositorio con el esqueleto de carpetas y el primer commit.

Si no puedes hacer las cinco hoy, tu problema no está elegido todavía. Vuelve a la sección 2.

Errores Comunes y Consejos

Elegir un problema que no entiendes porque suena impresionante. "Plataforma de análisis de riesgo crediticio con IA" suena mejor que "reservas de refugios" hasta que te toca modelar el riesgo crediticio. En una entrevista, un proyecto sencillo bien explicado gana siempre a uno complejo que balbuceas.

Confundir "completo" con "grande". El proyecto se evalúa por capas cubiertas, no por funcionalidad. Dos pantallas con IaC, CI/CD, SLO y seguridad valen 80 puntos; quince pantallas sin nada de eso valen 45.

Crear los proyectos de GCP antes de haber leído 08-02. El projectId es inmutable. Si creas test-1234 porque tenías prisa, lo vas a enseñar en la entrevista. Espera a la lección de diseño, donde se decide la convención de nombres.

Usar el crédito de prueba como si fuera infinito. 300 USD parecen mucho hasta que dejas un GKE encendido: un clúster estándar de tres nodos se come unos 100 € al mes él solo. Cloud Run escala a cero; GKE Autopilot no cuesta cero pero cuesta poco; GKE estándar cuesta desde el minuto uno.

Dejar el componente de IA para el final y elegir entrenar un modelo. Es el orden inverso al correcto: pon la API preentrenada en la fase 6 (dos horas, funciona) y sólo si sobra tiempo, sustitúyela por un modelo propio. Un componente de IA sencillo que funciona vale los 3 puntos; uno ambicioso a medias vale 0.

No leer la rúbrica hasta el final. La rúbrica es el pliego. Todo lo que hagas que no esté en la rúbrica es tiempo que no puntúa. Tenla abierta en una pestaña durante todo el módulo.

Consejo: haz un git commit al final de cada sesión, aunque no funcione. El historial de commits es un entregable en sí mismo: un repositorio con 60 commits distribuidos en seis semanas cuenta una historia de trabajo real. Uno con 3 commits gigantes cuenta otra.

Consejo: guarda todas las capturas y todos los números desde el principio. La captura del panel el día que funcionó, el resultado de la primera prueba de carga, la factura del primer mes. En 08-05 los vas a necesitar y reconstruirlos es imposible.

Consejo: pon una alarma real en el calendario. Dos sesiones fijas por semana, en el calendario, con nombre. Los proyectos personales no mueren por dificultad técnica: mueren porque nunca hay un momento.

Ejercicios

Los ejercicios de este módulo son hitos de tu propio proyecto. Las soluciones muestran el mismo hito resuelto sobre RefugioReserva, el proyecto de referencia, para que tengas un modelo sin poder copiar el tuyo.

Ejercicio 1 — Define y acota tu proyecto

Elige tu problema y rellena la plantilla de validación de la sección 4 completa: nombre, frase de una línea sin "y", el problema con su usuario, alcance incluido (máximo 5 puntos), alcance excluido (mínimo 5 puntos), la tabla de cómo cumples los seis requisitos funcionales, el origen y volumen de los datos ficticios y el riesgo principal.

Después, puntúa tu idea con la tabla de decisión de los cinco criterios. Si algún criterio saca menos de 3, cambia de idea o ajústala hasta que suba.

Ejercicio 2 — Fija tu restricción de coste y créala

Decide tu límite mensual, justifícalo en dos líneas y crea el presupuesto real en tu cuenta de facturación con umbrales al 50, 90 y 100 %. Documenta en una tabla qué servicios esperas usar, con qué configuración mínima y qué orden de magnitud de coste tienes en la cabeza (lo afinarás en 08-02 con la calculadora).

Además, escribe la respuesta a esta pregunta: si dentro de tres semanas descubres que vas al 200 % de tu límite, ¿qué es lo primero que apagas? Ese orden de prioridad escrito de antemano es lo que te salva de decidir con prisa.

Ejercicio 3 — Planifica y prepara el terreno

Adapta el cronograma de la sección 10 a tu disponibilidad real (horas por semana que puedes dedicar de verdad, no las que te gustaría). Produce un diagrama mermaid con tus fechas y tus cuatro hitos, y para cada hito escribe su criterio de paso y qué recortarías si no lo cumples.

Crea el repositorio con el esqueleto de carpetas de la sección 8, el README.md con la frase del proyecto, las exclusiones y el límite de coste, y el docs/diario.md con su primera entrada. Haz el primer commit.

Soluciones

Solución 1 — Definición y acotación de RefugioReserva

# Validación de idea de proyecto

**Nombre del proyecto:** RefugioReserva
**Una frase:** Plataforma donde un excursionista consulta y reserva plazas
en los refugios de una federación de montaña.

## El problema
La Federación Pirenaica de Montaña (ficticia) gestiona 12 refugios. Las
reservas se hacen por teléfono, entre las 18:00 y las 20:00, y se apuntan
en una hoja de cálculo por refugio. Consecuencias: sobreventa en fines de
semana de agosto (ocurrió 7 veces el año pasado), el guarda no sabe cuánta
comida preparar hasta que llega la gente, y la federación no tiene datos
para decidir en qué refugio invertir.

## Alcance INCLUIDO
1. Búsqueda pública de disponibilidad por refugio y fecha.
2. Reserva con datos de contacto y confirmación (sin pago).
3. Zona privada del guarda: reservas del día y del fin de semana.
4. Subida de fotos del refugio con generación de miniatura automática.
5. Cuadro de mando de ocupación y opiniones para la federación.

## Alcance EXPLÍCITAMENTE EXCLUIDO
1. **Pagos.** No hay pasarela. La reserva se paga en el refugio.
2. **Aplicación móvil.** Solo web adaptativa.
3. **Multiidioma.** Solo español.
4. **Gestión de personal, turnos o inventario del refugio.**
5. **Notificaciones reales por correo o SMS.** Se registra el evento y se
   simula el envío; no se contrata proveedor de correo.
6. **Roles más allá de tres:** visitante, guarda, federación.
7. **Modificación o cancelación por parte del excursionista.** Se cancela
   llamando al refugio (igual que hoy).

## Cómo cumple los requisitos obligatorios
| Requisito | Cómo lo cumple |
| --- | --- |
| App web contenedorizada | Servicio Python (FastAPI) en Cloud Run `refugio-web` |
| Almacenamiento de objetos | Bucket `refugio-fotos` con originales y miniaturas |
| Base de datos gestionada | Cloud SQL PostgreSQL `refugio-db`, IP privada, BD `reservas` |
| Ingesta / procesamiento | Cada reserva publica en el topic `reservas-eventos`; una función lo escribe en BigQuery |
| Cuadro de mando | Looker Studio sobre `refugio_analitica.reservas_diarias` |
| Componente de IA | Análisis de sentimiento de las opiniones con la API de Natural Language |

## Datos
100 % inventados, generados con `data/seed/generar.py`:
- 12 refugios (nombre, altitud, capacidad, coordenadas ficticias del Pirineo).
- 2.000 reservas en 18 meses, con estacionalidad: julio y agosto x4,
  fines de semana x2,5, febrero mínimo.
- 400 opiniones en texto libre (plantillas combinadas, tono variado).
- 3 guardas y 1 usuario de federación, con correos `@example.com`.

## Riesgo principal
La condición de carrera al reservar la última plaza. Si lo resuelvo mal,
la funcionalidad central está rota. Mitigación: transacción con bloqueo
de fila en PostgreSQL y una prueba de integración concurrente que lo
demuestre (será mi prueba automatizada obligatoria de RNF-2).

Puntuación con la tabla de decisión:

Criterio Nota Razón
Dominio conocido 5 He dormido en refugios; sé cómo funciona una reserva
Alcance acotado 5 Una frase sin "y", siete exclusiones escritas
Datos ficticios 5 Un script de 70 líneas los genera
Varias capas 4 El streaming es flojo (un topic y una función), lo demás sobra
Interés 4 Me gusta el tema; no es apasionante pero no me va a aburrir
Total 23/25 Adelante

Solución 2 — Restricción de coste de RefugioReserva

Límite fijado: 12 € al mes. Justificación: el crédito de prueba ya está consumido, y quiero que el proyecto pueda quedarse encendido indefinidamente como pieza de portafolio sin que me duela. 12 € es aproximadamente lo que cuesta un dominio (prorrateado) más una instancia mínima de base de datos.

Servicio Configuración Coste esperado/mes Notas
Cloud Run refugio-web 1 vCPU, 512 MiB, min-instances=0 0-1 € Escala a cero; el tráfico de portafolio es casi nulo
Cloud SQL PostgreSQL db-f1-micro, 10 GB HDD, sin HA 7-9 € La partida grande. Sin HA a propósito: es un proyecto de portafolio
Cloud Storage ~2 GB, Standard, con ciclo de vida a Nearline a 90 días <0,10 €
BigQuery <1 GB almacenado, <5 GB consultados/mes 0 € Dentro del nivel gratuito
Pub/Sub ~2.000 mensajes/mes 0 € Dentro del nivel gratuito
Cloud Functions ~2.000 invocaciones/mes 0 € Dentro del nivel gratuito
Natural Language API ~400 documentos, una sola vez <0,50 € Se analiza al sembrar, no en cada carga
Artifact Registry ~2 GB de imágenes 0,20 € Con política de limpieza a 10 versiones
Cloud Logging Retención 30 días, <5 GB 0 € Dentro del nivel gratuito
Dominio (refugioreserva.example) Registrador externo ~1 €/mes 12 €/año prorrateado
Total estimado ~10 €/mes Margen de 2 € sobre el límite

Todas estas cifras son órdenes de magnitud a fecha de escritura y para europe-west1. Hay que rehacerlas con la calculadora oficial en 08-02 antes de dar el diseño por bueno.

Si llego al 200 % (24 €/mes), este es el orden de apagado, decidido de antemano:

  1. Apagar Cloud SQL fuera del horario de trabajo con un job programado (arranca a las 9, para a las 23). Ahorro inmediato: ~60 % de la partida grande. Riesgo: la demo no funciona de madrugada; asumible.
  2. Reducir la retención de logs a 7 días y desactivar los logs de acceso a datos si los hubiera activado.
  3. Vaciar Artifact Registry dejando sólo las 3 últimas imágenes.
  4. Migrar de Cloud SQL a Firestore. Es la medida nuclear: elimina el 80 % del coste pero implica rehacer la capa de datos. Sólo si las tres anteriores no bastan, y sería un ADR nuevo con sus consecuencias.
  5. Destruir el entorno de desarrollo y trabajar sólo contra producción, con más cuidado.

Lo que no haría: quitar el balanceador o el certificado (rompe RNF-5), ni desactivar la monitorización (rompe RNF-6). Recortar requisitos no funcionales para ahorrar 2 € es cambiar 15 puntos de rúbrica por el precio de un café.

Solución 3 — Plan y terreno de RefugioReserva

Disponibilidad real declarada: 8 horas por semana (dos tardes de 2 h entre semana + 4 h el sábado). Sobre una estimación de 50 horas, salen 7 semanas con algo de margen, no 6. Es preferible reconocerlo ahora que ir con retraso desde la semana 1.

gantt
    title RefugioReserva — 7 semanas a 8 h/semana
    dateFormat YYYY-MM-DD
    axisFormat %d %b

    section Diseno
    Requisitos y alcance        :done, a1, 2026-09-07, 2d
    Diseno, ADR, coste          :a2, 2026-09-09, 6d
    M1 Diseno revisado          :milestone, m1, 2026-09-15, 0d

    section Base
    Proyectos, APIs, presupuesto:b1, 2026-09-15, 3d
    Terraform, red, firewall    :b2, 2026-09-18, 5d
    Identidad y cuentas         :b3, 2026-09-23, 3d
    Cloud SQL, buckets, semilla :b4, 2026-09-26, 4d

    section Aplicacion
    App FastAPI y contenedor    :c1, 2026-09-30, 6d
    Primer despliegue en dev    :c2, 2026-10-06, 2d
    M2 App viva en dev          :milestone, m2, 2026-10-08, 0d

    section Automatizacion
    CI/CD con WIF y pruebas     :d1, 2026-10-08, 5d
    Pub/Sub, BigQuery, panel    :d2, 2026-10-13, 5d
    Sentimiento con NL API      :d3, 2026-10-18, 2d
    M3 Extremo a extremo        :milestone, m3, 2026-10-20, 0d

    section Cierre
    DNS, TLS, balanceador, CDN  :e1, 2026-10-20, 3d
    Panel, alerta, SLO          :e2, 2026-10-23, 3d
    Pruebas, carga, go-live     :e3, 2026-10-26, 5d
    Docs, rubrica, presentacion :e4, 2026-10-31, 5d
    M4 Entregado                :milestone, m4, 2026-11-05, 0d
Hito Fecha Criterio de paso Qué recorto si no llego
M1 15 sep 3 diagramas, 4 ADR, coste estimado ≤12 € Nada: si el diseño no está, no se construye. Se retrasa una semana
M2 8 oct https://dev.refugioreserva.example responde y lista refugios desde Cloud SQL Quito la zona del guarda; queda solo la búsqueda pública
M3 20 oct Una reserva en la web aparece en el panel de Looker Studio en <10 min Sustituyo Pub/Sub por un job nocturno que copia la tabla a BigQuery
M4 5 nov Rúbrica ≥70, coste real ≤12 €, presentación grabada Quito la prueba de carga y la CDN; ambos suman menos que la documentación

El terreno preparado:

mkdir -p refugioreserva/{app/{src,tests},infra/{modules,envs/{dev,prod}},data/{seed,sql},ml,docs/{adr,presentacion}}
cd refugioreserva
git init -b main

cat > README.md <<'EOF'
# RefugioReserva

Plataforma donde un excursionista consulta y reserva plazas en los refugios
de una federación de montaña ficticia.

> Proyecto final del curso de Google Cloud Platform. **Todos los datos son
> inventados.** No contiene ni ha contenido nunca datos reales de personas
> ni de organizaciones.

## Límite de coste
**12 € al mes.** Presupuesto con alertas al 50/90/100 % creado el 2026-09-07.

## Fuera de alcance (a propósito)
Pagos · app móvil · multiidioma · gestión de personal · notificaciones
reales · roles adicionales · cancelación en línea.

## Estado
🚧 En construcción. Ver `docs/diario.md`.
EOF

cat > docs/diario.md <<'EOF'
# Diario de decisiones

## 2026-09-07 (2 h)
- Hecho: elegida la idea (RefugioReserva), validada con la plantilla, 23/25.
- Decidido: límite de coste 12 €/mes. Descartado usar el crédito de prueba
  porque ya está consumido y quiero que el proyecto siga vivo después.
- Decidido: 7 semanas en vez de 6. Solo tengo 8 h reales por semana.
- Siguiente: diseño (08-02). NO crear todavía ningún proyecto de GCP:
  la convención de nombres se decide en el diseño y el projectId no se cambia.
EOF

printf '%s\n' '*.tfstate' '*.tfstate.*' '.terraform/' '*.tfvars' \
  '__pycache__/' '.env' '*credentials*.json' '*.key' > .gitignore

for d in app infra data ml docs; do echo "# $d" > "$d/README.md"; done

git add -A && git commit -m "Estructura inicial del proyecto RefugioReserva"

Fíjate en dos detalles del .gitignore: *.tfvars y *credentials*.json. El primero evita subir valores por entorno que a veces llevan secretos; el segundo es una red de seguridad por si algún día, con prisa, descargas una clave. No deberías descargar ninguna —RNF-3—, pero la red de seguridad no estorba.

Y fíjate sobre todo en la última línea del diario: no crear todavía ningún proyecto de GCP. Es la disciplina que separa este módulo de un tutorial.

Conclusión

Ya tienes el pliego de condiciones completo.

Sabes qué se te pide: una plataforma completa de principio a fin, no una demo, con todas las capas del curso conectadas y explicadas. Y sabes qué no se te pide, que es igual de importante: ni belleza, ni escala, ni modelos propios, ni alta disponibilidad.

Sabes elegir el problema con cinco criterios en orden —dominio conocido, alcance en una frase sin "y", datos inventables, varias capas naturales y que te apetezca— y tienes cuatro propuestas desarrolladas con sus datos, su dificultad y sus riesgos, además de la opción de traer la tuya con una regla que no se negocia: datos reales, nunca, ni "anonimizados", ni de tu empresa, por motivos legales, contractuales y prácticos.

Tienes los seis requisitos funcionales con su criterio de "hecho" y el comando que lo verifica, y los ocho no funcionales que separan un proyecto de una demo: IaC reproducible, CI/CD con prueba, mínimo privilegio sin claves JSON, secretos gestionados, HTTPS propio, panel y alerta, un SLO medido y un presupuesto con aviso.

Tienes la restricción de coste entendida como lo que es: no un inconveniente, sino el requisito que te obliga a tomar las mismas decisiones que se toman en una empresa —escalar a cero, la instancia más pequeña que cumple, particionar, apagar lo que no se usa— y con el recordatorio de que un presupuesto avisa pero no impide.

Tienes los siete entregables con su formato y su ubicación, la rúbrica de 100 puntos repartida en siete bloques con criterios verificables uno a uno, y la lectura honesta de la puntuación, incluido el aviso de que un 98 probablemente significa que te has puntuado con benevolencia.

Tienes la planificación: 48-75 horas repartidas en diez fases, un cronograma de referencia con cuatro hitos y, en cada uno, su criterio de paso y qué recortar si no llegas —siempre funcionalidad, nunca requisitos no funcionales.

Y tienes los cinco errores que hunden un proyecto final, con su síntoma, su causa y su contramedida: alcance excesivo (exclusiones escritas), empezar por el código (el orden de fases, porque el projectId no se cambia), seguridad al final (restrictivo desde el día uno y policy-troubleshoot como aliado), olvidar el coste (presupuesto primero y destroy los viernes) y no documentar sobre la marcha (tres líneas de diario por sesión, la inversión con mejor retorno del módulo).

En la próxima lección, 08-02, pasas del pliego al plano: traducir cada requisito a un servicio concreto con su justificación y su alternativa descartada, dibujar los tres diagramas que sirven, decidir la estructura de proyectos y la convención de nombres antes de crear nada, diseñar la red y la identidad sobre papel, modelar los datos con su ciclo de vida, estimar el coste con la calculadora y compararlo con tu límite, definir tus SLO y escribir tus primeros ADR.

Y no toques la consola de GCP hasta entonces. El projectId no se cambia.

Curso de Google Cloud Platform (GCP)

Módulo 1: Introducción a Google Cloud Platform

Módulo 2: Servicios principales de GCP

Módulo 3: Redes y seguridad

Módulo 4: Datos y análisis

Módulo 5: Aprendizaje automático e IA

Módulo 6: DevOps y monitoreo

Módulo 7: Temas avanzados de GCP

Módulo 8: Proyecto final

© Copyright 2026. Todos los derechos reservados