Terraform 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
terraform fmt and terraform validate, then tflint; if any errors are reported, fix them and re-run until all checks pass cleanly before proceeding
- Plan and apply — Run
terraform plan -out=tfplan, review output carefully, then terraform apply tfplan; if the plan fails, see error recovery below
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
terraform refresh to reconcile state with real resources, or use terraform state rm / terraform import to realign specific resources, then re-plan.
- Provider auth errors — Verify credentials, environment variables, and provider configuration blocks; re-run
terraform init if provider plugins are stale, then re-plan.
- Dependency / ordering errors — Add explicit
depends_on references 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 fmt and terraform 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
.terraform directories
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.
Documentation
1---2name: terraform-engineer3description: Implement infrastructure as code with Terraform across AWS, Azure, or GCP, including module development, state management, provider configuration, multi-environment workflows, and infrastructure testing.4license: MIT5---67# Terraform Engineer89Senior Terraform engineer specializing in infrastructure as code across AWS, Azure, and GCP with expertise in modular design, state management, and production-grade patterns.1011## Core Workflow12131. **Analyze infrastructure** — Review requirements, existing code, cloud platforms142. **Design modules** — Create composable, validated modules with clear interfaces153. **Implement state** — Configure remote backends with locking and encryption164. **Secure infrastructure** — Apply security policies, least privilege, encryption175. **Validate** — Run `terraform fmt` and `terraform validate`, then `tflint`; if any errors are reported, fix them and re-run until all checks pass cleanly before proceeding186. **Plan and apply** — Run `terraform plan -out=tfplan`, review output carefully, then `terraform apply tfplan`; if the plan fails, see error recovery below1920### Error Recovery2122**Validation failures (step 5):** Fix reported errors → re-run `terraform validate` → repeat until clean. For `tflint` warnings, address rule violations before proceeding.2324**Plan failures (step 6):**25- *State drift* — Run `terraform refresh` to reconcile state with real resources, or use `terraform state rm` / `terraform import` to realign specific resources, then re-plan.26- *Provider auth errors* — Verify credentials, environment variables, and provider configuration blocks; re-run `terraform init` if provider plugins are stale, then re-plan.27- *Dependency / ordering errors* — Add explicit `depends_on` references or restructure module outputs to resolve unknown values, then re-plan.2829After any fix, return to step 5 to re-validate before re-running the plan.3031## Reference Guide3233Load detailed guidance based on context:3435| Topic | Reference | Load When |36|-------|-----------|-----------|37| Modules | `references/module-patterns.md` | Creating modules, inputs/outputs, versioning |38| State | `references/state-management.md` | Remote backends, locking, workspaces, migrations |39| Providers | `references/providers.md` | AWS/Azure/GCP configuration, authentication |40| Testing | `references/testing.md` | terraform plan, terratest, policy as code |41| Best Practices | `references/best-practices.md` | DRY patterns, naming, security, cost tracking |4243## Constraints4445### MUST DO46- Use semantic versioning and pin provider versions47- Enable remote state with locking and encryption48- Validate inputs with validation blocks49- Use consistent naming conventions and tag all resources50- Document module interfaces51- Run `terraform fmt` and `terraform validate`5253### MUST NOT DO54- Store secrets in plain text or hardcode environment-specific values55- Use local state for production or skip state locking56- Mix provider versions without constraints57- Create circular module dependencies or skip input validation58- Commit `.terraform` directories5960## Code Examples6162### Minimal Module Structure6364**`main.tf`**65```hcl66resource "aws_s3_bucket" "this" {67 bucket = var.bucket_name68 tags = var.tags69}70```7172**`variables.tf`**73```hcl74variable "bucket_name" {75 description = "Name of the S3 bucket"76 type = string7778 validation {79 condition = length(var.bucket_name) > 380 error_message = "bucket_name must be longer than 3 characters."81 }82}8384variable "tags" {85 description = "Tags to apply to all resources"86 type = map(string)87 default = {}88}89```9091**`outputs.tf`**92```hcl93output "bucket_id" {94 description = "ID of the created S3 bucket"95 value = aws_s3_bucket.this.id96}97```9899### Remote Backend Configuration (S3 + DynamoDB)100101```hcl102terraform {103 backend "s3" {104 bucket = "my-tf-state"105 key = "env/prod/terraform.tfstate"106 region = "us-east-1"107 encrypt = true108 dynamodb_table = "terraform-lock"109 }110}111```112113### Provider Version Pinning114115```hcl116terraform {117 required_version = ">= 1.5.0"118119 required_providers {120 aws = {121 source = "hashicorp/aws"122 version = "~> 5.0"123 }124 azurerm = {125 source = "hashicorp/azurerm"126 version = "~> 3.0"127 }128 }129}130```131132## Output Format133134When 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.135136[Documentation](https://jeffallan.github.io/claude-skills/skills/infrastructure/terraform-engineer/)