For seven modules you have followed Marta, Dani and Lucía. You have seen how AlpinaShop went from a rented server at a Spanish provider to a Google Cloud platform with continuous delivery, observability, SLOs, governance and a bill 60 % lower. You have seen the decisions and also the mistakes: the MIG that dragged on for five modules, the recommendations endpoint that had to be switched off, the service account key lost for fourteen months.

But you have watched other people decide.

This module is different. There is no AlpinaShop to follow here: there is a blank sheet, a set of constraints and a date. You are going to choose a problem, design a solution, build it, test it, deploy it, measure it, pay for it and defend it. End to end, on your own.

And there is a practical reason why this matters more than any earlier lesson: nobody is going to hire you for having read about Cloud Run. They are going to hire you because you can show a URL that works, a repository with the infrastructure written as code, a dashboard with real metrics and a €14-a-month bill you can explain line by line. That is a portfolio. The rest is lecture notes.

This first lesson is the project specification. It defines what you are being asked for, with which minimum requirements, under which cost limit, with which deliverables, with which rubric you will be assessed and within which deadline. Read it end to end before writing a line of code or creating a single GCP project. It is literally the lesson that stops you having, three weeks from now, half a system and no idea whether it is any good.

Contents

  1. What exactly you are being asked for, and why it is framed this way
  2. How to choose the problem: criteria for a portfolio project that works
  3. Four worked proposals
  4. Bringing your own problem (and the warning you cannot skip)
  5. Mandatory minimum functional requirements
  6. Mandatory non-functional requirements
  7. The cost constraint: the requirement that will teach you the most
  8. Deliverables and their format
  9. The assessment rubric
  10. Planning: effort per phase and schedule
  11. Risk management: the five mistakes that sink a final project
  12. How to work with the official documentation
  13. What to do when something does not work
  14. Your decision today

  1. What exactly you are being asked for, and why it is framed this way

The brief, in one sentence:

Build on Google Cloud, end to end and with your own hands, a complete platform for a problem you choose, going through the same stages you have watched AlpinaShop go through, and leave it documented, measured, secure and reproducible from scratch.

It is not "make a demo". A demo is a container deployed on Cloud Run with gcloud run deploy and a screenshot. Anybody does that in twenty minutes and it proves nothing, because the real work is not in deploying: it is in everything around the deployment.

What does show judgement is this:

What a demo shows What a complete project shows
You can run a command You can choose between three services and justify it
You have something deployed You can redeploy it from scratch without remembering anything
It works now You know when it stops working and you find out before the user does
You do not know what it costs You know what it costs per unit of business
Permissions are owner Every workload has least privilege, with no JSON keys
It is on your laptop It is in a repository, with history and with tests

The project is designed to touch every layer of the course, not to go deep into one. That is deliberate: a project that only demonstrates BigQuery competes with thousands of projects that demonstrate BigQuery. A project that demonstrates you can connect compute, data, identity, network, delivery and observability — and explain why each piece is where it is — competes with very few.

How long it takes. Between 40 and 60 hours of real work if this is your first time. Spread over 4-6 weeks at the pace of the odd evening plus a weekend, it is perfectly feasible. If it comes out at 15 hours, you are making a demo. If it comes out at 150, the scope has got away from you, and there is a whole section on that further down.

What you are NOT being asked for. Worth saying early, because half the risk in this module is doing too much:

  • You are not asked for a pretty application. An ugly but functional interface scores the same as a beautiful one.
  • You are not asked for a machine learning model of your own. A pre-trained API satisfies the AI requirement.
  • You are not asked for multi-region high availability. One region is more than enough.
  • You are not asked for Kubernetes. Cloud Run is the recommended default.
  • You are not asked for a large data volume. A thousand fictional rows demonstrate the same as ten million and cost nothing.
  • You are not asked for it to be "finished" in the sense of a product. You are asked for it to be complete in the sense that every layer exists and they work together.

  1. How to choose the problem: criteria for a portfolio project that works

Choosing the problem is the decision with the most consequences in the whole module, and it is taken in the first hour. A bad problem turns the project into a six-month ordeal; a good one turns it into four enjoyable weekends.

Five criteria, in order of importance:

Criterion 1 — You understand the domain without having to research it

If you choose "algorithmic trading platform" and you do not know what an order book is, you are going to spend 70 % of the time learning finance instead of learning GCP. The domain must be so obvious to you that you could write the functional requirements from memory in twenty minutes.

Good domains: bookings, catalogues, inventories, incidents, fleet tracking, courses, appointments, membership management. Everybody understands how a booking works.

Bad domains: anything with complex regulation (real healthcare, banking, insurance), anything where the algorithm is the product (genuine recommendation engines, true route optimisation), anything that depends on an external integration you do not control.

Criterion 2 — The scope fits in one sentence without the word "and"

Try describing your project in one sentence. If you need two "and"s, it is already too big.

  • ✅ "A platform where users book places in mountain refuges."
  • ⚠️ "A platform where users book places in refuges and wardens manage availability and there is a marketplace of guides."
  • ❌ "An ERP for the integrated management of mountain refuges."

Scope is cut before you start, not halfway through. Cutting halfway through means throwing away work already done.

Criterion 3 — You can generate plausible fictional data

You are going to need data for the operational database, for the analytical warehouse and for the AI component. If your domain needs data you cannot invent credibly (labelled medical images, real banking transactions), change domain.

A good project can be seeded with a 60-line Python script that generates 2,000 coherent rows: dates that make sense, amounts in a reasonable range, a distribution with some seasonality so the dashboard does not come out flat.

Criterion 4 — It naturally exercises several layers

The "application + storage + database + data + analytics + AI" requirement must come out of the problem, not be forced on top of it. If you have to invent an excuse to bring in Pub/Sub, the project is badly chosen.

Ask yourself: is there something that happens asynchronously? Are there files to upload? Is there something to analyse historically? If all three answers are yes, the project fits by itself.

Criterion 5 — You actually fancy it

You are going to spend 50 hours on this, many of them debugging IAM permissions at eleven at night. If the topic bores you on day one, the project never gets finished. This criterion looks soft and it is the one that kills the most projects.

The decision table

Score every idea that occurs to you from 1 to 5 on each criterion. If any column scores below 3, discard it:

Idea Known domain Bounded scope Fictional data Several layers Interest Total
Mountain refuge bookings 5 5 5 4 4 23
Trading platform 2 2 2 5 4 15
Veterinary clinic portal 4 4 5 5 3 21
General-purpose social network 5 1 3 4 3 16

  1. Four worked proposals

