PluginBench
Skill
Pass
Audit score 90

terraform-module-library

wshobson/agents

Build reusable Terraform modules for AWS, Azure, GCP, and OCI following infrastructure-as-code best practices.

What is terraform-module-library?

Create standardized, production-ready Terraform modules for multi-cloud infrastructure provisioning. Use this skill when building reusable infrastructure components, establishing organizational IaC standards, or implementing cloud resource patterns across multiple providers.

  • Generate modular Terraform code following standard patterns (main.tf, variables.tf, outputs.tf, versions.tf)
  • Support AWS, Azure, GCP, and OCI cloud providers with provider-specific modules
  • Implement input validation, conditional resources, and consistent tagging strategies
  • Create module composition patterns for complex infrastructure stacks
  • Generate Terratest-compatible test files for module validation
  • Provide documented examples and usage patterns for module consumers

How to install terraform-module-library

npx skills add https://github.com/wshobson/agents --skill terraform-module-library
Claude Code
Cursor
Windsurf
Cline

How to use terraform-module-library

  1. 1.Define module structure with main.tf, variables.tf, outputs.tf, and versions.tf files
  2. 2.Add input variables with descriptions and validation blocks for all configurable parameters
  3. 3.Implement resources using count or for_each for conditional and scalable deployments
  4. 4.Export important resource attributes as outputs for module composition
  5. 5.Create examples/complete/ directory with sample configurations
  6. 6.Write Terratest files in tests/ directory to validate module behavior
  7. 7.Document all variables and outputs in README.md with usage examples
  8. 8.Version modules using semantic versioning and pin provider versions

Use cases

Good for
  • Build a reusable VPC module with subnets, internet gateways, and routing for AWS
  • Create multi-cloud storage modules (S3, Azure Storage, GCS, OCI Object Storage) with consistent interfaces
  • Develop Kubernetes cluster modules (EKS, AKS, GKE, OKE) with standardized networking
  • Establish organizational module library with versioning and documentation standards
  • Compose complex infrastructure by combining multiple modules (VPC + RDS + security groups)
Who it's for
  • Infrastructure engineers building reusable cloud components
  • DevOps teams standardizing Terraform practices across organizations
  • Cloud architects designing multi-cloud infrastructure patterns
  • Platform engineering teams creating internal infrastructure libraries

terraform-module-library FAQ

What cloud providers are supported?

AWS, Azure, GCP, and OCI. Modules can be organized by provider or designed to work across multiple clouds with provider-specific implementations.

How should I structure a module for reusability?

Use the standard pattern: main.tf for resources, variables.tf for inputs with validation, outputs.tf for important attributes, versions.tf for provider pinning, examples/ for usage, and tests/ for Terratest validation.

How do I compose multiple modules together?

Reference modules using the module block with source paths, pass outputs from one module as inputs to another, and use consistent tagging and naming conventions across modules.

What testing approach is recommended?

Use Terratest with Go to validate module behavior. Test modules in examples/complete/ directory, verify outputs are correct, and ensure resources are created as expected.

How do I handle provider configuration across clouds?

Pin provider versions in versions.tf, use provider aliases for multiple regions/accounts, and document required provider setup in module README.

Full instructions (SKILL.md)

Source of truth, from wshobson/agents.


name: terraform-module-library description: Build reusable Terraform modules for AWS, Azure, GCP, and OCI infrastructure following infrastructure-as-code best practices. Use when creating infrastructure modules, standardizing cloud provisioning, or implementing reusable IaC components.

Terraform Module Library

Production-ready Terraform module patterns for AWS, Azure, GCP, and OCI infrastructure.

Purpose

Create reusable, well-tested Terraform modules for common cloud infrastructure patterns across multiple cloud providers.

When to Use

  • Build reusable infrastructure components
  • Standardize cloud resource provisioning
  • Implement infrastructure as code best practices
  • Create multi-cloud compatible modules
  • Establish organizational Terraform standards

Module Structure

terraform-modules/
├── aws/
│   ├── vpc/
│   ├── eks/
│   ├── rds/
│   └── s3/
├── azure/
│   ├── vnet/
│   ├── aks/
│   └── storage/
├── gcp/
│   ├── vpc/
│   ├── gke/
│   └── cloud-sql/
└── oci/
    ├── vcn/
    ├── oke/
    └── object-storage/

Standard Module Pattern

