Performance
A guide to optimizing Terraform performance and resource management.
State Management Optimization
Large State File Handling
Split States
Break monolithic states into smaller functional units
Use separate states for different components/environments
Implement state sharing through data sources
Reduce State Size
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 4.0" } } # Optimize state operations backend "s3" { skip_metadata_api_check = true skip_region_validation = true } }
Plan and Apply Optimization
Targeted Operations
# Target specific resources
terraform plan -target=module.vpc
terraform apply -target=aws_instance.web_server
# Parallel operations
terraform apply -parallel=true -parallelism=20
Resource Dependencies
# Explicit dependencies
resource "aws_instance" "web" {
depends_on = [aws_vpc.main]
}
# Implicit dependencies through references
resource "aws_instance" "web" {
subnet_id = aws_subnet.main.id # Implicit dependency
}
Module Performance
Module Design
Minimize Module Complexity
# Good: Focused module module "vpc" { source = "./modules/vpc" cidr_block = var.vpc_cidr } # Separate module for subnets module "subnets" { source = "./modules/subnets" vpc_id = module.vpc.vpc_id }
Use Data Sources Efficiently
# Cache data source results in locals locals { availability_zones = data.aws_availability_zones.available.names }
Resource Creation Optimization
Parallel Resource Creation
Remove Unnecessary Dependencies
# Instead of this resource "aws_instance" "web" { depends_on = [aws_vpc.main, aws_subnet.main, aws_security_group.web] } # Use this resource "aws_instance" "web" { subnet_id = aws_subnet.main.id # Only necessary dependency vpc_security_group_ids = [aws_security_group.web.id] }
Batch Resource Creation
# Use count or for_each for batch operations resource "aws_instance" "web" { count = var.instance_count ami = var.ami_id instance_type = var.instance_type }
Provider Configuration
Provider Optimization
provider "aws" {
# Reduce API calls
skip_get_ec2_platforms = true
skip_metadata_api_check = true
skip_region_validation = true
# Configure retries
max_retries = 5
}
Data Loading
Efficient Data Sources
# Use specific data source queries
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
}
}
# Cache repeated lookups
locals {
ami_id = data.aws_ami.ubuntu.id
}
Variable Management
Optimize Variable Usage
# Use maps for lookups instead of multiple conditionals
locals {
instance_types = {
dev = "t3.micro"
test = "t3.small"
prod = "t3.medium"
}
selected_instance_type = local.instance_types[var.environment]
}
Testing and Validation
Performance Testing
Benchmark Commands
time terraform plan time terraform apply -auto-approve
Profile Terraform Operations
TF_LOG=trace terraform plan
Memory Management
Memory Optimization
Workspace Cleanup
# Regular cleanup rm -rf .terraform/providers terraform init -upgrade
Provider Plugin Caching
# Enable plugin caching export TF_PLUGIN_CACHE_DIR="$HOME/.terraform.d/plugin-cache"
Performance Monitoring
Monitoring Strategies
Execution Time Tracking
Monitor plan/apply duration
Track state file size growth
Monitor API rate limits
Resource Creation Time
locals { start_time = timestamp() } output "execution_time" { value = format("Execution time: %s", formatdate("DD/MM/YYYY hh:mm:ss", local.start_time)) }
Best Practices Checklist
Last updated