The subnets are laid out correctly, but the security groups are lazy — each tier allows ingress from the entire VPC. That means a foothold anywhere gives an attacker lateral access to everything.
By the end, each tier should accept traffic only from the tier directly upstream of it — and the database, in particular, must not be reachable from the internet at all.