RouteTable
Create and manage AWS Route Tables to control network traffic routing within VPCs.
An AWS Route Table contains rules (routes) that determine where network traffic is directed. Each subnet must be associated with a route table, which controls the routing for that subnet.
Minimal Example
Section titled “Minimal Example”Create a basic route table:
import { Vpc, RouteTable } from "alchemy/aws/ec2";
const vpc = await Vpc("main-vpc", { cidrBlock: "10.0.0.0/16"});
const routeTable = await RouteTable("main-route-table", { vpc: vpc});
Public Route Table
Section titled “Public Route Table”Create a route table for public subnets with descriptive tags:
import { Vpc, RouteTable } from "alchemy/aws/ec2";
const vpc = await Vpc("web-vpc", { cidrBlock: "10.0.0.0/16"});
const publicRouteTable = await RouteTable("public-route-table", { vpc, tags: { Name: "public-route-table", Environment: "production", Type: "public", Purpose: "internet-access" }});
Private Route Table
Section titled “Private Route Table”Create a route table for private subnets:
import { Vpc, RouteTable } from "alchemy/aws/ec2";
const vpc = await Vpc("app-vpc", { cidrBlock: "10.0.0.0/16"});
const privateRouteTable = await RouteTable("private-route-table", { vpc, tags: { Name: "private-route-table", Environment: "production", Type: "private", Purpose: "internal-only" }});
Multi-AZ Route Tables
Section titled “Multi-AZ Route Tables”Create separate route tables for different availability zones:
import { Vpc, RouteTable } from "alchemy/aws/ec2";
const vpc = await Vpc("multi-az-vpc", { cidrBlock: "10.0.0.0/16"});
// Public route table (shared across AZs)const publicRouteTable = await RouteTable("public-rt", { vpc, tags: { Name: "public-route-table", Type: "public", Scope: "multi-az" }});
// Private route tables (one per AZ for NAT Gateway failover)const privateRouteTable1a = await RouteTable("private-rt-1a", { vpc, tags: { Name: "private-route-table-1a", Type: "private", AvailabilityZone: "us-east-1a" }});
const privateRouteTable1b = await RouteTable("private-rt-1b", { vpc, tags: { Name: "private-route-table-1b", Type: "private", AvailabilityZone: "us-east-1b" }});
const privateRouteTable1c = await RouteTable("private-rt-1c", { vpc, tags: { Name: "private-route-table-1c", Type: "private", AvailabilityZone: "us-east-1c" }});
Database Route Table
Section titled “Database Route Table”Create an isolated route table for database subnets:
import { Vpc, RouteTable } from "alchemy/aws/ec2";
const vpc = await Vpc("database-vpc", { cidrBlock: "10.0.0.0/16"});
const databaseRouteTable = await RouteTable("database-route-table", { vpc, tags: { Name: "database-route-table", Type: "isolated", Tier: "database", Purpose: "no-internet-access" }});
Complete Three-Tier Setup
Section titled “Complete Three-Tier Setup”Route tables for a three-tier architecture:
import { Vpc, RouteTable, InternetGateway, InternetGatewayAttachment, NatGateway, Subnet, Route, RouteTableAssociation} from "alchemy/aws/ec2";
const vpc = await Vpc("three-tier-vpc", { cidrBlock: "10.0.0.0/16", enableDnsHostnames: true, enableDnsSupport: true, tags: { Name: "three-tier-vpc" }});
// Internet Gateway for public accessconst igw = await InternetGateway("main-igw", { tags: { Name: "main-internet-gateway" }});
const igwAttachment = await InternetGatewayAttachment("main-igw-attachment", { internetGateway: igw, vpc: vpc});
// Public subnet and NAT Gatewayconst publicSubnet = await Subnet("public-subnet", { vpc, cidrBlock: "10.0.1.0/24", availabilityZone: "us-east-1a", mapPublicIpOnLaunch: true});
const natGateway = await NatGateway("main-nat", { subnet: publicSubnet});
// Web tier route table (public)const webRouteTable = await RouteTable("web-route-table", { vpc, tags: { Name: "web-tier-route-table", Tier: "web", Type: "public" }});
// Application tier route table (private with NAT)const appRouteTable = await RouteTable("app-route-table", { vpc, tags: { Name: "app-tier-route-table", Tier: "application", Type: "private" }});
// Database tier route table (isolated)const dbRouteTable = await RouteTable("db-route-table", { vpc, tags: { Name: "database-tier-route-table", Tier: "database", Type: "isolated" }});
// Routesconst webInternetRoute = await Route("web-internet-route", { routeTable: webRouteTable, destinationCidrBlock: "0.0.0.0/0", target: { internetGateway: igw }});
const appNatRoute = await Route("app-nat-route", { routeTable: appRouteTable, destinationCidrBlock: "0.0.0.0/0", target: { natGateway: natGateway }});
// Database tier has no internet route - only local VPC traffic
Microservices Route Tables
Section titled “Microservices Route Tables”Route tables for microservices architecture:
import { Vpc, RouteTable } from "alchemy/aws/ec2";
const vpc = await Vpc("microservices-vpc", { cidrBlock: "10.0.0.0/16"});
// API Gateway route table (public)const apiGatewayRouteTable = await RouteTable("api-gateway-rt", { vpc, tags: { Name: "api-gateway-route-table", Service: "api-gateway", Type: "public" }});
// Microservices route table (private)const microservicesRouteTable = await RouteTable("microservices-rt", { vpc, tags: { Name: "microservices-route-table", Service: "microservices", Type: "private" }});
// Shared services route table (private)const sharedServicesRouteTable = await RouteTable("shared-services-rt", { vpc, tags: { Name: "shared-services-route-table", Service: "shared-services", Type: "private", Purpose: "databases-cache-monitoring" }});
Reference by VPC ID
Section titled “Reference by VPC ID”Create a route table using VPC ID:
import { RouteTable } from "alchemy/aws/ec2";
const routeTable = await RouteTable("existing-vpc-rt", { vpc: "vpc-1234567890abcdef0", tags: { Name: "external-vpc-route-table" }});
Custom Timeout
Section titled “Custom Timeout”Configure timeout settings for slower environments:
import { Vpc, RouteTable } from "alchemy/aws/ec2";
const vpc = await Vpc("slow-vpc", { cidrBlock: "10.0.0.0/16"});
const routeTable = await RouteTable("slow-route-table", { vpc, timeout: { maxAttempts: 60, // Increase attempts delayMs: 2000 // 2 second delay }, tags: { Name: "slow-environment-route-table" }});
Environment-Based Route Tables
Section titled “Environment-Based Route Tables”Different route tables for different environments:
import { Vpc, RouteTable } from "alchemy/aws/ec2";
const vpc = await Vpc("multi-env-vpc", { cidrBlock: "10.0.0.0/16"});
// Development route table (more permissive)const devRouteTable = await RouteTable("dev-route-table", { vpc, tags: { Name: "development-route-table", Environment: "development", AccessLevel: "permissive" }});
// Staging route tableconst stagingRouteTable = await RouteTable("staging-route-table", { vpc, tags: { Name: "staging-route-table", Environment: "staging", AccessLevel: "controlled" }});
// Production route table (most restrictive)const prodRouteTable = await RouteTable("prod-route-table", { vpc, tags: { Name: "production-route-table", Environment: "production", AccessLevel: "restrictive" }});
VPN Route Table
Section titled “VPN Route Table”Route table for VPN connectivity:
import { Vpc, RouteTable } from "alchemy/aws/ec2";
const vpc = await Vpc("vpn-vpc", { cidrBlock: "10.0.0.0/16"});
const vpnRouteTable = await RouteTable("vpn-route-table", { vpc, tags: { Name: "vpn-route-table", Type: "vpn", Purpose: "site-to-site-connectivity", OnPremisesCidr: "192.168.0.0/16" }});
Transit Gateway Route Table
Section titled “Transit Gateway Route Table”Route table for Transit Gateway connectivity:
import { Vpc, RouteTable } from "alchemy/aws/ec2";
const vpc = await Vpc("tgw-vpc", { cidrBlock: "10.0.0.0/16"});
const tgwRouteTable = await RouteTable("tgw-route-table", { vpc, tags: { Name: "transit-gateway-route-table", Type: "transit-gateway", Purpose: "cross-vpc-connectivity", AttachedTGW: "tgw-1234567890abcdef0" }});
Reference
Section titled “Reference”Access route table properties after creation:
const routeTable = await RouteTable("my-route-table", { vpc, tags: { Name: "my-route-table" }});
console.log(`Route Table ID: ${routeTable.routeTableId}`);console.log(`VPC ID: ${routeTable.vpcId}`);console.log(`Tags:`, routeTable.tags);