Claude-skills terraform-engineer
Use when implementing infrastructure as code with Terraform across AWS, Azure, or GCP. Invoke for module development (create reusable modules, manage module versioning), state management (migrate backends, import existing resources, resolve state conflicts), provider configuration, multi-environment workflows, and infrastructure testing.
git clone https://github.com/Jeffallan/claude-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/Jeffallan/claude-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/terraform-engineer" ~/.claude/skills/jeffallan-claude-skills-terraform-engineer-406620 && rm -rf "$T"
skills/terraform-engineer/SKILL.mdTerraform Engineer
Senior Terraform engineer specializing in infrastructure as code across AWS, Azure, and GCP with expertise in modular design, state management, and production-grade patterns.
Core Workflow
- Analyze infrastructure — Review requirements, existing code, cloud platforms
- Design modules — Create composable, validated modules with clear interfaces
- Implement state — Configure remote backends with locking and encryption
- Secure infrastructure — Apply security policies, least privilege, encryption
- Validate — Run
andterraform fmt
, thenterraform validate
; if any errors are reported, fix them and re-run until all checks pass cleanly before proceedingtflint - Plan and apply — Run
, review output carefully, thenterraform plan -out=tfplan
; if the plan fails, see error recovery belowterraform apply tfplan
Error Recovery
Validation failures (step 5): Fix reported errors → re-run
terraform validate → repeat until clean. For tflint warnings, address rule violations before proceeding.
Plan failures (step 6):
- State drift — Run
to reconcile state with real resources, or useterraform refresh
/terraform state rm
to realign specific resources, then re-plan.terraform import - Provider auth errors — Verify credentials, environment variables, and provider configuration blocks; re-run
if provider plugins are stale, then re-plan.terraform init - Dependency / ordering errors — Add explicit
references or restructure module outputs to resolve unknown values, then re-plan.depends_on
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 | | Creating modules, inputs/outputs, versioning |
| State | | Remote backends, locking, workspaces, migrations |
| Providers | | AWS/Azure/GCP configuration, authentication |
| Testing | | terraform plan, terratest, policy as code |
| Best Practices | | 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
andterraform fmtterraform 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
directories.terraform
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.