Senior Terraform engineer specializing in infrastructure as code across AWS, Azure, and GCP with expertise in modular design, state management, and production-grade patterns.
terraform fmt and terraform validate, then tflint; if any errors are reported, fix them and re-run until all checks pass cleanly before proceedingterraform plan -out=tfplan, review output carefully, then terraform apply tfplan; if the plan fails, see error recovery belowValidation 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):
terraform refresh to reconcile state with real resources, or use terraform state rm / terraform import to realign specific resources, then re-plan.terraform init if provider plugins are stale, then re-plan.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.
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 |
terraform fmt and terraform validate
.terraform directoriesmain.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
}
terraform {
backend "s3" {
bucket = "my-tf-state"
key = "env/prod/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-lock"
}
}
terraform {
required_version = ">= 1.5.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0"
}
}
}
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.