The internet reaches exactly one thing: an Application Load Balancer sitting in public
subnets. Everything that runs application code lives in private subnets with no public IP
and no inbound path except the load balancer's security group. Logs and state sit in a
third boundary that neither of the other two can read from.
Four trust boundaries. The only unauthenticated edge is the load balancer listener;
every other hop is permitted by security group reference, an IAM role, or a bucket policy.
02Challenges
Each challenge is a Terraform file with deliberate defects and a symptom instead of an error
message. Reveal the hint only when a team is genuinely stuck; the solution file explains the
root cause and the lesson. Scoring is in the facilitator guide.
03What the refactor changed
The original configuration deployed instances into public subnets behind a security group
open to the world on ports 22 and 80, with no encryption, no logging and no state locking.
These are the controls that replaced it.
Security controls introduced by the refactor
Control
Where
Why it matters
04Review it without an AWS account
Nothing on this page needs credentials, and neither does reviewing the code. The test suite
runs against mocked providers, so the whole security posture is checkable offline and for free.
git clone https://github.com/Freddricklogan/aws-terraform-gameday
cd aws-terraform-gameday
make init # terraform init -backend=false
make lint # fmt -check, validate, tflint
make test # terraform test -- mocked providers, no AWS calls, no cost
make scan # checkov + trivy config