Cloud Networking
VPCs, subnets, security groups, load balancers — how to design a secure cloud network architecture.
VPC: Your Private Cloud Network
A VPC (Virtual Private Cloud) is an isolated network within a cloud provider. Resources inside a VPC can communicate with each other but are hidden from the internet by default.
Real-World Analogy
Like a city’s road system — highways (backbone), intersections (routers), toll booths (firewalls), and on-ramps (load balancers). Invisible until something breaks, then everything grinds to a halt.
// VPC design for a typical web application
interface VPCDesign {
cidr: "10.0.0.0/16"; // 65,536 IP addresses
subnets: {
// Public subnets — internet-accessible (load balancers, bastion hosts)
publicA: "10.0.1.0/24"; // 256 IPs in AZ-a
publicB: "10.0.2.0/24"; // 256 IPs in AZ-b
// Private subnets — no direct internet access (app servers)
privateA: "10.0.10.0/24"; // 256 IPs in AZ-a
privateB: "10.0.11.0/24"; // 256 IPs in AZ-b
// Data subnets — most restricted (databases)
dataA: "10.0.20.0/24"; // 256 IPs in AZ-a
dataB: "10.0.21.0/24"; // 256 IPs in AZ-b
};
}
// Traffic flow:
// Internet → Load Balancer (public subnet)
// → App Server (private subnet)
// → Database (data subnet)
// Database cannot reach the internet directly Security Groups (Firewall Rules)
// Security groups act as virtual firewalls
// Default: deny all inbound, allow all outbound
const securityGroups = {
loadBalancer: {
inbound: [
{ port: 443, source: "0.0.0.0/0" }, // HTTPS from anywhere
{ port: 80, source: "0.0.0.0/0" }, // HTTP (redirect to HTTPS)
],
},
appServer: {
inbound: [
{ port: 3000, source: "sg-loadbalancer" }, // only from LB
],
},
database: {
inbound: [
{ port: 5432, source: "sg-appserver" }, // only from app
],
// No internet access at all
},
}; Reference security groups, not IP addresses. Instead of allowing 10.0.10.0/24 to access the database, allow sg-appserver. This way, if you add servers, they automatically get access.
Load Balancers
// Application Load Balancer (Layer 7 — HTTP)
// - Routes by path, hostname, headers
// - TLS termination
// - Health checks
// - WebSocket support
interface ALBConfig {
listeners: [
{
port: 443,
protocol: "HTTPS",
certificate: "arn:aws:acm:...:cert/abc",
rules: [
{ pathPattern: "/api/*", targetGroup: "api-servers" },
{ pathPattern: "/*", targetGroup: "web-servers" },
],
},
];
targetGroups: {
"api-servers": {
port: 3000,
healthCheck: { path: "/health", interval: 30 },
targets: ["i-abc", "i-def", "i-ghi"],
},
};
} NAT Gateway
Private subnets can’t reach the internet (by design), but sometimes they need to — pulling Docker images, calling external APIs. A NAT Gateway in the public subnet handles outbound-only internet access.
// Private subnet route table:
// 10.0.0.0/16 → local (VPC traffic)
// 0.0.0.0/0 → nat-gateway (internet via NAT)
// Public subnet route table:
// 10.0.0.0/16 → local
// 0.0.0.0/0 → internet-gateway (direct internet)
// Key difference:
// NAT: outbound only (server can call APIs, can't be reached from internet)
// IGW: bidirectional (load balancer can receive AND send) Multi-AZ is non-negotiable for production. Place resources in at least 2 availability zones. When an AZ goes down (it happens), your service stays up. This applies to everything: load balancers, app servers, databases.
Key Takeaways
- VPCs isolate your infrastructure — use public/private/data subnet tiers
- Security groups are your firewall — default deny, explicitly allow by security group reference
- Load balancers handle TLS and routing — never expose app servers directly
- Multi-AZ everything — single-AZ is a single point of failure