terraform-basics

SKILL.md

Terraform Skill

Quick Start

Deploy Pub/Sub topics to GCP in 3 minutes:

# 1. Initialize (downloads providers, sets up backend)
terraform init

# 2. Preview changes
terraform plan

# 3. Apply
terraform apply -auto-approve

Terraform configuration:

# main.tf
terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 5.26.0"
    }
  }

  backend "gcs" {
    prefix = "supplier-charges-hub"
    bucket = "my-terraform-state"  # Must exist
  }
}

provider "google" {
  project = "ecp-wtr-supplier-charges-${var.environment}"
  region  = var.region
}

resource "google_pubsub_topic" "incoming" {
  name = "supplier-charges-incoming-${var.environment}"
}

When to Use

  • Provision cloud infrastructure (GCP resources)
  • Manage infrastructure as code
  • Deploy multi-environment setups
  • Configure IAM bindings
  • Track infrastructure state

Triggers:

  • "Deploy infrastructure to GCP"
  • "Create Pub/Sub topics with Terraform"
  • "Set up remote state"
  • "Configure GCP provider"

Key Concepts

Remote State (Required)

terraform {
  backend "gcs" {
    bucket = "terraform-state-prod"
    prefix = "supplier-charges-hub"
  }
}

Why?

  • Team collaboration (single source of truth)
  • State locking (prevents concurrent modifications)
  • Backup and encryption

Provider Configuration

terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 5.26.0"
    }
  }
}

provider "google" {
  project = "my-project"
  region  = var.region
}

Variables with Validation

# variables.tf
variable "environment" {
  type    = string
  default = "labs"

  validation {
    condition     = contains(["labs", "test", "prod"], var.environment)
    error_message = "Environment must be: labs, test, or prod"
  }
}

Resources

# pubsub.tf
resource "google_pubsub_topic" "incoming" {
  name                       = "supplier-charges-incoming"
  message_retention_duration = "604800s"  # 7 days
}

resource "google_pubsub_subscription" "incoming_sub" {
  name  = "supplier-charges-incoming-sub"
  topic = google_pubsub_topic.incoming.name

  ack_deadline_seconds = 60

  dead_letter_policy {
    dead_letter_topic     = google_pubsub_topic.dlq.id
    max_delivery_attempts = 5
  }
}

IAM Permissions

# iam.tf
resource "google_pubsub_topic_iam_member" "publisher" {
  topic  = google_pubsub_topic.incoming.name
  role   = "roles/pubsub.publisher"
  member = "serviceAccount:${data.google_service_account.app.email}"
}

Outputs

# outputs.tf
output "pubsub_topic_name" {
  description = "Name of the Pub/Sub incoming topic"
  value       = google_pubsub_topic.incoming.name
}

Common Commands

# Initialize
terraform init

# Preview changes
terraform plan

# Apply changes
terraform apply

# View current state
terraform state list

# Destroy infrastructure (WARNING!)
terraform destroy

# Format code
terraform fmt -recursive

# Validate syntax
terraform validate

Multi-Environment Pattern

# terraform.tfvars.labs
environment = "labs"

# terraform.tfvars.prod
environment = "prod"

Apply to different environments:

terraform apply -var-file="terraform.tfvars.labs"
terraform apply -var-file="terraform.tfvars.prod"

Requirements

  • Terraform 1.x+
  • GCP credentials (via gcloud auth application-default login)
  • GCS bucket for remote state (pre-created)
  • IAM permissions in GCP (Owner or Editor)

Installation:

# macOS
brew install terraform

# Verify
terraform version

See Also

  • Core Concepts: Resources, Data Sources, Providers, Backends
  • Best Practices: Naming Conventions, Variable Validation
  • Security: Secrets Management, IAM Bindings
  • State Management: Remote State, Locking
Weekly Installs
4
First Seen
Jan 23, 2026
Installed on
opencode4
gemini-cli4
claude-code4
codex4
mcpjam3
kilo3