module-name/
├── main.tf          # Main resources
├── variables.tf     # Input variables
├── outputs.tf       # Output values
├── versions.tf      # Provider versions
├── README.md        # Documentation
├── examples/        # Usage examples
│   └── complete/
│       ├── main.tf
│       └── variables.tf
└── tests/           # Terratest files
    └── module_test.go

AWS VPC Module Example

main.tf:

resource "aws_vpc" "main" {
  cidr_block           = var.cidr_block
  enable_dns_hostnames = var.enable_dns_hostnames
  enable_dns_support   = var.enable_dns_support

  tags = merge(
    {
      Name = var.name
    },
    var.tags
  )
}

resource "aws_subnet" "private" {
  count             = length(var.private_subnet_cidrs)
  vpc_id            = aws_vpc.main.id
  cidr_block        = var.private_subnet_cidrs[count.index]
  availability_zone = var.availability_zones[count.index]

  tags = merge(
    {
      Name = "${var.name}-private-${count.index + 1}"
      Tier = "private"
    },
    var.tags
  )
}

resource "aws_internet_gateway" "main" {
  count  = var.create_internet_gateway ? 1 : 0
  vpc_id = aws_vpc.main.id

  tags = merge(
    {
      Name = "${var.name}-igw"
    },
    var.tags
  )
}

variables.tf:

variable "name" {
  description = "Name of the VPC"
  type        = string
}

variable "cidr_block" {
  description = "CIDR block for VPC"
  type        = string
  validation {
    condition     = can(regex("^([0-9]{1,3}\\.){3}[0-9]{1,3}/[0-9]{1,2}$", var.cidr_block))
    error_message = "CIDR block must be valid IPv4 CIDR notation."
  }
}

variable "availability_zones" {
  description = "List of availability zones"
  type        = list(string)
}

variable "private_subnet_cidrs" {
  description = "CIDR blocks for private subnets"
  type        = list(string)
  default     = []
}

variable "enable_dns_hostnames" {
  description = "Enable DNS hostnames in VPC"
  type        = bool
  default     = true
}

variable "tags" {
  description = "Additional tags"
  type        = map(string)
  default     = {}
}

outputs.tf:

output "vpc_id" {
  description = "ID of the VPC"
  value       = aws_vpc.main.id
}

output "private_subnet_ids" {
  description = "IDs of private subnets"
  value       = aws_subnet.private[*].id
}

output "vpc_cidr_block" {
  description = "CIDR block of VPC"
  value       = aws_vpc.main.cidr_block
}

Best Practices

  1. Use semantic versioning for modules
  2. Document all variables with descriptions
  3. Provide examples in examples/ directory
  4. Use validation blocks for input validation
  5. Output important attributes for module composition
  6. Pin provider versions in versions.tf
  7. Use locals for computed values
  8. Implement conditional resources with count/for_each
  9. Test modules with Terratest
  10. Tag all resources consistently

Reference: See references/aws-modules.md and references/oci-modules.md

Module Composition

module "vpc" {
  source = "../../modules/aws/vpc"

  name               = "production"
  cidr_block         = "10.0.0.0/16"
  availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"]

  private_subnet_cidrs = [
    "10.0.1.0/24",
    "10.0.2.0/24",
    "10.0.3.0/24"
  ]

  tags = {
    Environment = "production"
    ManagedBy   = "terraform"
  }
}

module "rds" {
  source = "../../modules/aws/rds"

  identifier     = "production-db"
  engine         = "postgres"
  engine_version = "15.3"
  instance_class = "db.t3.large"

  vpc_id     = module.vpc.vpc_id
  subnet_ids = module.vpc.private_subnet_ids

  tags = {
    Environment = "production"
  }
}

Testing

// tests/vpc_test.go
package test

import (
    "testing"
    "github.com/gruntwork-io/terratest/modules/terraform"
    "github.com/stretchr/testify/assert"
)

func TestVPCModule(t *testing.T) {
    terraformOptions := &terraform.Options{
        TerraformDir: "../examples/complete",
    }

    defer terraform.Destroy(t, terraformOptions)
    terraform.InitAndApply(t, terraformOptions)

    vpcID := terraform.Output(t, terraformOptions, "vpc_id")
    assert.NotEmpty(t, vpcID)
}

Related Skills

  • multi-cloud-architecture - For architectural decisions
  • cost-optimization - For cost-effective designs