In my early days of managing cloud environments, I spent hours clicking through the AWS and Azure consoles, meticulously ticking boxes and naming instances. One missed checkbox during a production migration once took down an entire staging environment for four hours. That was the moment I realized that manual configuration is the enemy of reliability. This is why I shifted entirely to using terraform for cloud platform automation.

Terraform allows you to treat your infrastructure exactly like your application code: versioned, peer-reviewed, and repeatable. Whether you are managing a simple VPS or a complex mesh of microservices, shifting to Infrastructure as Code (IaC) is the only way to scale without losing your mind. In this tutorial, I’ll show you how to set up your first automated pipeline.

Prerequisites

Before we dive into the code, you’ll need a few things installed on your machine. In my current setup, I use a Mac with Homebrew, but these steps work on Linux and Windows as well:

If you are planning to scale this automation for a team, I highly recommend looking into cloud platform security best practices 2026 to ensure your state files aren’t leaking secrets.

Step 1: Initializing Your Provider

Terraform uses ‘providers’ to interact with cloud APIs. The first step in any cloud platform automation project is defining who you’re talking to. Create a file named main.tf.

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

Next, define the region where your resources will live:

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

Run terraform init in your terminal. This downloads the AWS provider plugin. You’ll see a .terraform folder appear—don’t commit this to Git!

Step 2: Defining Your Infrastructure

Now, let’s automate the creation of a Virtual Private Cloud (VPC) and a single EC2 instance. This is the core of using terraform for cloud platform automation—describing the desired state rather than the steps to get there.

# Create a VPC
resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "Automation-VPC"
  }
}

# Create a Subnet
resource "aws_subnet" "subnet_1" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.1.0/24"
  tags = {
    Name = "Primary-Subnet"
  }
}

# Launch an EC2 Instance
resource "aws_instance" "web_server" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  subnet_id     = aws_subnet.subnet_1.id

  tags = {
    Name = "Terraform-Automation-Node"
  }
}

As shown in the image below, once you run the plan command, Terraform will calculate the difference between your current cloud state and this code.

Terminal output of terraform plan showing 3 resources to be added
Terminal output of terraform plan showing 3 resources to be added

Step 3: Planning and Applying Changes

Never run apply without running plan first. This is where I’ve caught countless mistakes, like accidentally deleting a database because of a renamed resource.

Run: terraform plan

Terraform will output exactly what it intends to do. If it looks correct, execute the changes:

terraform apply -auto-approve

In my experience, using the -auto-approve flag is great for CI/CD pipelines, but during local development, I always manually review the prompt.

Pro Tips for Production Automation

If you find that managing raw EC2 instances is becoming too complex, you might want to explore the best managed kubernetes for small business to simplify your orchestration layer.

Troubleshooting Common Issues

When I first started with terraform for cloud platform automation, I hit these three walls repeatedly:

Issue Likely Cause Fix
Credential Errors Expired AWS Session Run aws sso login or refresh your access keys.
Cycle Error Circular dependency between resources Refactor resources to remove mutual dependencies.
State Lock Previous run crashed or someone else is applying Use terraform force-unlock [LOCK_ID] after verifying.

What’s Next?

Now that you have the basics down, the next step is to integrate this into a GitHub Actions or GitLab CI pipeline. Imagine your infrastructure automatically updating the moment a Pull Request is merged—that’s the true power of automation.

I’d also suggest looking into Terragrunt if you find yourself repeating the same provider blocks across multiple folders; it’s a wrapper that keeps your code DRY (Don’t Repeat Yourself).