When to use this skill
Use this skill whenever the user wants to:
- Write or debug Terraform configuration files (
.tf) - Manage cloud infrastructure (AWS, Azure, GCP, etc.)
- Configure providers, resources, data sources, and outputs
- Manage Terraform state, modules, and workspaces
How to use this skill
Workflow
- Write configuration — define providers, resources, variables, and outputs in HCL
- Initialize — run
terraform initto download providers and modules - Plan — run
terraform planto preview changes - Apply — run
terraform applyto provision infrastructure - Validate — confirm resources with
terraform state listand cloud console
Quick Start Example
# main.tf
terraform {
required_version = ">= 1.5"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
backend "s3" {
bucket = "myapp-terraform-state"
key = "prod/terraform.tfstate"
region = "us-east-1"
dynamodb_table = "terraform-locks"
}
}
provider "aws" {
region = var.aws_region
}
variable "aws_region" {
description = "AWS region for resources"
type = string
default = "us-east-1"
}
resource "aws_s3_bucket" "app_assets" {
bucket = "myapp-${var.environment}-assets"
tags = {
Environment = var.environment
ManagedBy = "terraform"
}
}
output "bucket_arn" {
value = aws_s3_bucket.app_assets.arn
}
# Standard workflow
terraform init
terraform fmt # Format code
terraform validate # Check syntax
terraform plan # Preview changes
terraform apply # Apply changes
# State inspection
terraform state list
terraform state show aws_s3_bucket.app_assets
Module Usage Example
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.0"
name = "myapp-vpc"
cidr = "10.0.0.0/16"
azs = ["us-east-1a", "us-east-1b"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24"]
}
Best Practices
- Use remote state (S3 + DynamoDB, Azure Blob, etc.) to avoid state file conflicts
- Store sensitive values in variables or environment variables — never hardcode in
.tffiles - Run
terraform fmtandterraform validatebefore every commit - Use workspaces or directory-based environments for isolation (dev/staging/prod)
- Version-pin providers and modules to avoid unexpected breaking changes
Troubleshooting
- State lock error: Check for stale locks in DynamoDB/backend; use
terraform force-unlockas last resort - Provider version conflict: Pin versions in
required_providersand runterraform init -upgrade - Drift detected: Run
terraform planto see differences; import or taint resources as needed - Destroy hanging: Check for resource dependencies; use
-targetfor selective destruction
Keywords
terraform, iac, infrastructure as code, hcl, aws, azure, gcp, modules, state management, cloud provisioning