3_Tier_VPC
3_Tier_VPC
Step-01: Introduction
• Understand about Terraform Modules
• Create VPC using Terraform Modules
• Define Input Variables for VPC module and reference them in VPC
Terraform Module
• Define local values and reference them in VPC Terraform Module
• Create terraform.tfvars to load variable values by default from this file
• Create vpc.auto.tfvars to load variable values by default from this file
related to a VPC
• Define Output Values for VPC
https://www.linkedin.com/in/azharsayyed1/
• c1-versions.tf
• c2-generic-variables.tf
• c3-vpc.tf
• Terraform AWS VPC Module
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "2.78.0"
# Database Subnets
create_database_subnet_group = true
create_database_subnet_route_table= true
database_subnets = ["10.0.151.0/24", "10.0.152.0/24"]
#create_database_nat_gateway_route = true
https://www.linkedin.com/in/azharsayyed1/
#create_database_internet_gateway_route = true
public_subnet_tags = {
Type = "public-subnets"
}
private_subnet_tags = {
Type = "private-subnets"
}
database_subnet_tags = {
Type = "database-subnets"
}
tags = {
Owner = "kalyan"
Environment = "dev"
}
https://www.linkedin.com/in/azharsayyed1/
vpc_tags = {
Name = "vpc-dev"
}
}
# Terraform Initialize
terraform init
Observation:
1. Verify if modules got downloaded to .terraform folder
# Terraform Validate
terraform validate
# Terraform plan
terraform plan
# Terraform Apply
terraform apply -auto-approve
Observation:
https://www.linkedin.com/in/azharsayyed1/
1) Verify VPC
2) Verify Subnets
3) Verify IGW
4) Verify Public Route for Public Subnets
5) Verify no public route for private subnets
6) Verify NAT Gateway and Elastic IP for NAT Gateway
7) Verify NAT Gateway route for Private Subnets
8) Verify no public route or no NAT Gateway route to Database Subnets
9) Verify Tags
# Terraform Destroy
terraform destroy -auto-approve
# Delete Files
rm -rf .terraform*
rm -rf terraform.tfstate*
https://www.linkedin.com/in/azharsayyed1/
Step-05: v2-vpc-module-standardized - Standardized and Generalized
• In the next series of steps we are going to standardize the VPC
configuration
• c2-generic-variables.tf
# Input Variables
# AWS Region
variable "aws_region" {
description = "Region in which AWS Resources to be created"
type = string
default = "us-east-1"
}
# Environment Variable
variable "environment" {
description = "Environment Variable used as a prefix"
type = string
default = "dev"
}
# Business Division
variable "business_divsion" {
description = "Business Division in the large organization this Infrastructure
belongs"
type = string
default = "HR"
}
Step-06: c3-local-values.tf
• Understand about Local Values
# Define Local Values in Terraform
https://www.linkedin.com/in/azharsayyed1/
locals {
owners = var.business_divsion
environment = var.environment
name = "${var.business_divsion}-${var.environment}"
common_tags = {
owners = local.owners
environment = local.environment
}
}
Step-07: c4-01-vpc-variables.tf
# VPC Input Variables
# VPC Name
variable "vpc_name" {
description = "VPC Name"
type = string
default = "myvpc"
}
https://www.linkedin.com/in/azharsayyed1/
# VPC Availability Zones
variable "vpc_availability_zones" {
description = "VPC Availability Zones"
type = list(string)
default = ["us-east-1a", "us-east-1b"]
}
https://www.linkedin.com/in/azharsayyed1/
}
https://www.linkedin.com/in/azharsayyed1/
description = "Enable only single NAT Gateway in one Availability Zone to save
costs during our demos"
type = bool
default = true
}
Step-08: c4-02-vpc-module.tf
# Create VPC Terraform Module
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
#version = "2.78.0"
#version = "~> 2.78"
version = "5.2.0"
# Database Subnets
database_subnets = var.vpc_database_subnets
create_database_subnet_group = var.vpc_create_database_subnet_group
create_database_subnet_route_table =
var.vpc_create_database_subnet_route_table
# create_database_internet_gateway_route = true
# create_database_nat_gateway_route = true
https://www.linkedin.com/in/azharsayyed1/
# NAT Gateways - Outbound Communication
enable_nat_gateway = var.vpc_enable_nat_gateway
single_nat_gateway = var.vpc_single_nat_gateway
tags = local.common_tags
vpc_tags = local.common_tags
https://www.linkedin.com/in/azharsayyed1/
# VPC ID
output "vpc_id" {
description = "The ID of the VPC"
value = module.vpc.vpc_id
}
https://www.linkedin.com/in/azharsayyed1/
output "nat_public_ips" {
description = "List of public Elastic IPs created for AWS NAT Gateway"
value = module.vpc.nat_public_ips
}
# VPC AZs
output "azs" {
description = "A list of availability zones spefified as argument to this module"
value = module.vpc.azs
}
Step-10: terraform.tfvars
# Generic Variables
aws_region = "us-east-1"
environment = "dev"
business_divsion = "HR"
Step-11: vpc.auto.tfvars
# VPC Variables
vpc_name = "myvpc"
vpc_cidr_block = "10.0.0.0/16"
vpc_availability_zones = ["us-east-1a", "us-east-1b"]
vpc_public_subnets = ["10.0.101.0/24", "10.0.102.0/24"]
vpc_private_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
vpc_database_subnets= ["10.0.151.0/24", "10.0.152.0/24"]
vpc_create_database_subnet_group = true
vpc_create_database_subnet_route_table = true
vpc_enable_nat_gateway = true
https://www.linkedin.com/in/azharsayyed1/
vpc_single_nat_gateway = true
Step-12: Execute Terraform Commands
# Working Folder
terraform-manifests/v2-vpc-module-standardized
# Terraform Initialize
terraform init
# Terraform Validate
terraform validate
# Terraform plan
terraform plan
# Terraform Apply
terraform apply -auto-approve
Observation:
1) Verify VPC
2) Verify Subnets
3) Verify IGW
4) Verify Public Route for Public Subnets
5) Verify no public route for private subnets
6) Verify NAT Gateway and Elastic IP for NAT Gateway
7) Verify NAT Gateway route for Private Subnets
8) Verify no public route or no NAT Gateway route to Database Subnets
9) Verify Tags
https://www.linkedin.com/in/azharsayyed1/
Step-13: Clean-Up
# Terraform Destroy
terraform destroy -auto-approve
# Delete Files
rm -rf .terraform*
rm -rf terraform.tfstate*
https://www.linkedin.com/in/azharsayyed1/