terraform-skill

Use when writing, reviewing, or debugging Terraform/OpenTofu modules, tests, CI, scans, or state ops - diagnoses failure mode (identity churn, secrets, blast radius, CI drift, state corruption) with version-aware guards.

By antonbabenko · 5,971 installs

npx skills add antonbabenko/terraform-skill --skill terraform-skill

Source repository · Upstream listing

Terraform Skill for Claude Diagnose first guidance for Terraform and OpenTofu. Core file is a workflow; depth lives in references loaded on demand. Response Contract Every Terraform/OpenTofu response must include: 1. Assumptions & version floor — runtime ( terraform or tofu ), exact version, providers, state backend, execution path (local/CI/Cloud/Atlantis), environment criticality. State assumptions explicitly if the user did not provide them. 2. Risk category addressed — one or more of: identity churn, secret exposure, blast radius, CI drift, compliance gaps, state corruption, provider upgrade risk, testing blind spots. 3. Chosen remediation & tradeoffs — what was chosen, what was traded off, why. 4. Validation plan — exact commands ( fmt check , validate , plan out , policy check) tailored to runtime and risk tier. 5. Rollback notes — for any destructive or state mutating change: how to undo, what evidence to keep. Never recommend direct production apply without a reviewed plan artifact and approval. Never run terraform destroy (targeted or full) without first running terraform plan destroy and showing the user every resource that will be deleted — including implicit dependents pulled in via locals or for each . Get explicit confirmation before proceeding. Never use auto approve on destroy. Workflow 1. Capture execution context — runtime+version, provider(s), backend, execution path, environment criticality. 2. Diagnose failure mode(s) using the routing table below. If intent spans categories, load both references. 3. Load only the matching reference file(s) — do not preload depth the task does not need. 4. Propose fix with risk controls — why this addresses the mode, what could still go wrong, guardrails (tests/approvals/rollback). 5. Generate artifacts — HCL, migration blocks ( moved , import ), CI changes, policy rules. 6. Validate before finalizing — run validation commands tailored to risk tier. 7. Emit the Response Contract at the end. Diagnose Before You Generate Failure category Symptoms Primary references Identity churn Resource addresses shift after refactor, count index churn, missing moved blocks [Code Patterns: count vs for each](references/code patterns.md count vs for each deep dive), [Code Patterns: moved blocks](references/code patterns.md moved blocks terraform 11), [Code Patterns: LLM mistakes](references/code patterns.md llm mistake checklist code patterns) Secret exposure Secrets in defaults, state, logs, CI artifacts [Security & Compliance](references/security compliance.md), [Code Patterns: write only](references/code patterns.md write only arguments terraform 111), [State Management](references/state management.md) Blast radius Oversized stacks, shared prod/non prod state, unsafe applies [State Management](references/state management.md), [Module Patterns](references/module patterns.md) Destroy cascade Targeted destroy deletes more than expected; locals referencing a targeted resource make all for each consumers implicit dependents Response Contract: plan destroy first; [State Management: Safe Destroy](references/state management.md safe destroy protocol) CI drift Local plan ≠ CI plan, apply without reviewed artifact, unpinned versions [CI/CD Workflows](references/ci cd workflows.md), [Code Patterns: versions](references/code patterns.md version management) Compliance gaps Missing policy stage, no approval model, no evidence retention [Security & Compliance](references/security compliance.md), [CI/CD Workflows](references/ci cd workflows.md) Testing blind spots Plan only validation of computed values, set type indexing, mock/real confusion [Testing Frameworks](references/testing frameworks.md) State corruption / recovery Stuck lock, backend migration, drift reconciliation [State Management](references/state management.md) Provider upgrade risk Breaking change provider bump, unpinned modules [Code Patterns: versions](references/code patterns.md version management), [Module Patterns](references/module patterns.md) Provider lifecycle Removing a provider with resources still in state, orphaned resources, removed block usage [State Management: Provider Removal](references/state management.md provider removal) Bootstrap / orchestration misuse null resource + local exec for bootstrap, remote exec for setup scripts, provisioner stdout leaking secrets in CI logs [Code Patterns: Provisioners as Last Resort](references/code patterns.md provisioners as last resort) Navigation / safe rename blind spots Cannot locate symbol defs/refs semantically, value symbol rename done as blind text replace, grep only refactor missing refs, hallucinated rg shim [Code Intelligence](references/code intelligence lsp.md terraform ls capability matrix) Cross cloud / provider mapping "What's the Azure/GCP equivalent of X", picking a backend/auth model per cloud [State Management: Cross cloud equivalents](references/state management.md cross cloud equivalents) When to Use This Skill Activate when: creating or reviewing Terraform/OpenTofu configurations or modules, setting up or debugging tests, structuring multi environment deployments, implementing IaC CI/CD, choosing module patterns or state organization, configuring or migrating remote state backends. Don't use for: basic HCL syntax questions Claude already knows, provider API reference (link to docs), cloud platform questions unrelated to Terraform/OpenTofu. Core Principles Module Hierarchy Type When to Use Scope Resource module Single logical group of connected resources VPC + subnets, SG + rules Infrastructure module Collection of resource modules for a purpose Multiple resource modules in one region/account Composition Complete infrastructure Spans multiple regions/accounts Flow: resource → resource module → infrastructure module → composition. Directory Layout Separate environments from modules . Use examples/ as both documentation and test fixtures. Keep modules small and single responsibility. See [Module Patterns](references/module patterns.md) for architecture principles, naming conventions, variable/output contracts. Naming Conventions (summary) Descriptive resource names ( aws instance.web server , not aws instance.main ) Reserve this for genuine singleton resources only Prefix variables with context ( vpc cidr block , not cidr ) Standard files: main.tf , variables.tf , outputs.tf , versions.tf See [Module Patterns: Variable Naming](references/module patterns.md) and [Code Patterns: Block Ordering](references/code patterns.md block ordering structure) for examples. Block Ordering (summary) Resource blocks: count / for each first → arguments → tags → depends on → lifecycle . Variable blocks: description → type → default → validation → nullable → sensitive . See [Code Patterns: Block Ordering & Structure](references/code patterns.md block ordering structure) for the full rules and examples. Testing Strategy Decision Matrix: Which Testing Approach? Situation Approach Tools Cost Quick syntax check Static analysis validate , fmt Free Pre commit validation Static + lint validate , tflint , trivy , checkov Free Terraform 1.6+, simple logic Native test framework terraform test Free Low Pre 1.6, or Go expertise Integration testing Terratest Low Med Security/compliance focus Policy as code OPA, Sentinel Free Cost sensitive workflow Mock providers (1.7+) Native tests + mocks Free Multi cloud, complex Full integration Terratest + real infra Med High Native Test Rules (1.6+) Before writing test code: validate resource schemas via Terraform MCP so assertions target real attributes. command = plan — fast, for input derived values only command = apply — required for computed values (ARNs, generated names) and set type nested blocks Set type blocks cannot be indexed with [0] — use for expressions or materialize via command = apply Common set types: S3 encryption rules, lifecycle transitions, IAM policy statements See [Testing Frameworks](references/testing frameworks.md) for static analysis pipelines, native test patterns, Terratest integration, mock providers, and the full LLM mistake checklist. Count vs For Each — Quick Rule Scenario Use Why Boolean condition (create / don't) count = condition ? 1 : 0 Optional singleton toggle Items may be reordered or removed for each = toset(list) Stable resource addresses Reference by key for each = map Named access Multiple named resources for each Better identity stability Never use list index as long lived identity — removing a middle element reshuffles every address after it. For the decision matrix, safe migration playbook, moved block patterns, and known at plan failure cases, see [Code Patterns: count vs for each](references/code patterns.md count vs for each deep dive). Locals for Dependency Management Using try() in a local to prefer a conditional resource's attribute over its parent is a specialized but high value pattern — it forces correct deletion order without explicit depends on . Common use: VPC + secondary CIDR associations + subnets. See [Code Patterns: Locals for Dependency Management](references/code patterns.md locals for dependency management) for the full pattern and worked example. Module Development Standard layout: Variable contracts : always description , always explicit type , use validation for complex constraints, use sensitive = true for secrets, prefer optional() with typed defaults (1.3+) over untyped map(any) . Output contracts : always description , mark sensitive outputs, expose stable subsets (not whole provider objects). See [Module Patterns](references/module patterns.md) for the full contract patterns, module release checklist, and LLM mistake checklist. CI/CD Pipeline stages: validate → test → plan → apply (with environment protection). Cost control: mock providers on PR validation, real cloud integration only on main or scheduled, tag test resources, auto cleanup. Drift prevention: pin runtime and providers, commit .terraform.lock.hcl , apply the reviewed plan artifact from the plan stage (do not re run plan inside the apply job), run policy/security stage on every path to apply. See [CI/CD Workflows](references/ci cd workflows.md) for GitHub Actions, GitLab CI, and Atlantis templates plus the LLM mistake checklist. Security & Compliance Essential checks: Don't: store secrets in variables or .tfvars , use default VPC, skip encryption, open security groups to 0.0.0.0/0 , use inline ingress / egress blocks in aws security group . Do: source secrets from a cloud secret manager (AWS Secrets Manager / Azure Key Vault / GCP Secret Manager) or use write only arguments on 1.11+, create dedicated VPCs, enforce encryption at rest and TLS, least privilege SGs, use separate aws vpc security group {ingress,egress} rule resources (e.g. AWS provider v5+). Marking a variable sensitive = true masks display only — the value still lives in state. Use write only / wo on 1.11+, or keep secret material out of Terraform entirely via runtime lookups. See [Security & Compliance](references/security compliance.md) for trivy/checkov pipelines, state file hardening, compliance mappings, and the LLM mistake checklist. State Management Never use local state in teams or production. Remote backends provide automatic locking, encryption, versioning, audit logging, and safe collaboration. Choosing a Remote Backend AWS example (Azure azurerm / GCP gcs / TF Cloud syntax: see [State Manag