If you do not have a clear idea of your own, use one of these four. They are sized for the module, they have inventable data and they exercise every mandatory layer. All four are fictional.

Proposal A — RefugioReserva (mountain refuge booking platform)

The problem. A fictional mountaineering federation manages 12 refuges in the Pyrenees. Today bookings are made by phone and written down in one spreadsheet per refuge. There is overbooking, nobody knows the real occupancy until the weekend arrives, and there is no way of knowing which refuges perform best.

What you build.

  • A public site where a hiker searches by refuge and date, sees free places and books.
  • A private area where each refuge's warden checks the day's bookings.
  • Upload of refuge photos to a bucket, with thumbnail generation.
  • Every booking publishes an event that feeds the analytical warehouse.
  • An occupancy dashboard by refuge, month and type of place.
  • AI component: sentiment analysis of the reviews hikers leave (pre-trained API) or automatic tagging of the photos.

Fictional data. 12 refuges with name, coordinates and capacity; 2,000 bookings spread over 18 months with summer seasonality; 400 free-text reviews.

Difficulty: medium-low. It is this module's reference proposal and the one used in every exercise solution.

The interesting thing it teaches. Availability management has a real race condition (two people booking the last place), which gives rise to a genuine transaction and an integration test that means something.

Proposal B — VetPortal (veterinary clinic portal)

The problem. A fictional chain of three veterinary clinics needs to manage animal records, appointments and clinical histories. Today they use a desktop program installed on one computer per clinic, with no remote access.

What you build.

  • An authenticated site where staff register animals and owners, and schedule appointments.
  • Upload of X-rays and photos of an injury's progress to a bucket with a storage class based on age.
  • Appointment reminders: creating an appointment publishes a message that triggers a simulated send.
  • A dashboard of diary occupancy, most frequent reasons for consultation and revenue per clinic.
  • AI component: entity extraction from the free text of the clinical history (natural language API) to tag diagnoses, or classification of the uploaded images.

Fictional data. 3 clinics, 8 vets, 600 animals, 3,500 historical appointments, 1,200 free-text clinical notes.

Difficulty: medium.

⚠️ Important warning for this proposal. Although animal data is not personal data, their owners' data is. Work exclusively with invented names, phone numbers, emails and addresses. Do not copy any clinic's real database, not even an "anonymised" one: badly done anonymisation is re-identifiable and lands you in a GDPR problem that has nothing to do with learning GCP.

Proposal C — RutaFlota (delivery fleet manager)

The problem. A fictional last-mile delivery company with 30 vans wants to know where its vehicles are, which deliveries they have made and how long each route takes.

What you build.

  • Position ingestion: a simulator publishes each van's position to a topic every 30 seconds.
  • A web service with a map showing the fleet's current state and the detail of each route.
  • Storage of signed delivery notes (images) in a bucket.
  • An operational database with vehicles, routes, stops and deliveries.
  • A dashboard of punctuality, kilometres per route and failed deliveries by reason.
  • AI component: OCR over the scanned delivery notes (vision API) to extract the order number.

Fictional data. 30 vehicles, 12 routes, 90 days of history with around 400 deliveries a day, and a GPS position generator that follows plausible trajectories.

Difficulty: medium-high. It is the proposal with the most data volume and the one that exercises streaming the most, but also the one whose cost most easily runs away if you leave the simulator running. Read that as a warning: here the cost requirement is part of the challenge.

⚠️ The geographic position of an identifiable person is personal data of a sensitive category. Work with invented vehicles and drivers, never with a real fleet's data.

Proposal D — AulaViva (online course platform)

The problem. A fictional technical training school wants to replace its arrangement of videos on a shared drive and enrolments by email with a platform of its own.

What you build.

  • A public course catalogue and a private student area with their progress.
  • Materials (PDFs, videos) in a bucket, served with CDN and signed URLs.
  • An operational database with courses, lessons, enrolments and progress.
  • "Lesson completed" events that feed the analytical warehouse.
  • A dashboard of completion rate per course, lessons where people drop out and weekly activity.
  • AI component: generation of an automatic summary of each lesson with a generative model, or semantic search over the content using embeddings.

Fictional data. 20 courses, 250 lessons, 800 students and 40,000 progress events.

Difficulty: medium. It is the proposal that most resembles this very course, which makes it easy to reason about and unlikely to surprise you.

Quick comparison

RefugioReserva VetPortal RutaFlota AulaViva
Difficulty Medium-low Medium Medium-high Medium
Estimated hours 40-50 45-55 55-70 45-55
Cost risk Low Low High Medium (CDN, videos)
Exercises streaming Little Little A lot Medium
Exercises AI Sentiment Entities Vision/OCR Generative
Personal data involved Low High High Medium
Recommended if… It is your first cloud project You are interested in structured data You are interested in real time You are interested in generative AI

  1. Bringing your own problem (and the warning you cannot skip)

Bringing your own problem is the best option if you meet the five criteria in section 2. A project that solves something you understand and care about defends itself far better in an interview than a template, because the moment they ask "and why this?" you have a real answer.

But there is one line that is not crossed:

⚠️ Do not use real data from your company, or from anybody's company.

Not an export "that is already anonymised". Not a dump of the development database. Not the customer file with the names changed. Not the support system's conversations "that do not have names in them".

Three reasons, any one of them sufficient:

  1. Legal. GDPR does not distinguish between "production" and "a project I am doing to learn". If you process personal data you need a legal basis, a purpose, minimisation and a contractual relationship with the processor. A portfolio project in your personal GCP account has none of that.
  2. Contractual. Almost any employment or confidentiality contract forbids taking company data into an environment the company does not control. Your GCP project is exactly that.
  3. Practical. A portfolio project is shown off. It goes on GitHub, the URL is shared, it is projected in an interview. If it contains real data, you have just published it.

What you can do: replicate the structure of the real problem with invented data. The schema, the flows, the business rules and the technical difficulties are yours and are not confidential; the data is not. An 80-line synthetic data generator solves this in an afternoon.

And if your project is still going to handle data that looks like personal data (names, emails, addresses, even invented ones), apply from the start what you saw in 04-07 and 07-04: encryption at rest with managed keys, least privilege, defined retention with real deletion, and logs that do not write those fields. Not because your invented data needs it, but because the habit is the deliverable.

One-page template for validating your own idea

Before accepting it, fill this in. If any box is left empty, the idea is not ready:

# Project idea validation

**Project name:**
**One sentence:** (without the word "and")

## The problem
Who has the problem? What do they do today without the platform? What hurts?

## Scope INCLUDED (maximum 5 points)
1.
2.
3.

