Building a Cloud Infrastructure with Terraform: A Real-World Guide
Tags: terraform, beginners, tutorial, devops
Published: 2024-03-03 05:36:57

[Demo Repo](https://github.com/sagordon-dev/terraform-tutorial-blog)

Welcome to our journey through the cloud, where we’ll build our infrastructure using Terraform as if we were constructing a city from the ground up. If you’ve ever played a city-building game or marveled at the intricacies of urban planning, you’re in for a treat. Let’s translate that fascination into the digital realm of cloud infrastructure.

## Introduction

In this tutorial, we're going to construct our digital metropolis using Terraform, a powerful tool that lets us define our city (infrastructure) as code. Just like city planners need to map out where buildings, roads, and parks go, we’ll plan where our servers, networks, and services reside in the cloud.

## Prerequisites

Before we break ground:
- Ensure you have Terraform installed. Think of this as getting your construction tools ready.
- An AWS account is like owning the land where we’ll build our city.
- Basic knowledge of cloud concepts – akin to understanding what buildings, roads, and utilities are in urban planning.

## Step 1: Laying the Groundwork with Our VPC

Our first task is to establish the land boundaries for our city, known as a Virtual Private Cloud (VPC) in AWS.

```hcl
resource "aws_vpc" "main" {
  cidr_block           = "10.0.1.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true
  tags = {
    Name = "Main VPC"
  }
}
```

### Explanation
- `cidr_block` defines the size of our land. Imagine it as deciding how big our city will be.
- Enabling DNS support and hostnames is like ensuring our city has a postal service, making it easier to find addresses.

## Step 2: Building the Roads (Subnets)

Just as roads connect different parts of the city, subnets connect sections of our cloud city, guiding traffic to its destination.

```hcl
resource "aws_subnet" "public" {
  vpc_id            = aws_vpc.main.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "us-east-1a"
  map_public_ip_on_launch = true
  tags = {
    Name = "Public Subnet 1"
  }
}
```

### Explanation
- Each `aws_subnet` represents a neighborhood. The `cidr_block` specifies the neighborhood's size.
- `map_public_ip_on_launch` ensures every home (server) in our public neighborhood has a street address (IP) visible to the world.

## Step 3: Powering Our City (Internet Gateway)

An Internet Gateway in our cloud city acts like a highway to the outside world, allowing data to flow in and out.

```hcl
resource "aws_internet_gateway" "main" {
  vpc_id = aws_vpc.main.id
}
```

### Explanation
- Attaching this to our VPC is akin to building a major highway from our city to the rest of the world, vital for trade and communication.

## Step 4: Constructing Buildings (EC2 Instances)

Now, we’re ready to build our structures: the servers where our applications live. These are our city’s buildings, each serving a unique purpose – from housing residents (data) to providing services (applications).

```hcl
module "ec2" {
  source = "./modules/ec2"
  // Pass in required variables like AMI ID, instance type, etc.
}
```

### Explanation
- Each EC2 instance is a building, designed for a specific use. The `instance type` determines the building size and capacity.

## Step 5: Opening Public Spaces (ALB)

An Application Load Balancer (ALB) acts like a city’s public square, directing visitors to various buildings (servers) based on what services they need.

```hcl
module "alb" {
  source = "./modules/alb"
  // Configuration details
}
```

### Explanation
- The ALB ensures that no single building gets overcrowded, distributing incoming traffic evenly. It’s like having traffic lights and signs in our public square.

## Wrapping Up

Congratulations! You’ve laid the foundations of your cloud city, built its infrastructure, and opened it to the public. Like any city planner, your job is ongoing. You’ll need to manage, expand, and adjust the city as it grows. Terraform makes these tasks manageable, allowing you to adapt your infrastructure to meet the needs of its inhabitants.

Remember, every great city started with a plan. Your cloud infrastructure is no different. Happy building!

Photo by <a href="https://unsplash.com/@shawnanggg?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">shawnanggg</a> on <a href="https://unsplash.com/photos/time-lapse-photo-of-concrete-highway-with-cars-vdBE638sszE?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Unsplash</a>