Design a highly available three-tier application on AWS. What actually fails, and what does each layer of redundancy buy?
TL;DR: Spread every tier across at least two availability zones behind a load balancer, put the database in Multi-AZ so a standby can take over, and keep state out of the instances. That gets you through a zone failure. Surviving a region failure is a different and much more expensive conversation.