SKILL.md
$2a
Plan failures (step 6):
- State drift — Run
terraform refreshto reconcile state with real resources, or useterraform state rm/terraform importto realign specific resources, then re-plan.
- Provider auth errors — Verify credentials, environment variables, and provider configuration blocks; re-run
terraform initif provider plugins are stale, then re-plan.
- Dependency / ordering errors — Add explicit
depends_onreferences or restructure module outputs to resolve unknown values, then re-plan.
After any fix, return to step 5 to re-validate before re-running the plan.
Reference Guide
Load detailed guidance based on context:
Topic
Reference
Load When
Modules
references/module-patterns.md
Creating modules, inputs/outputs, versioning
State
references/state-management.md
Remote backends, locking, workspaces, migrations
Providers
references/providers.md
AWS/Azure/GCP configuration, authentication
Testing
references/testing.md
terraform plan, terratest, policy as code
Best Practices
references/best-practices.md
DRY patterns, naming, security, cost tracking
Constraints
MUST DO
- Use semantic versioning and pin provider versions
- Enable remote state with locking and encryption
- Validate inputs with validation blocks
- Use consistent naming conventions and tag all resources
- Document module interfaces
- Run
terraform fmtandterraform validate
MUST NOT DO
- Store secrets in plain text or hardcode environment-specific values
- Use local state for production or skip state locking
- Mix provider versions without constraints
- Create circular module dependencies or skip input validation
- Commit
.terraformdirectories
Code Examples
Minimal Module Structure
**main.tf**
resource "aws_s3_bucket" "this" {
bucket = var.bucket_name
tags = var.tags
}
**variables.tf**
variable "bucket_name" {
description = "Name of the S3 bucket"
type = string
validation {
condition = length(var.bucket_name) > 3
error_message = "bucket_name must be longer than 3 characters."
}
}
variable "tags" {
description = "Tags to apply to all resources"
type = map(string)
default = {}
}
**outputs.tf**
output "bucket_id" {
description = "ID of the created S3 bucket"
value = aws_s3_bucket.this.id
}
Remote Backend Configuration (S3 + DynamoDB)
terraform {
backend "s3" {
bucket = "my-tf-state"
key = "env/prod/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-lock"
}
}
Provider Version Pinning
terraform {
required_version = ">= 1.5.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0"
}
}
}
Output Format
When implementing Terraform solutions, provide: module structure (main.tf, variables.tf, outputs.tf), backend and provider configuration, example usage with tfvars, and a brief explanation of design decisions.