Module 8 — Capstone: Build, Ship and Run a 3-Tier Service
Goal: the student delivers, mostly unassisted, a small but complete production- style system: designed on a whiteboard, provisioned with Terraform, deployed by CI/CD, observed with Prometheus/Grafana, and operated against an SLO. This is the portfolio piece and the final assessment.
The brief (give it to the student verbatim)
FieldReport — engineers submit short job-completion reports from the field; a manager views the latest reports on a simple page.
Requirements: 1. Web tier: nginx serving a static frontend + reverse-proxying
/api. 2. App tier: your Python API (extend fieldapp):POST /api/report,GET /api/reports,GET /healthz,GET /metrics. 3. Data tier: PostgreSQL in a container with a volume (RDS discussion optional). 4. All infrastructure changes via Terraform in a git repo — zero console changes. 5. Deploys via the GitHub Actions pipeline + self-hosted runner.mainis always deployable; rollback demonstrated. 6. Dashboard with golden signals + SLO panel. SLO: 99.5% availability, p95 < 400 ms. Two alerts wired to it. 7. HTTPS for the frontend (via the course CloudFront distribution or a Caddy/Let's Encrypt stretch goal on the box). 8. A one-page architecture diagram and a runbook: how to deploy, roll back, and respond to each alert.
Starter skeleton in capstone-app/ (compose file, API stub, nginx config, PIR
template) — using it is allowed; understanding it is required.
Suggested sequence (3–4 sessions)
- Design review (1 h): student presents the architecture diagram; instructor plays awkward stakeholder ("what if the box dies?", "where are secrets?", "how do we know it's slow before users call?"). Revise the module-2 design exercise — measure the improvement.
- Build: Terraform PR for any new SG rules/resources → pipeline builds images → runner deploys compose stack → smoke tests green.
- Observe: scrape configs added, dashboard built, alerts firing in test.
- Game day (final assessment): instructor runs 3 sabotages from a private list (kill the DB container; fill the disk; deploy a bad image the student must roll back; revoke the app's DB password; drop the SG rule between boxes). Student handles each on-call, then writes one PIR.
Marking rubric
| Area | Pass | Distinction |
|---|---|---|
| IaC | plan/apply clean, everything tagged, no console drift | remote state, modules, CI runs fmt/validate/plan on PR |
| Pipeline | push→deploy works; manual rollback shown | deploy gated on tests; rollback is one click/command; SHA-pinned images |
| App/arch | 3 tiers up; state survives redeploys | stateless app tier proven (kill & recreate mid-traffic); healthz used by pipeline |
| Observability | golden signals + both alerts fire correctly | SLO/error-budget panel correct; blackbox outside-in; dashboard JSON in git |
| Operations | restores service in each game-day scenario | fast diagnosis narrated clearly; PIR would pass a real review |
| Runbook | exists, accurate | a stranger could operate the system from it |
After the course
- Re-run the module-0 assessment; show the deltas.
- CV bullets fall straight out of the capstone (provision with Terraform, CI/CD with self-hosted runners, Prometheus/Grafana SLO monitoring, incident response).
- Natural next steps: AWS Certified Cloud Practitioner → Solutions Architect Associate; Terraform Associate; LPIC-1 formally if certification is wanted; CKAD later only if k8s is on the horizon.
- Keep the repo public (secrets scrubbed) — it's a better interview artefact than any certificate.