## Scope EXPLICITLY EXCLUDED (minimum 5 points)
1.
2.
3.
4.
5.

## How it meets the mandatory requirements
| Requirement | How my project meets it |
| --- | --- |
| Containerised web app | |
| Object storage | |
| Managed database | |
| Data ingestion or processing | |
| Analytical dashboard | |
| AI component | |

## Data
Where does it come from? (it must be 100 % invented)
How many rows? How do I generate it?

## Main risk
What is most likely to block me?

The excluded scope section is the most important in the document and the one everybody leaves blank. Writing "there will be no payments", "there will be no mobile app", "there will be no multi-language", "there will be no roles beyond admin and user", "there will be no real email notifications" is what saves you three weeks from now, when you fancy adding any of those things.

  1. Mandatory minimum functional requirements

These six are mandatory. Whatever your problem, they must exist. They are phrased as a verifiable list: each one has a "done" criterion you can check with a command.

# Requirement "Done" criterion How you verify it
RF-1 Containerised and deployed web application There is a public HTTPS URL that returns 200 and serves the main functionality curl -s -o /dev/null -w "%{http_code}" https://your-domain
RF-2 Object storage There is at least one bucket with application content (images, files, documents), served in a controlled way gcloud storage ls gs://your-bucket/**
RF-3 Managed database There is a managed database (Cloud SQL, Firestore, Spanner…) with the operational model and fictional data gcloud sql instances describe / gcloud firestore databases list
RF-4 Data ingestion or processing There is a flow that moves data from the operational system to the analytical one (Pub/Sub, a scheduled job, Dataflow, a function) The analytical warehouse has new rows after an action in the app
RF-5 Analytical dashboard There is a dashboard with at least 4 visualisations that answer real business questions Looker Studio report URL
RF-6 At least one AI component There is a feature that uses a model. It can be a pre-trained API (Vision, Natural Language, Gemini) A sample call with its saved response

Detail on each one:

RF-1 — Containerised web application. Containerised means there is a Dockerfile and that the image is built in CI, not on your laptop. The default recommendation is Cloud Run (07-02): it scales to zero, you do not pay when nobody is using it, and the contract is simple. If you choose GKE, let it be because you have a written reason, not to show off: a cluster left running eats the whole project's budget.

RF-2 — Object storage. An empty bucket created to tick the box does not count. It must be part of the flow: the user uploads something, or the application serves something from there. Apply what you saw in 02-02: uniform bucket-level access, nothing public except what has to be, and a lifecycle rule even if it is trivial.

RF-3 — Managed database. Managed, not a container with PostgreSQL inside. The decision tree in 02-06 tells you which: relational with transactions → Cloud SQL; documents with key access and scaling to zero → Firestore. For most of these projects, Cloud SQL PostgreSQL on the smallest instance or Firestore are the right answers.

RF-4 — Ingestion or processing. This is the requirement most people under-interpret. It is not enough for the app to write to the database. There must be an asynchronous or scheduled flow that takes data from one place to another: a Pub/Sub topic collecting events, a Cloud Run job that dumps into BigQuery every night, a function triggered when a file is uploaded. It is the piece that shows you understand the difference between the operational plane and the analytical one (04-01, 04-04).

RF-5 — Dashboard. Four visualisations that answer questions, not four pretty charts. "Which refuge has the most cancellations?" is a question. "Distribution of bookings" is not. Looker Studio on top of BigQuery is free and sufficient (04-07).

RF-6 — AI component. Always start with a pre-trained API. Vision, Natural Language or Gemini solve the requirement in two hours and they work. Training your own model with Vertex AI is optional, costs money and is the number one source of projects that never get finished. If you have time to spare at the end, then by all means: replace the API with a model of your own and document the comparison against the baseline, exactly as Lucía did in DA-003.

  1. Mandatory non-functional requirements

This is where this project separates itself from a demo. Eight requirements, all mandatory, all verifiable:

# Requirement "Done" criterion Reference lesson
RNF-1 Infrastructure as code terraform destroy + terraform apply rebuild the entire system. Nothing created by hand is left without code 06-07
RNF-2 CI/CD with at least one automated test A push to the main branch runs tests, builds the image and deploys. If the test fails, it does not deploy 06-01
RNF-3 IAM with least privilege and no JSON keys Zero service accounts with owner/editor. Zero downloaded keys. CI/CD via Workload Identity Federation 03-04, 06-02
RNF-4 Secrets outside the code Not one password, connection string or API key in the repository. Everything in Secret Manager 03-06
RNF-5 HTTPS with your own domain or subdomain The app responds at https://something.yourdomain.tld with a valid certificate 03-07
RNF-6 Observability: 1 dashboard + 1 alert There is a dashboard with the golden signals and at least one alerting policy that really notifies 06-04, 06-06
RNF-7 One SLO defined and measured There is an SLI, a numeric objective, a window and a visible error budget 07-06
RNF-8 Budget with an alert There is a budget on the billing account with thresholds at 50/90/100 % 01-04, 07-05

The three people skip and should not:

RNF-1 (real IaC). The criterion is not "I have some .tf files". The criterion is that the system rebuilds itself from scratch. The test is done in 08-04 and it is merciless: you destroy the entire development environment and create it again. If it does not come up, your IaC was not IaC: it was documentation with Terraform syntax.

RNF-3 (no JSON keys). This is the one that will differentiate you most. Most portfolio projects have a credentials.json in the repository or, at best, in .gitignore. Configuring Workload Identity Federation between GitHub Actions or Cloud Build and GCP takes half an hour the first time and is exactly what a professional does. And remember AlpinaShop's case: a key lost for fourteen months.

RNF-7 (SLO). An SLO is not "I want it to be fast". It is: "99 % of requests to /api/* respond in under 800 ms, measured over a 28-day window". With its error budget calculated and visible. It takes an afternoon and it is one of the things that impresses most in an interview, because almost nobody at junior level knows how to formulate it.

  1. The cost constraint: the requirement that will teach you the most

Set a monthly limit now and write it down. The project must be buildable and maintainable within Google Cloud's trial credit (300 USD / 90 days at the time of writing — verify it, the terms change) or, if your credit has run out, below a monthly limit you set yourself.

Reasonable reference values:

Monthly limit What fits Recommended for
€0 (free tier only) Cloud Run, Cloud Functions, Firestore, BigQuery (1 TB queried/month), 5 GB of Storage Anyone who does not want to spend a thing. Forces Firestore instead of Cloud SQL
€10-15/month The above + Cloud SQL db-f1-micro or overnight shutdown + domain The recommended option. It is what the reference project costs
€30-40/month The above + Cloud SQL with a bit more muscle + CDN + logs with retention If you want headroom and do not mind the spend
>€50/month That is no longer a constraint, it is a budget Only if you have a reason

