terraform-expert

timequity's avatarfrom timequity

Infrastructure as Code with Terraform - modules, state management, and best practices.

⭐0stars🔀0forks📁View on GitHub🕐Updated Dec 18, 2025

When & Why to Use This Skill

The Terraform Expert skill is a comprehensive resource for mastering Infrastructure as Code (IaC). it provides professional guidance on architecting, deploying, and managing scalable cloud environments using Terraform. By focusing on modular design, secure state management, and industry best practices, this skill enables developers and DevOps engineers to automate infrastructure with precision and maintainability.

Use Cases

  • Case 1: Designing and implementing a multi-environment (Dev, Staging, Prod) cloud architecture using a standardized modular structure.
  • Case 2: Configuring secure remote state management with S3 and DynamoDB to enable safe team collaboration and prevent state conflicts.
  • Case 3: Automating the provisioning of complex cloud resources like VPCs, ECS clusters, and RDS instances using reusable HCL modules.
  • Case 4: Refactoring legacy infrastructure code into a clean, maintainable project structure that follows 'Don't Repeat Yourself' (DRY) principles.
  • Case 5: Implementing advanced Terraform patterns such as dynamic resource creation with for_each and efficient data source integration.
nameterraform-expert
descriptionInfrastructure as Code with Terraform - modules, state management, and best practices.

Terraform Expert

Project Structure

terraform/
├── modules/
│   ├── vpc/
│   ├── ecs/
│   └── rds/
├── environments/
│   ├── dev/
│   ├── staging/
│   └── prod/
├── main.tf
├── variables.tf
├── outputs.tf
└── versions.tf

Module Pattern

# modules/vpc/main.tf
resource "aws_vpc" "main" {
  cidr_block           = var.cidr_block
  enable_dns_hostnames = true

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

# modules/vpc/variables.tf
variable "name" {
  type        = string
  description = "Name prefix for resources"
}

variable "cidr_block" {
  type        = string
  default     = "10.0.0.0/16"
}

# modules/vpc/outputs.tf
output "vpc_id" {
  value = aws_vpc.main.id
}

State Management

# backend.tf
terraform {
  backend "s3" {
    bucket         = "terraform-state-bucket"
    key            = "env/prod/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-locks"
    encrypt        = true
  }
}

Best Practices

  • One module per concern - VPC, compute, database separate
  • Lock versions - Provider and module versions
  • Use workspaces - Or separate state files per env
  • Validate before apply - terraform plan always
  • Format code - terraform fmt -recursive

Common Patterns

For Each

variable "subnets" {
  type = map(object({
    cidr = string
    az   = string
  }))
}

resource "aws_subnet" "main" {
  for_each          = var.subnets
  vpc_id            = aws_vpc.main.id
  cidr_block        = each.value.cidr
  availability_zone = each.value.az

  tags = { Name = each.key }
}

Data Sources

data "aws_ami" "amazon_linux" {
  most_recent = true
  owners      = ["amazon"]

  filter {
    name   = "name"
    values = ["amzn2-ami-hvm-*-x86_64-gp2"]
  }
}