All skills
wshobson avatar

/terraform-module-library

@24df162
by Seth Hobsonwshobson/agents40k stars
4,281

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.

Use this Skill: https://skilld.dev/gh/wshobson/agents/terraform-module-library

This session only. Nothing lands on disk.

SKILL.md

β‰ˆ67 tokens always: the name and description. β‰ˆ1.3k when used: this file. β‰ˆ697 more on demand in 2 files.

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

Source: SKILL.md on GitHub

No alerts16d5 checks Β· Risk SAFE
  • Gen Agent Trust Hub16d

    This skill provides safe template examples and patterns for building Terraform modules across AWS, Azure, GCP, and OCI.

  • Socket16d

    No alerts

  • Snyk16d

    Risk: LOW Β· No issues

  • Runlayer6mo

    2 files scanned Β· No issues

  • ZeroLeaks5mo

    Score: 93/100 Β· 2 sections analyzed

Signed by skilld at 24df162. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 3 days ago.

Activeupdated 7 months ago
  • terraform
  • aws
  • azure
  • gcp
  • oci
  • infrastructure-as-code
  • modules
  • cloud-provisioning
  • iac

README badge

README badge for wshobson/agents/terraform-module-library

Provides patterns and templates for building reusable Terraform modules across AWS, Azure, GCP, and OCI with standardized structure, validation, and testing. Use when establishing infrastructure-as-code standards or creating multi-cloud compatible modules that follow Terraform best practices like pinned versions, input validation, and Terratest coverage.

Generated from the current SKILL.md.

Does this skill support multiple cloud providers?
Yes. The skill covers AWS, Azure, GCP, and OCI with standard module patterns for each provider, including examples for VPC, compute, and storage across clouds.
What testing approach does this skill use?
The skill uses Terratest (Go-based) to validate modules, as shown in the vpc_test.go example.
Are example configurations included?
Yes. The skill provides a standard module structure with examples/ directories containing complete, runnable configurations for each module.
Does this skill include validation for module inputs?
Yes. The skill demonstrates input validation using Terraform validation blocks, as shown in the cidr_block variable example.

Generated from the current SKILL.md. These answers refresh after source changes.