Why the constraint is part of the exercise and not an inconvenience. Anybody can build an architecture that works with infinite money. What distinguishes a good cloud engineer is building it with the money that exists. The cost constraint will force you to take exactly the decisions that are taken in a real company:

  • Scaling to zero instead of having reserved capacity (Cloud Run vs. MIG).
  • Choosing the smallest instance that does the job, and measuring whether it does.
  • Shutting down development environments overnight.
  • Partitioning BigQuery tables so you do not scan 1.2 TB every time the dashboard opens.
  • Not leaving a GKE cluster running "for testing".
  • Putting lifecycle rules on buckets from day one.
  • Retaining logs for 30 days and not 400.

All of that is 07-05 applied to your own pocket, which is the best way to learn it.

The budget is the first thing you create

Before creating a single resource. Literally on day one, before anything else:

# Replace with your real values
export BILLING_ACCOUNT="0X0X0X-0X0X0X-0X0X0X"
export PROYECTO="miproyecto-dev"

# €15-a-month budget with alerts at 50 %, 90 % and 100 %
gcloud billing budgets create \
  --billing-account="${BILLING_ACCOUNT}" \
  --display-name="Final project budget" \
  --budget-amount=15EUR \
  --threshold-rule=percent=0.5 \
  --threshold-rule=percent=0.9 \
  --threshold-rule=percent=1.0 \
  --filter-projects="projects/${PROYECTO}"

And the warning that always bears repeating: a budget alerts, it does not prevent. If you leave something expensive running, the budget sends you an email while the meter keeps climbing. What really prevents are quotas (07-07) and the habit of looking at the billing report every few days. Set yourself a reminder: every Tuesday and every Saturday, open the cost report. Thirty seconds.

⚠️ All prices in this module are orders of magnitude, not rates. Google Cloud prices change, vary by region and depend on discounts and the free tier. Always check the official calculator and the service's pricing page before committing a figure to your architecture document.

  1. Deliverables and their format

Seven deliverables. The first three are the project; the next four are what makes the project assessable and defensible.

# Deliverable Format Where it lives Worked on in
E-1 Code repository Git, with a history of real commits Public GitHub/GitLab 08-03
E-2 Architecture document Markdown with mermaid diagrams docs/arquitectura.md 08-02
E-3 Infrastructure as code Terraform with modules and remote backend infra/ in the repository 08-03
E-4 Deployed application Working HTTPS URL Cloud Run + domain 08-03
E-5 Dashboard Shared Looker Studio report Link in the README 08-03
E-6 Operations document (runbook) Markdown docs/runbook.md 08-04
E-7 Presentation 12-15 slides + script docs/presentacion/ 08-05

Repository structure (detailed in 08-03, but decide it now):

mi-proyecto/
├── README.md                 # The front door. Readable in 2 minutes.
├── app/                      # Application code
│   ├── Dockerfile
│   ├── src/
│   └── tests/
├── infra/                    # Terraform
│   ├── modules/
│   ├── envs/
│   │   ├── dev/
│   │   └── prod/
│   └── README.md
├── data/                     # Fictional data generators, SQL, ETL
│   ├── seed/
│   └── sql/
├── ml/                       # AI component
├── docs/
│   ├── arquitectura.md
│   ├── runbook.md
│   ├── adr/                  # Architecture decisions, one per file
│   │   ├── ADR-001-eleccion-computo.md
│   │   └── ADR-002-base-de-datos.md
│   ├── diario.md             # Log of decisions and problems
│   └── presentacion/
├── cloudbuild.yaml
└── .gitignore

Create this skeleton today, even if it is empty. Empty directories with a one-line README.md saying what will go there are worth more than the best intention to organise it later.

  1. The assessment rubric

This is the rubric you will use to assess yourself in 08-05. Read it now, because knowing how you will be scored changes what you build.

100 points, spread over seven blocks:

Block Points What is assessed
A. Design and decisions 20 Coherent architecture, justified decisions, rejected alternatives in writing
B. Functional implementation 20 The 6 functional requirements exist and work end to end
C. Infrastructure as code 15 Real reproducibility, modules, remote state, nothing created by hand
D. Security and identity 15 Least privilege, no keys, managed secrets, minimal exposure, TLS
E. Delivery and testing 10 CI/CD working, tests that fail when they should, reversible deployment
F. Observability, SLOs and cost 10 Dashboard, alert, measured SLO, budget and cost within the limit
G. Documentation and presentation 10 README, architecture, ADRs, runbook and a defensible presentation

Detail by block

A. Design and decisions (20 points)

Criterion Insufficient (0-40 %) Adequate (60-80 %) Excellent (100 %)
Documented architecture There is no diagram, or it is out of date One diagram that reflects the system Three levels (context, components, deployment), consistent with each other
Justification of services "I used Cloud Run" It explains why It explains why and what was rejected, with the criterion
ADRs None 1-2 ADRs ≥3 ADRs with context, options, decision and consequences
Data model Implicit in the code Documented schema Schema + data lifecycle + where each thing lives and why

B. Functional implementation (20 points) — 3 points per functional requirement met (18) + 2 points if the complete flow works end to end with no manual intervention.

C. Infrastructure as code (15 points)

Criterion Points
Remote state in a versioned bucket 2
Provider pinned by version, no latest 1
At least two of your own modules reused 3
Variables per environment, with no duplicated values 2
Clean terraform plan (no changes) against the deployed system 3
The environment is recreated from scratch and works 4

D. Security and identity (15 points)

Criterion Points
Zero service accounts with owner/editor 3
Zero downloaded JSON keys (WIF in CI/CD) 3
Secrets in Secret Manager, nothing in the repository 3
Database with no public IP 2
No bucket accessible by allUsers unless justified 2
HTTPS with a valid certificate and reasonable headers 2

E. Delivery and testing (10 points)

Criterion Points
Pipeline that builds and deploys automatically 3
At least one automated test that fails when you break the code 3
Promotion of the same image to production, without rebuilding 2
Rollback procedure written and rehearsed 2

F. Observability, SLOs and cost (10 points)

Criterion Points
Dashboard with the four golden signals 2
At least one alert that has really notified (triggered on purpose) 2
Structured logs with a correlation identifier 2
SLI + SLO + error budget documented and measured 2
Real cost within the limit set, with a per-service breakdown 2

G. Documentation and presentation (10 points)

