Modules — reusable, composable Terraform configurations.
1# modules/vpc/main.tf2resource "aws_vpc" "main" {3 cidr_block = var.cidr_block4 tags = {5 Name = "${var.project}-vpc"6 }7}89resource "aws_subnet" "public" {10 for_each = toset(var.public_subnets)11 vpc_id = aws_vpc.main.id12 cidr_block = each.value13 availability_zone = each.key14 map_public_ip_on_launch = true15}1617# modules/vpc/variables.tf18variable "cidr_block" {19 type = string20 description = "VPC CIDR block"21}2223variable "public_subnets" {24 type = list(string)25 description = "Public subnet CIDRs"26}2728# modules/vpc/outputs.tf29output "vpc_id" {30 value = aws_vpc.main.id31}3233# modules/vpc/versions.tf34version: terraform >= 1.0
1# Root module usage2module "vpc" {3 source = "./modules/vpc"45 cidr_block = "10.0.0.0/16"6 public_subnets = ["10.0.1.0/24", "10.0.2.0/24"]7}89# From registry10module "vpc" {11 source = "terraform-aws-modules/vpc/aws"12 version = "5.0.0"13 # ...14}1516# From Git17module "vpc" {18 source = "git::https://github.com/org/terraform-vpc.git?ref=v1.0"19}
Best Practices: