Post

Terraform for Beginners: From Zero to Infrastructure as Code

A complete introduction to Terraform — what it is, how it works, and how to write your own Terraform configurations

Terraform for Beginners: From Zero to Infrastructure as Code

Terraform for Beginners: From Zero to Infrastructure as Code

What is Terraform?

Terraform is an open-source tool developed by HashiCorp that allows you to define, provision, and manage your infrastructure using code.

This concept is known as Infrastructure as Code (IaC) — treating your infrastructure (servers, databases, networks, etc.) the same way you treat your application code: version-controlled, automated, and reproducible.


Why Use Terraform?

Here’s what makes Terraform powerful:

  • Declarative Syntax: You define what you want, not how to get it.
  • Multi-Cloud Support: Use the same language for AWS, Azure, GCP, and others.
  • Immutable Infrastructure: Apply changes safely and predictably.
  • State Tracking: Maintains a snapshot of your infrastructure.
  • Version Control Friendly: Your .tf files can live in Git.

Real-World Use Case

Imagine you need:

  • An AWS EC2 instance
  • With a specific security group
  • And an attached EBS volume

You can either:

  • Log in to AWS Console and click through a bunch of pages
    OR
  • Write a few lines of Terraform code and run one command: terraform apply

Key Concepts

Before writing code, understand these basic concepts:

1. Providers

Providers are services Terraform interacts with — like AWS, Azure, GCP, Kubernetes.

1
2
3
provider "aws" {
  region = "us-east-1"
}

2. Resources

Resources are components of your infrastructure — EC2 instance, S3 bucket, etc.

1
2
3
4
resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}

3. Variables

Variables make your configuration dynamic and reusable.

1
2
3
variable "instance_type" {
  default = "t2.micro"
}

4. Outputs

Outputs let you display values after applying infrastructure — like IP addresses or URLs.

1
2
3
output "instance_ip" {
  value = aws_instance.web.public_ip
}

5. State

Terraform maintains the infrastructure’s current state in a file named terraform.tfstate.


Installing Terraform

On macOS:

1
2
brew tap hashicorp/tap
brew install hashicorp/tap/terraform

On Linux:

1
2
3
4
5
sudo apt-get update && sudo apt-get install -y gnupg software-properties-common
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor > hashicorp.gpg
sudo install -o root -g root -m 644 hashicorp.gpg /etc/apt/trusted.gpg.d/
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install terraform

On Windows:

Download the binary from https://terraform.io/downloads and add it to your system PATH.


Writing Your First Terraform Project

Let’s create a project from scratch.

1. Create a Folder

1
2
mkdir my-first-terraform
cd my-first-terraform

2. Create Your First File: main.tf

1
2
3
4
5
6
7
8
provider "aws" {
  region = "us-east-1"
}

resource "aws_instance" "my_ec2" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}

Replace the AMI ID with a valid one from your AWS region.

3. Initialize Terraform

1
terraform init

This downloads the AWS provider plugin.

4. Preview the Plan

1
terraform plan

This shows what Terraform would do if you apply.

5. Apply the Infrastructure

1
terraform apply

Type yes when prompted.

Terraform will:

  • Create an EC2 instance
  • Track it in the terraform.tfstate file

Adding Variables

Let’s refactor the code to make it more reusable.

Create variables.tf

1
2
3
4
5
6
7
variable "region" {
  default = "us-east-1"
}

variable "instance_type" {
  default = "t2.micro"
}

Update main.tf

1
2
3
4
5
6
7
8
provider "aws" {
  region = var.region
}

resource "aws_instance" "my_ec2" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = var.instance_type
}

Now you can override variables via:

1
terraform apply -var="instance_type=t3.micro"

Or via terraform.tfvars.


Output the EC2 IP Address

Add an output:

1
2
3
output "ec2_ip" {
  value = aws_instance.my_ec2.public_ip
}

Run terraform apply again and it will print the instance’s IP address.


Destroying Infrastructure

When done, destroy everything created:

1
terraform destroy

Directory Structure

Here’s how a typical small project looks:

1
2
3
4
5
6
my-first-terraform/
├── main.tf
├── variables.tf
├── terraform.tfvars (optional)
├── outputs.tf
├── terraform.tfstate (generated)

Tips and Best Practices

  • Keep state files secure (use remote backends for teams)
  • Use version control (Git) for your .tf files
  • Group infrastructure into modules for reusability
  • Don’t commit .tfstate or .terraform/ directory
  • Prefer Terraform Cloud, S3 backends, or Terraform Enterprise for collaboration

Where to Go From Here

Now that you can write and apply your own Terraform code:

  • Explore more AWS resources: S3 buckets, RDS databases, IAM roles
  • Learn about Terraform modules
  • Try remote state and workspaces
  • Integrate with CI/CD pipelines

Helpful Resources


Final Thoughts

Terraform gives you control, automation, and repeatability for your infrastructure. By learning it early, you gain a foundational DevOps skill that applies across all cloud platforms and technologies.

Whether you’re deploying a single VM or orchestrating a multi-region Kubernetes cluster, Terraform is the glue that connects everything in code.

This post is licensed under CC BY 4.0 by the author.