Criterion Points
README that lets somebody else get the project running 2
Complete architecture document 2
Runbook with at least 3 operational procedures 2
Decision log maintained throughout the project 1
10-15 minute presentation with a demonstration 3

How to read your score

Score Reading
< 50 It is a demo, not a project. At least one whole layer is missing
50-69 Functional project with significant debt. Good for learning, not for showing
70-84 A solid portfolio project. This is the realistic goal of this module
85-94 A project an interviewer will remember
95-100 Suspicious. Score yourself again, honestly, especially on C and D

That last row is not a joke. Honest self-assessment is part of the mark: in 08-05 you will see that recognising and prioritising technical debt adds points, and hiding it takes them away.

  1. Planning: effort per phase and schedule

Estimate for a medium-difficulty project, first time, working alone:

Phase Lesson Hours What it produces
F0. Choice and requirements 08-01 2-4 Validated idea, written scope, cost limit
F1. Design 08-02 5-8 Diagrams, ADRs, data model, cost estimate
F2. Foundations: projects, network, IaC 08-03 6-10 Terraform working, network created, budget active
F3. Identity and data 08-03 4-6 Service accounts, database, buckets, seeded data
F4. Application 08-03 8-12 Containerised app deployed and working
F5. CI/CD 08-03 4-6 Pipeline with tests, WIF with no keys
F6. Data, analytics and AI 08-03 6-9 Ingestion, analytical tables, dashboard, AI component
F7. Exposure and observability 08-03 4-6 Domain, TLS, load balancer, dashboard, alert, SLO
F8. Testing and deployment 08-04 5-8 Tests, load test, rollback rehearsal, go-live
F9. Documentation and presentation 08-05 4-6 Complete docs, self-assessment, presentation
Total 48-75 h

Multiply by 1.5 if this is your first cloud project. It is not pessimism: it is the empirical observation that the first time you configure Workload Identity Federation it takes two hours and the second time, fifteen minutes.

Reference six-week schedule

gantt
    title Final project — 6-week plan (10 h/week)
    dateFormat YYYY-MM-DD
    axisFormat Wk %W

    section Preparation
    Choose problem and scope       :done, f0, 2026-09-07, 3d
    Design and ADRs                :active, f1, after f0, 5d
    Milestone 1 Design reviewed    :milestone, m1, after f1, 0d

    section Build
    Projects, network, Terraform   :f2, after m1, 5d
    Identity and data              :f3, after f2, 3d
    Application deployed           :f4, after f3, 6d
    Milestone 2 App live in dev    :milestone, m2, after f4, 0d

    section Automation
    CI/CD with tests               :f5, after m2, 4d
    Data, analytics and AI         :f6, after f5, 5d
    Milestone 3 End to end flow    :milestone, m3, after f6, 0d

    section Closing
    Exposure and observability     :f7, after m3, 4d
    Testing and go-live            :f8, after f7, 4d
    Documentation and presentation :f9, after f8, 4d
    Milestone 4 Project delivered  :milestone, m4, after f9, 0d

The four milestones are checkpoints, not decoration. At each one you stop and check:

Milestone Pass criterion If you do not meet it
M1 — Design reviewed The three diagrams exist, there are ≥3 ADRs, the cost estimate fits in your limit Do not start building. Cut scope
M2 — App live in dev There is a URL that responds and reads from the database Simplify the app. Functionality is not the deliverable
M3 — End-to-end flow An action in the app ends up visible on the dashboard Reduce the data flow to a simple nightly job
M4 — Project delivered The rubric gives you ≥70 and the cost is within the limit Prioritise D (security) and C (IaC) over new functionality

If you are running late, cut functionality, never non-functional requirements. An application with two screens, complete IaC and impeccable security scores far above one with eight screens and a credentials.json in the repository.

  1. Risk management: the five mistakes that sink a final project

These five are not "common mistakes". They are the five reasons portfolio projects do not get finished. Recognise them now and you have half the work done.

Mistake 1 — Excessive scope

How it shows up. In week 2 you add "it would be easy to put payments in too". In week 3, notifications. In week 4, a mobile app. In week 6 you have nine half-finished things and none of them done.

Why it happens. Because adding functionality is fun and finishing is not. And because the excluded scope was not written down.

The countermeasure. The exclusion list from section 4, written and signed by you on day one. When something new occurs to you, do not discard it: note it in a ## Next steps section of the README. That turns the temptation into a deliverable for the presentation, where it scores.

Mistake 2 — Starting with the code

How it shows up. On day one you open the editor and start the application. Three weeks later you have a nice app and no infrastructure, no IaC, no security. And then you try to "put Terraform on" something that already exists, which is twice the work.

Why it happens. Because programming is what you know how to do and everything else feels like a chore.

The countermeasure. The order in 08-03: organisation → network → identity → state → data → application. The application is phase 4 of 8, not phase 1. And there is a hard technical reason: the projectId cannot be changed and the network cannot be redone without destroying everything. What gets decided first is what is expensive to change.

Mistake 3 — Leaving security until the end

How it shows up. Everything with roles/owner "so it works now", a JSON key downloaded "temporarily", the database password in a variable in the code. In the last week you try to fix it, break everything and end up leaving it as it was.

Why it happens. Because least privilege hurts at the start: every missing permission is a 403 and half an hour of debugging.

The countermeasure. Start restrictive and only open what fails. gcloud policy-troubleshoot tells you exactly which permission is missing (you have it in 03-04). It hurts the first week and never hurts again. And block D of the rubric is worth 15 points that are lost entirely if you get this wrong.

Mistake 4 — Forgetting the cost

How it shows up. You leave a GKE cluster running over a weekend. Or a streaming Dataflow job. Or a big Cloud SQL instance "so it goes fast". On Monday you have spent €180 and burned half the trial credit.

Why it happens. Because in the cloud you do not see the hardware. A switched-off server in your house consumes nothing; a running VM in the cloud does, even if you are not using it.

The countermeasure. Three things, all from section 7: the budget created before anything else, reviewing the cost report twice a week, and the habit of destroying the development environment when you are not using it. That last one is a superpower you only have if your IaC is real:

# Friday afternoon
terraform -chdir=infra/envs/dev destroy -auto-approve
# Saturday morning
terraform -chdir=infra/envs/dev apply -auto-approve

If that works, your development project costs nothing when you are not working. And along the way you are running the hardest test of RNF-1 every week, for free.

Mistake 5 — Not documenting as you go

How it shows up. In the last week you sit down to write the architecture document and you cannot remember why you chose Firestore instead of Cloud SQL. You write a justification invented after the fact, which shows, and which may not even be the real reason.

