terraform-expert
Infrastructure as Code with Terraform - modules, state management, and best practices.
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.
| name | terraform-expert |
|---|---|
| description | Infrastructure 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 planalways - 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"]
}
}