Live on Google Cloud

First Cloud Deployment

AI 255 Project 1. A web service on a Compute Engine VM, reading this page from a private Cloud Storage bucket, reachable through Cloud DNS and served only over HTTPS. Every resource is created with Terraform.

Google Cloud · us-central1 Compute EngineCloud StorageCloud DNS Let's Encrypt TLSLeast-privilege IAMTerraform
Status
…
checking /api/health
Response time
… ms
from your browser, live
Uptime
…
since the service started
Connection
…
…

01Live health

A new measurement every 5 seconds
Last – msAverage – ms Best – msChecks 0
Loading…

02How this page reached you

One request, four stops
Stop 1

Cloud DNS

this domain resolves to the VM's static IP.

Stop 2

Firewall + TLS

Only 80 and 443 are open. Caddy terminates HTTPS with a Let's Encrypt certificate.

Stop 3

VM web-1

A Python service on 127.0.0.1:8080, running as an unprivileged user.

Stop 4

Private bucket

The page and files are read with a read-only service account. No keys on the VM.

03Security by design

What protects this service
1

HTTPS only

HTTP redirects to HTTPS. HSTS, nosniff and frame-deny headers on every response.

2

Read-only identity

The VM's service account can read one bucket. Writing, deleting or any other API returns 403.

3

Private storage

Public access prevention is enforced on the bucket. Files are only reachable through the service.

4

Closed network

Custom VPC. SSH is not open to the internet, only through Google's Identity-Aware Proxy.

5

Hardened VM

Shielded VM with Secure Boot, OS Login, and a systemd sandbox around the app.

6

Locked certificates

A CAA record allows only Let's Encrypt to issue certificates for this domain.

GOOGLE CLOUD PROJECT · US-CENTRAL1 VPC web-vpc · 10.10.0.0/24 Visitorbrowser Cloud DNSA record → static IP Static IPPremium Tier Firewall80, 443 open22 via IAP only VM web-1 · e2-micro CaddyTLS :443 Python:8080 local Service accountobjectViewer, 1 bucket Cloud Storageprivate bucket HTTPS read token

05Files in the bucket

Served by the VM; the bucket itself returns 403
Loading…