From terraform
Guides creating reusable Terraform modules with structure, variables, outputs; using via local/registry/Git sources, composition, and for_each for infrastructure organization.
How this skill is triggered — by the user, by Claude, or both
Slash command
/terraform:terraform-modulesThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Creating and using reusable Terraform modules.
Creating and using reusable Terraform modules.
modules/vpc/
├── main.tf
├── variables.tf
├── outputs.tf
└── README.md
resource "aws_vpc" "main" {
cidr_block = var.cidr_block
enable_dns_hostnames = var.enable_dns_hostnames
tags = merge(var.tags, {
Name = var.name
})
}
resource "aws_subnet" "public" {
count = length(var.public_subnets)
vpc_id = aws_vpc.main.id
cidr_block = var.public_subnets[count.index]
availability_zone = var.availability_zones[count.index]
tags = merge(var.tags, {
Name = "${var.name}-public-${count.index + 1}"
})
}
variable "name" {
description = "VPC name"
type = string
}
variable "cidr_block" {
description = "VPC CIDR block"
type = string
}
variable "public_subnets" {
description = "Public subnet CIDR blocks"
type = list(string)
default = []
}
variable "tags" {
description = "Resource tags"
type = map(string)
default = {}
}
output "vpc_id" {
description = "VPC ID"
value = aws_vpc.main.id
}
output "public_subnet_ids" {
description = "Public subnet IDs"
value = aws_subnet.public[*].id
}
module "vpc" {
source = "./modules/vpc"
name = "production-vpc"
cidr_block = "10.0.0.0/16"
public_subnets = [
"10.0.1.0/24",
"10.0.2.0/24",
]
tags = {
Environment = "production"
}
}
# Access module outputs
resource "aws_instance" "web" {
subnet_id = module.vpc.public_subnet_ids[0]
}
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "5.0.0"
name = "my-vpc"
cidr = "10.0.0.0/16"
azs = ["us-east-1a", "us-east-1b"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24"]
enable_nat_gateway = true
enable_vpn_gateway = false
}
module "vpc" {
source = "git::https://github.com/org/terraform-modules.git//vpc?ref=v1.0.0"
name = "my-vpc"
# ...
}
module "network" {
source = "./modules/network"
name = var.name
}
module "compute" {
source = "./modules/compute"
vpc_id = module.network.vpc_id
subnet_id = module.network.subnet_ids[0]
}
module "database" {
source = "./modules/database"
vpc_id = module.network.vpc_id
subnet_ids = module.network.private_subnet_ids
}
variable "applications" {
type = map(object({
instance_type = string
ami_id = string
}))
}
module "application" {
for_each = var.applications
source = "./modules/application"
name = each.key
instance_type = each.value.instance_type
ami_id = each.value.ami_id
}
module "worker" {
count = var.worker_count
source = "./modules/worker"
name = "worker-${count.index + 1}"
index = count.index
}
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.0" # Allow patch updates
}
variable "environment" {
type = string
validation {
condition = contains(["dev", "staging", "prod"], var.environment)
error_message = "Environment must be dev, staging, or prod."
}
}
output "vpc_id" {
value = aws_vpc.main.id
}
output "vpc_cidr" {
value = aws_vpc.main.cidr_block
}
output "subnet_ids" {
value = aws_subnet.main[*].id
}
variable "name_prefix" {
type = string
}
locals {
name = "${var.name_prefix}-${var.environment}"
}
terraform-<PROVIDER>-<NAME>
terraform-aws-vpc
terraform-google-network
v1.0.0 - Major release
v1.1.0 - Minor release
v1.1.1 - Patch release
npx claudepluginhub thebushidocollective/han --plugin terraformCreates or extends reusable Terraform modules with standard structure including variables.tf, outputs.tf, resource-per-file, versions.tf, and README docs. Use for new infrastructure modules or refactoring inline resources.
Guides creation of reusable Terraform modules for AWS, Azure, and GCP with standard patterns, VPC examples, and testing structure.
Builds reusable Terraform modules for AWS, GCP, Azure resources with variables, outputs, validations, security best practices, examples, and auto-generated README docs.