Terraform Command Cheatsheet
Essential Terraform commands for infrastructure as code
DevOps
Terraform Command Cheatsheet
A comprehensive reference for Terraform infrastructure as code.
Basic Commands
Initialize
terraform init # Initialize directory
terraform init -upgrade # Upgrade providers
terraform init -reconfigure # Reconfigure backendPlan
terraform plan # Show execution plan
terraform plan -out=plan.tfplan # Save plan
terraform plan -destroy # Plan destroy
terraform plan -target=resource # Target specific resourceApply
terraform apply # Apply changes
terraform apply plan.tfplan # Apply saved plan
terraform apply -auto-approve # Skip confirmation
terraform apply -target=resource # Apply specific resourceDestroy
terraform destroy # Destroy infrastructure
terraform destroy -auto-approve # Skip confirmation
terraform destroy -target=resource # Destroy specific resourceOther Commands
terraform validate # Validate configuration
terraform fmt # Format code
terraform show # Show current state
terraform output # Show outputs
terraform refresh # Refresh state
terraform graph # Generate dependency graphState Management
State Commands
terraform state list # List resources
terraform state show resource # Show resource
terraform state mv source dest # Move resource
terraform state rm resource # Remove from state
terraform state pull # Pull remote state
terraform state push # Push stateWorkspace
terraform workspace list # List workspaces
terraform workspace new dev # Create workspace
terraform workspace select dev # Switch workspace
terraform workspace delete dev # Delete workspaceConfiguration Syntax
Provider
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
}
provider "aws" {
region = "us-east-1"
}Resource
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "WebServer"
}
}Variables
variable "instance_type" {
description = "EC2 instance type"
type = string
default = "t2.micro"
}
variable "availability_zones" {
type = list(string)
default = ["us-east-1a", "us-east-1b"]
}Outputs
output "instance_ip" {
value = aws_instance.web.public_ip
description = "Public IP of instance"
}Data Sources
data "aws_ami" "ubuntu" {
most_recent = true
owners = ["099720109477"]
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
}
}Locals
locals {
common_tags = {
Environment = "production"
ManagedBy = "Terraform"
}
}Modules
Use Module
module "vpc" {
source = "./modules/vpc"
cidr_block = "10.0.0.0/16"
name = "main-vpc"
}Module Output
output "vpc_id" {
value = module.vpc.vpc_id
}Backend Configuration
S3 Backend
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "prod/terraform.tfstate"
region = "us-east-1"
}
}Common Patterns
Count
resource "aws_instance" "server" {
count = 3
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "Server-${count.index}"
}
}For_each
resource "aws_instance" "server" {
for_each = toset(["web", "app", "db"])
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = each.key
}
}Conditional
resource "aws_instance" "server" {
count = var.create_instance ? 1 : 0
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}Dynamic Blocks
resource "aws_security_group" "example" {
name = "example"
dynamic "ingress" {
for_each = var.ingress_rules
content {
from_port = ingress.value.from_port
to_port = ingress.value.to_port
protocol = ingress.value.protocol
cidr_blocks = ingress.value.cidr_blocks
}
}
}Functions
Common Functions
# String functions
upper("hello")
lower("HELLO")
title("hello world")
format("Hello, %s", var.name)
# Numeric functions
min(1, 2, 3)
max(1, 2, 3)
ceil(5.1)
floor(5.9)
# Collection functions
length(var.list)
concat(list1, list2)
merge(map1, map2)
lookup(map, "key", "default")
# Type conversion
tostring(123)
tonumber("123")
tolist(set)
toset(list)Import Existing Resources
Import
terraform import aws_instance.web i-1234567890abcdef0Quick Reference
| Command | Description |
|---|---|
terraform init | Initialize |
terraform plan | Show plan |
terraform apply | Apply changes |
terraform destroy | Destroy all |
terraform validate | Validate config |
terraform fmt | Format code |
terraform state list | List resources |
terraform output | Show outputs |
Best Practices
- Use version control
- Use remote state (S3, Terraform Cloud)
- Use modules for reusability
- Use variables for flexibility
- Use workspaces for environments
- Run terraform fmt regularly
- Use terraform validate before apply
- Use -target sparingly
- Document your code
- Use consistent naming
Resources
- Official Documentation: https://www.terraform.io/docs/
- Terraform Registry: https://registry.terraform.io/
- Best Practices: https://www.terraform-best-practices.com/
- Learn Terraform: https://learn.hashicorp.com/terraform

