DEV Community

Gokul Raj
Gokul Raj

Posted on

VPC using Terraform

Create a VPC from scratch using Terraform (Infrastructure as a Code)

In this blog, we are going to build a VPC infrastructure with Public and Private subnets that span across all the availability zones (AZ) in a region and make reach public subnets to the internet with the help of an internet gateway.

Source Code — Click Here

VPC

AWS following components which we required to create for this setup,
VPC

  • 1 Internet Gateway
  • 3 Public Subnets, one in each AZ
  • 3 Private Subnets, one in each AZ
  • Route table configurations

Let's get started to build a VPC with Terraform in AWS by following the steps.

Step 1 - Create a VPC

To begin with VPC resource in Terraform. To specify a range of IP addresses in a VPC, a CIDR block needs to be provided. We have also provided a Name tag for identification.

variable "vpc_cidr" {
  description = "CIDR Value"
  default     = "10.0.0.0/16"
}`

`resource "aws_vpc" "vpc_main" {
  cidr_block       = var.vpc_cidr
  instance_tenancy = "default"

  tags = {
    Name = vpc_main
  }
}
Enter fullscreen mode Exit fullscreen mode

Step 2 - Create Public and Private subnets

Firstly, we identify the CIDR ranges to be associated with the six new subnets we need to create. In our example, based on the CIDR range of the VPC I have identified the CIDR ranges and defined a couple of variables in our Terraform code (variables.tf).

variable "public_subnets_cidr" {
  type        = list(string)
  description = "Public Subnets"
  default     = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]

}

variable "private_subnets_cidr" {
  type        = list(string)
  description = "Private Subnets"
  default     = ["10.0.4.0/24", "10.0.5.0/24", "10.0.6.0/24"]

}
Enter fullscreen mode Exit fullscreen mode

In a resource block, we should provide the subnet configurations which include CIDR blocks and AZ details.

resource "aws_subnet" "public_subnets" {
  count             = length(var.public_subnets_cidr)
  vpc_id            = aws_vpc.vpc_main.id
  cidr_block        = element(var.public_subnets_cidr, count.index)
  availability_zone = element(var.availability_zone, count.index)

  tags = {
    Name = "Public Subnet ${count.index + 1}"
  }
}

resource "aws_subnet" "private_subnets" {
  count             = length(var.private_subnets_cidr)
  vpc_id            = aws_vpc.vpc_main.id
  cidr_block        = element(var.private_subnets_cidr, count.index)
  availability_zone = element(var.availability_zone, count.index)

  tags = {
    Name = "Private Subnet ${count.index + 1}"
  }
}
Enter fullscreen mode Exit fullscreen mode

Step 3 - Create an Internet Gateway

Internet gateway will access the subnets to the internet. since we are using public subnets, we need to provide access to the internet in the given VPC.

resource "aws_internet_gateway" "igw" {
  vpc_id = aws_vpc.vpc_main.id
tags = {
    Name = "vpc_main_igw"
  }
}
Enter fullscreen mode Exit fullscreen mode

Step 4 - Create Route Table and RT association

However, the route table is an important aspect of making the resource communicate with each other. By default, VPC has a local route table created when VPC is created. Now are going to create a new route table with a destination of the internet gateway and associate it with public subnets to get internet access.

resource "aws_route_table" "public_rt" {
  vpc_id = aws_vpc.vpc_main.id

  route {
    cidr_block           = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.igw.id
  }

  tags = {
    Name = "Public Route "
  }

}

resource "aws_route_table_association" "public_rt_association" {
  count          = length(var.public_subnets_cidr)
  subnet_id      = element(aws_subnet.public_subnets[*].id, count.index)
  route_table_id = aws_route_table.public_rt.id

}
Enter fullscreen mode Exit fullscreen mode

We have now successfully implemented the VPC design represented in the diagram using Terraform.

Will catch up on upcoming blogs…

Top comments (0)