Skip to main content

VPC Module

Deploy an AWS Virtual Private Cloud with multi-tier subnet configuration, NAT gateways, and optional IPv6 support.

What You'll Build

A production-ready VPC with:

  • Configurable public, private, and isolated subnets across multiple AZs
  • NAT gateway options (single, per-AZ, or custom)
  • DNS resolution and DNS hostname support
  • Optional secondary CIDR blocks and IPv6
  • VPC endpoints for S3 and DynamoDB
  • Flow logs with CloudWatch integration

How to Use

module "vpc" {
source = "github.com/nnthanh101/terraform-aws/modules/vpc"

name = "main"
cidr = "10.0.0.0/16"

# Subnets across 3 AZs
azs = ["us-east-1a", "us-east-1b", "us-east-1c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]

# NAT configuration (one per AZ)
enable_nat_gateway = true
one_nat_gateway_per_az = true

# DNS + flow logs
enable_dns_hostnames = true
enable_dns_support = true
enable_flow_log = true
flow_log_retention_in_days = 7

tags = {
Environment = "prod"
}
}

Key Variables

VariableTypeDefaultPurpose
namestring""Resource identifier; used in all resource names
cidrstring"0.0.0.0/0"VPC CIDR block; must be valid AWS range
azslist(string)[]Availability zones for subnets
private_subnetslist(string)[]Private subnet CIDR blocks
public_subnetslist(string)[]Public subnet CIDR blocks
enable_nat_gatewayboolfalseCreate NAT gateways
one_nat_gateway_per_azboolfalseOne NAT per AZ; if false, uses single NAT or custom count
enable_ipv6boolfalseRequest Amazon-provided IPv6 /56 block
enable_dns_hostnamesbooltrueEnable DNS hostname resolution
enable_dns_supportbooltrueEnable DNS support
enable_flow_logboolfalseEnable VPC flow logs to CloudWatch
flow_log_retention_in_daysnumber7CloudWatch log retention

Outputs

OutputTypeUse Case
vpc_idstringVPC identifier for cross-stack references
private_subnetslist(string)Private subnet IDs (EC2, ECS, RDS placement)
public_subnetslist(string)Public subnet IDs (ALB, NAT gateway placement)
nat_gateway_ipslist(string)NAT gateway Elastic IPs for egress allowlisting
vpc_cidr_blockstringVPC CIDR for security group ingress rules

Architecture

  • Public subnets: NAT gateways, application load balancers, bastion hosts
  • Private subnets: EC2, ECS tasks, RDS databases
  • Isolated subnets: Databases, caches with no internet egress
  • VPC endpoints: S3 and DynamoDB without internet gateway traversal

Source Reference

  • Module: terraform-aws/modules/vpc
  • Terraform docs: Run terraform-docs in the module directory for full variable reference
  • AWS VPC concepts: https://docs.aws.amazon.com/vpc/