A three-tier system (web → app → data) was deployed flat: every tier is public and its security group trusts the entire VPC. One compromised host can reach anything.
By the end, each tier should trust only the tier directly in front of it — web from the ALB, app from web, data from app — with web, app, and database all unreachable from the internet directly, the database encrypted at rest, and NAT still providing egress. Only the ALB stays public.