AWS Architecture Guide

Three-Tier Application VPC Scenario

Goal

This section turns the chapter into a real design answer. The point is not to produce the only correct VPC layout. The point is to practice explaining why the paths and boundaries make sense.

Scenario

A company is deploying a customer-facing application on AWS. It has:

  • a public web entry point

  • private application services

  • a private database tier

  • some outbound calls to external APIs

  • future plans to add more services and shared platform components

The business wants a design that is simple enough to launch now, but structured enough that growth does not force a full redesign in six months.

The Short Version

The architecture answer should sound like this:

I would use one VPC with separate subnets for public entry, private application services, and private data across multiple Availability Zones. Route tables would make only the entry tier internet-facing. Application services could use controlled outbound access through NAT if needed, and the database tier would stay on private paths only. I would also choose address space that leaves room for growth and future connectivity.

That answer is strong because it explains the path logic, not just the objects.

One Possible Layout

Internet
  -> Public subnets / load balancers
  -> Private application subnets
  -> Private data subnets

Private application subnets
  -> NAT gateway for approved outbound internet access

Private data subnets
  -> Local VPC paths only

Spread each tier across at least two Availability Zones when the workload needs better resilience. The specific resource names can change later. The important structure is the same:

  • only the public entry tier accepts internet traffic

  • the application tier stays private

  • the data tier stays even narrower

  • outbound access is intentional, not automatic

Walk the Traffic Path

Start outside the VPC. Public users should reach a managed entry point such as a load balancer in public subnets. Those subnets are public because their route tables support the internet path and because the entry point is meant to be reachable.

Next, traffic moves to private application subnets. Those subnets should not be directly reachable from the internet. Their job is to run application logic, not to be public addresses.

Then traffic moves to the data tier. The database subnets should stay on internal paths only. If the application is public, that does not make the database public by association.

Finally, consider outbound traffic. If the application tier needs internet egress, that path should be explicit through NAT. If some services do not need internet access at all, do not give it to them by default.

Why This Design Ages Better

This layout gives the team room to grow:

  • more application services can join the private application subnets or adjacent ones

  • database components remain clearly separated

  • future inspection or endpoint patterns can be added without rewriting the whole mental model

  • shared services or transit connectivity can appear later if needed

The design is not "future proof" in the magical sense. It is simply future-friendly because the boundaries are clear.

Trade-Offs to Explain

DecisionBenefitTrade-Off
Tiered subnetsClear separation of entry, application, and data paths.More routing and subnet planning than a flat layout.
Multi-AZ placementBetter resilience to one Availability Zone failure.More resources, more coordination, and possibly more cost.
NAT-based egressAllows outbound access without direct inbound reachability.Adds cost and should not be broader than necessary.
Private database tierStronger isolation and simpler security reasoning.Requires clean operational access patterns for maintenance and troubleshooting.

Common Mistakes

  • Drawing a three-tier diagram without walking the reader through actual routes.

  • Making the application tier public because it feels convenient during initial setup.

  • Giving the database tier unnecessary outbound internet paths.

  • Choosing a VPC CIDR that leaves no room for future subnet growth or adjacent environments.

If Someone Asks You

How would you design a practical AWS VPC for a three-tier application?

A good answer is:

I would start with one VPC sized for growth, then place public entry, private application, and private data tiers in separate subnets across multiple Availability Zones. Route tables would make only the entry tier public. The application tier could use controlled NAT egress when needed, and the data tier would stay private. The main goal is to make each traffic path intentional and easy to explain.

What You Should Remember

Good VPC design is a story about intended traffic paths, not a diagram full of unlabeled boxes.

Questions to Check Your Understanding

  1. Which components in this scenario usually need public reachability?

  2. Why is NAT an egress design choice rather than a general connectivity shortcut?

  3. How does early address planning make this design easier to grow later?