Why it happens. Because documenting feels like it does not move the project forward.

The countermeasure. docs/diario.md. Every working session, three lines:

## 2026-09-14 (2 h)
- Done: network and subnets with Terraform, first clean apply.
- Decided: a single /24 subnet in europe-west1. Rejected splitting by
  environment because each environment is a separate project and they do not talk.
- Stuck: Cloud SQL with a private IP needs private service
  connection; I kept forgetting the peering. 40 min lost.
- Next: service accounts.

Three lines per session, twenty sessions: sixty lines that turn themselves into the architecture document, the ADRs and half the presentation. It is the best-return investment in the whole module.

Risk matrix

Risk Probability Impact Mitigation Early signal
Excessive scope High High Written exclusions + milestones Week 3 with no M2
Starting with the code High High The phase order in 08-03 There is no infra/ at commit 20
Security at the end Very high Medium Restrictive from day 1 You see roles/editor in a .tf
Runaway cost Medium High Budget + nightly destroy Bill >30 % of the limit in week 1
Not documenting Very high Medium diario.md every session No commits in docs/
Long technical blockage Medium Medium The 5-step method (section 13) >3 h on the same error
Abandonment Medium Total Short milestones, small scope 10 days without a commit

The last one is the real risk. The genuine mitigation against abandonment is that the project is small and you fancy it, which is what criteria 2 and 5 were saying.

  1. How to work with the official documentation

You are going to spend a substantial part of the project reading documentation. Doing it well is a skill, and these are the rules:

1. The official documentation is the source. Everything else is context. A blog post from 2021, a Stack Overflow answer from 2019 or a YouTube video can help you understand a concept, but not for copying commands: the CLI changes, roles get renamed, services get deprecated. The course itself, however up to date it is in 2026, is a snapshot of one moment.

2. The four sections you need to know for each service:

Section What it is for When you read it
Overview / Concepts Understanding the mental model Before deciding to use it
Quickstart Getting it working in 10 minutes When you start building
How-to guides The specific case you need During the build
Reference (API/CLI/Terraform) The exact parameter When something does not work
Quotas & limits What is going to limit you Before designing, not after
Pricing What it is going to cost In 08-02, without exception

The quotas and limits section is the one fewest people read and the one that avoids the most grief. Knowing that Cloud Run has a request timeout, or that BigQuery has a maximum number of table operations per day, changes the design.

3. The Terraform registry is as important as the GCP documentation. For each resource you create, registry.terraform.io/providers/hashicorp/google/latest/docs gives you the exact arguments, which ones are required, which force the resource to be recreated (ForceNew) and what can be imported. That ForceNew is the difference between a 20-second apply and one that destroys your database.

4. Release notes exist. Every service has its release notes page. Before giving up on a feature, check whether it shipped last month.

5. When the documentation and the error message contradict each other, the error message wins. And when the error message says "permission denied", it is almost always right: it is not a bug, you are missing a permission.

  1. What to do when something does not work

You are going to get stuck. Several times. The following method resolves the vast majority of blockages in under twenty minutes, and the important thing is to apply it in order rather than trying things at random:

Step 1 — Read the whole error. All of it, to the end, including the details and the link it sometimes includes. Half of GCP's errors literally say which permission is missing or which API needs enabling.

# API errors end up in the logs. The last 20:
gcloud logging read 'severity>=ERROR' --limit=20 --format=json --project="${PROYECTO}"

Step 2 — Is the API enabled? It is the number one cause of inexplicable errors in the first week:

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

Step 3 — Is it a permission? If the error contains 403, PERMISSION_DENIED or does not have permission, it is a permission, no exceptions:

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

Step 4 — Is it the network? If the symptom is a timeout and not a rejection, it is the network:

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

Step 5 — Is the resource the way you think it is? A describe demolishes half of all wrong hypotheses:

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

And if after twenty minutes you are still stuck: switch task. Document the blockage in docs/diario.md with the exact error and what you have already tried, and go to another phase. Coming back the next day with a clear head resolves more blockages than pushing on for three hours straight. This advice sounds like self-help and is purely statistical.

  1. Your decision today

Before moving on to 08-02, five things. They are not optional and they take no more than two hours:

  • [ ] Choose the problem. One of the four proposals or your own, validated with the template in section 4.
  • [ ] Write the sentence. One sentence without "and". Paste it into the first line of the README.
  • [ ] Write the five exclusions. What your project is not going to do.
  • [ ] Set the cost limit. A number in euros per month, written in the README.
  • [ ] Create the repository with the folder skeleton and the first commit.

If you cannot do all five today, your problem is not chosen yet. Go back to section 2.

Common Mistakes and Tips

Choosing a problem you do not understand because it sounds impressive. "Credit risk analysis platform with AI" sounds better than "mountain refuge bookings" until you have to model credit risk. In an interview, a simple project explained well always beats a complex one you stumble through.

Confusing "complete" with "big". The project is assessed by layers covered, not by functionality. Two screens with IaC, CI/CD, an SLO and security are worth 80 points; fifteen screens with none of that are worth 45.

Creating the GCP projects before reading 08-02. The projectId is immutable. If you create test-1234 because you were in a hurry, you are going to show it in the interview. Wait for the design lesson, where the naming convention is decided.

Using the trial credit as if it were infinite. 300 USD looks like a lot until you leave a GKE running: a standard three-node cluster eats about €100 a month on its own. Cloud Run scales to zero; GKE Autopilot does not cost zero but costs little; standard GKE costs from minute one.

Leaving the AI component until the end and choosing to train a model. That is the reverse of the correct order: put the pre-trained API in phase 6 (two hours, it works) and only if you have time to spare, replace it with a model of your own. A simple AI component that works is worth the 3 points; an ambitious half-finished one is worth 0.

Not reading the rubric until the end. The rubric is the specification. Anything you do that is not in the rubric is time that does not score. Keep it open in a tab throughout the module.

Tip: do a git commit at the end of every session, even if it does not work. The commit history is a deliverable in itself: a repository with 60 commits spread over six weeks tells a story of real work. One with 3 giant commits tells a different one.

Tip: save every screenshot and every number from the start. The screenshot of the dashboard the day it worked, the result of the first load test, the first month's bill. In 08-05 you are going to need them and reconstructing them is impossible.

Tip: put a real alarm in the calendar. Two fixed sessions a week, in the calendar, with a name. Personal projects do not die from technical difficulty: they die because there is never a moment.

Exercises

The exercises in this module are milestones of your own project. The solutions show the same milestone solved for RefugioReserva, the reference project, so that you have a model without being able to copy yours.

Exercise 1 — Define and bound your project

Choose your problem and fill in the full validation template from section 4: name, one-line sentence without "and", the problem with its user, included scope (maximum 5 points), excluded scope (minimum 5 points), the table of how you meet the six functional requirements, the origin and volume of the fictional data and the main risk.

Then score your idea with the decision table of the five criteria. If any criterion scores below 3, change idea or adjust it until it goes up.

Exercise 2 — Set your cost constraint and create it

Decide your monthly limit, justify it in two lines and create the real budget in your billing account with thresholds at 50, 90 and 100 %. Document in a table which services you expect to use, with which minimum configuration and what order of magnitude of cost you have in mind (you will refine it in 08-02 with the calculator).

Also, write the answer to this question: if in three weeks you discover you are at 200 % of your limit, what is the first thing you switch off? That order of priority written in advance is what saves you from deciding in a hurry.

Exercise 3 — Plan and prepare the ground

Adapt the schedule in section 10 to your real availability (hours per week you can genuinely dedicate, not the ones you would like). Produce a mermaid diagram with your dates and your four milestones, and for each milestone write its pass criterion and what you would cut if you do not meet it.

Create the repository with the folder skeleton from section 8, the README.md with the project sentence, the exclusions and the cost limit, and docs/diario.md with its first entry. Make the first commit.

Solutions

Solution 1 — Defining and bounding RefugioReserva

# Project idea validation

**Project name:** RefugioReserva
**One sentence:** A platform where a hiker checks and books places in the
refuges of a mountaineering federation.

## The problem
The Pyrenean Mountaineering Federation (fictional) manages 12 refuges.
Bookings are made by phone, between 18:00 and 20:00, and are written down
in one spreadsheet per refuge. Consequences: overbooking on August
weekends (it happened 7 times last year), the warden does not know how much
food to prepare until people arrive, and the federation has no data on
which to decide which refuge to invest in.

## Scope INCLUDED
1. Public availability search by refuge and date.
2. Booking with contact details and confirmation (no payment).
3. Warden's private area: the day's and the weekend's bookings.
4. Upload of refuge photos with automatic thumbnail generation.
5. Occupancy and reviews dashboard for the federation.

## Scope EXPLICITLY EXCLUDED
1. **Payments.** There is no gateway. The booking is paid at the refuge.
2. **Mobile application.** Responsive web only.
3. **Multi-language.** Spanish only.
4. **Management of staff, shifts or refuge inventory.**
5. **Real email or SMS notifications.** The event is recorded and the send
   is simulated; no email provider is contracted.
6. **Roles beyond three:** visitor, warden, federation.
7. **Modification or cancellation by the hiker.** Cancellation is done by
   calling the refuge (the same as today).

## How it meets the mandatory requirements
| Requirement | How it meets it |
| --- | --- |
| Containerised web app | Python service (FastAPI) on Cloud Run `refugio-web` |
| Object storage | Bucket `refugio-fotos` with originals and thumbnails |
| Managed database | Cloud SQL PostgreSQL `refugio-db`, private IP, database `reservas` |
| Ingestion / processing | Every booking publishes to the topic `reservas-eventos`; a function writes it into BigQuery |
| Dashboard | Looker Studio on top of `refugio_analitica.reservas_diarias` |
| AI component | Sentiment analysis of reviews with the Natural Language API |

## Data
100 % invented, generated with `data/seed/generar.py`:
- 12 refuges (name, altitude, capacity, fictional Pyrenean coordinates).
- 2,000 bookings over 18 months, with seasonality: July and August x4,
  weekends x2.5, February at the minimum.
- 400 free-text reviews (combined templates, varied tone).
- 3 wardens and 1 federation user, with `@example.com` emails.

## Main risk
The race condition when booking the last place. If I solve it badly,
the core functionality is broken. Mitigation: a transaction with a row
lock in PostgreSQL and a concurrent integration test that proves it
(it will be my mandatory automated test for RNF-2).

Score with the decision table:

Criterion Mark Reason
Known domain 5 I have slept in refuges; I know how a booking works
Bounded scope 5 One sentence without "and", seven written exclusions
Fictional data 5 A 70-line script generates it
Several layers 4 Streaming is weak (one topic and one function), the rest is more than enough
Interest 4 I like the topic; it is not thrilling but it is not going to bore me
Total 23/25 Go ahead

Solution 2 — RefugioReserva's cost constraint

Limit set: €12 a month. Justification: the trial credit is already used up, and I want the project to be able to stay switched on indefinitely as a portfolio piece without it hurting. €12 is roughly what a domain costs (pro rata) plus a minimal database instance.

Service Configuration Expected cost/month Notes
Cloud Run refugio-web 1 vCPU, 512 MiB, min-instances=0 €0-1 Scales to zero; portfolio traffic is almost nil
Cloud SQL PostgreSQL db-f1-micro, 10 GB HDD, no HA €7-9 The big line item. No HA on purpose: it is a portfolio project
Cloud Storage ~2 GB, Standard, with lifecycle to Nearline at 90 days <€0.10
BigQuery <1 GB stored, <5 GB queried/month €0 Within the free tier
Pub/Sub ~2,000 messages/month €0 Within the free tier
Cloud Functions ~2,000 invocations/month €0 Within the free tier
Natural Language API ~400 documents, one time only <€0.50 Analysed at seeding time, not on every load
Artifact Registry ~2 GB of images €0.20 With a cleanup policy at 10 versions
Cloud Logging 30-day retention, <5 GB €0 Within the free tier
Domain (refugioreserva.example) External registrar ~€1/month €12/year pro rata
Total estimated ~€10/month €2 of headroom over the limit

All these figures are orders of magnitude at the time of writing and for europe-west1. They must be redone with the official calculator in 08-02 before signing the design off.

If I hit 200 % (€24/month), this is the shutdown order, decided in advance:

  1. Switch off Cloud SQL outside working hours with a scheduled job (starts at 9, stops at 23). Immediate saving: ~60 % of the big line item. Risk: the demo does not work in the small hours; acceptable.
  2. Reduce log retention to 7 days and disable data access logs if I had enabled them.
  3. Empty Artifact Registry, leaving only the last 3 images.
  4. Migrate from Cloud SQL to Firestore. This is the nuclear option: it removes 80 % of the cost but means redoing the data layer. Only if the previous three are not enough, and it would be a new ADR with its consequences.
  5. Destroy the development environment and work only against production, more carefully.

What I would not do: remove the load balancer or the certificate (breaks RNF-5), or disable monitoring (breaks RNF-6). Cutting non-functional requirements to save €2 is trading 15 rubric points for the price of a coffee.

Solution 3 — RefugioReserva's plan and groundwork

Declared real availability: 8 hours a week (two 2-hour evenings during the week + 4 hours on Saturday). Against an estimate of 50 hours, that comes to 7 weeks with a little headroom, not 6. Better to acknowledge it now than to be behind from week 1.

gantt
    title RefugioReserva — 7 weeks at 8 h/week
    dateFormat YYYY-MM-DD
    axisFormat %d %b

    section Design
    Requirements and scope      :done, a1, 2026-09-07, 2d
    Design, ADRs, cost          :a2, 2026-09-09, 6d
    M1 Design reviewed          :milestone, m1, 2026-09-15, 0d

    section Foundations
    Projects, APIs, budget      :b1, 2026-09-15, 3d
    Terraform, network, firewall:b2, 2026-09-18, 5d
    Identity and accounts       :b3, 2026-09-23, 3d
    Cloud SQL, buckets, seed    :b4, 2026-09-26, 4d

    section Application
    FastAPI app and container   :c1, 2026-09-30, 6d
    First deployment to dev     :c2, 2026-10-06, 2d
    M2 App live in dev          :milestone, m2, 2026-10-08, 0d

    section Automation
    CI/CD with WIF and tests    :d1, 2026-10-08, 5d
    Pub/Sub, BigQuery, dashboard:d2, 2026-10-13, 5d
    Sentiment with NL API       :d3, 2026-10-18, 2d
    M3 End to end               :milestone, m3, 2026-10-20, 0d

    section Closing
    DNS, TLS, load balancer, CDN:e1, 2026-10-20, 3d
    Dashboard, alert, SLO       :e2, 2026-10-23, 3d
    Tests, load, go-live        :e3, 2026-10-26, 5d
    Docs, rubric, presentation  :e4, 2026-10-31, 5d
    M4 Delivered                :milestone, m4, 2026-11-05, 0d
Milestone Date Pass criterion What I cut if I do not make it
M1 15 Sep 3 diagrams, 4 ADRs, estimated cost ≤€12 Nothing: if the design is not there, nothing gets built. It slips a week
M2 8 Oct https://dev.refugioreserva.example responds and lists refuges from Cloud SQL I drop the warden's area; only the public search is left
M3 20 Oct A booking on the site appears on the Looker Studio dashboard in <10 min I replace Pub/Sub with a nightly job that copies the table into BigQuery
M4 5 Nov Rubric ≥70, real cost ≤€12, presentation recorded I drop the load test and the CDN; both add up to less than the documentation

The ground prepared:

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

A platform where a hiker checks and books places in the refuges of a
fictional mountaineering federation.

> Final project of the Google Cloud Platform course. **All data is
> invented.** It does not contain and has never contained real data about
> people or organisations.

## Cost limit
**€12 a month.** Budget with alerts at 50/90/100 % created on 2026-09-07.

## Out of scope (on purpose)
Payments · mobile app · multi-language · staff management · real
notifications · additional roles · online cancellation.

## Status
🚧 Under construction. See `docs/diario.md`.
EOF

cat > docs/diario.md <<'EOF'
# Decision log

## 2026-09-07 (2 h)
- Done: idea chosen (RefugioReserva), validated with the template, 23/25.
- Decided: cost limit €12/month. Rejected using the trial credit because
  it is already used up and I want the project to stay alive afterwards.
- Decided: 7 weeks instead of 6. I only have 8 real hours a week.
- Next: design (08-02). Do NOT create any GCP project yet:
  the naming convention is decided in the design and the projectId cannot be changed.
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 "Initial structure of the RefugioReserva project"

Notice two details in the .gitignore: *.tfvars and *credentials*.json. The first avoids uploading per-environment values that sometimes carry secrets; the second is a safety net in case one day, in a hurry, you download a key. You should not download any — RNF-3 — but the safety net does no harm.

And notice above all the last line of the log: do not create any GCP project yet. That is the discipline that separates this module from a tutorial.

Conclusion

You now have the complete specification.

You know what you are being asked for: a complete platform from end to end, not a demo, with all the course's layers connected and explained. And you know what you are not being asked for, which matters just as much: no beauty, no scale, no models of your own, no high availability.

You know how to choose the problem with five criteria in order — known domain, scope in one sentence without "and", inventable data, several natural layers and that you fancy it — and you have four worked proposals with their data, their difficulty and their risks, plus the option of bringing your own with one rule that is not negotiable: real data, never, not even "anonymised", not from your company, for legal, contractual and practical reasons.

You have the six functional requirements with their "done" criterion and the command that verifies it, and the eight non-functional ones that separate a project from a demo: reproducible IaC, CI/CD with a test, least privilege with no JSON keys, managed secrets, your own HTTPS, dashboard and alert, one measured SLO and a budget with an alert.

You have the cost constraint understood for what it is: not an inconvenience, but the requirement that forces you to take the same decisions taken in a company — scale to zero, the smallest instance that does the job, partition, switch off what is not used — and with the reminder that a budget alerts but does not prevent.

You have the seven deliverables with their format and their location, the 100-point rubric spread over seven blocks with criteria that can be verified one by one, and the honest reading of the score, including the warning that a 98 probably means you have marked yourself generously.

You have the planning: 48-75 hours spread over ten phases, a reference schedule with four milestones and, at each one, its pass criterion and what to cut if you fall behind — always functionality, never non-functional requirements.

And you have the five mistakes that sink a final project, with their symptom, their cause and their countermeasure: excessive scope (written exclusions), starting with the code (the phase order, because the projectId cannot be changed), security at the end (restrictive from day one and policy-troubleshoot as an ally), forgetting the cost (budget first and destroy on Fridays) and not documenting as you go (three lines of log per session, the best-return investment in the module).

In the next lesson, 08-02, you go from specification to blueprint: translating each requirement into a specific service with its justification and its rejected alternative, drawing the three diagrams that are worth having, deciding the project structure and the naming convention before creating anything, designing the network and identity on paper, modelling the data with its lifecycle, estimating the cost with the calculator and comparing it against your limit, defining your SLOs and writing your first ADRs.

And do not touch the GCP console until then. The projectId cannot be changed.

Google Cloud Platform (GCP) Course

Module 1: Introduction to Google Cloud Platform

Module 2: Core GCP Services

Module 3: Networking and Security

Module 4: Data and Analytics

Module 5: Machine Learning and AI

Module 6: DevOps and Monitoring

Module 7: Advanced GCP Topics

Module 8: Final Project

© Copyright 2026. All rights reserved