Membuat Konfigurasi Amazon VPC yang Reusable Menggunakan Terraform Module

tl;dr Cara membuat konfigurasi Amazon VPC yang reusable dengan menggunakan Terraform module

Dalam sebuah akun Amazon Web Services (AWS) mungkin akan ditemukan use case atau kasus dimana kita perlu membuat dua buah atau lebih isolated cloud environment dalam beberapa Amazon VPC. Misal kita perlu membuat VPC untuk staging dan VPC untuk production sehingga dapat memisahkan service/resource sesuai dengan kebutuhan atau environment-nya.

Misalkan kita ingin membuat resource-resource di beberapa environment Amazon VPC yang jumlahnya cukup banyak tersebut menggunakan IaC tool seperti Terraform, salah satu caranya adalah kita dapat membuat konfigurasi yang reusable menggunakan Terraform Module. Alasan kenapa kita menggunakan Terraform Module dalam pembuatan resource Amazon VPC adalah dengan menggunakan module kita dapat membuat semacam template konfigurasi yang reusable. Umumnya resource VPC yang akan di provision itu memiliki kemiripan dan hanya berbeda di CIDR block yang digunakan oleh VPC ataupun subnet-subnet di dalamnya. Dengan menggunakan module, kita dapat membuat banyak environment atau VPC dari kerangka atau template yang sama.

Pada artikel ini saya akan membuat dua buah VPC yaitu VPC staging dan production. Kedua VPC tersebut dikonfigurasi dengan mengacu ke kerangka/template konfigurasi yang bersumber dari module. Komponen lain seperti Subnet, Route Table, Route, Internet Gateway, NAT Gateway juga akan dikonfigurasi mengacu ke kerangka/template yang ada di module. Region yang digunakan adalah ap-southeast-1 (Singapore) dan Availability Zone yang digunakan adalah ap-southeast-1a. Akan dibuat juga security group di kedua VPC tersebut namun tidak via module. Dan akan disimulasikan juga menjalankan EC2 demo di kedua VPC tersebut. Jika digambarkan topologinya seperti berikut:

Image

Konfigurasi resource, module dan komponen terkait lainnya pada artikel ini menggunakan IaC tool Terraform. Terraform yang digunakan adalah Terraform Cloud.

Konfigurasi

Pada artikel ini, struktur file yang digunakan oleh terraform code sebagai berikut:

modules/
├─ vpc/
│  ├─ vpc-apse1/
│  │  ├─ outputs.tf
│  │  ├─ private-subnet.tf
│  │  ├─ public-subnet.tf
│  │  ├─ variables.tf
│  │  ├─ vpc.tf
vpc/
├─ vpc-apse1/
│  ├─ main.tf
│  ├─ outputs.tf
│  ├─ sec-groups.tf
│  ├─ variables.tf
│  ├─ vpc.tf

Folder modules/vpc/vpc-apse1 adalah folder tempat module vpc berada dan nantinya akan bertindak sebagai child module dari root module yang berada di folder vpc/vpc-apse1.

  1. Sebagai langkah awal saya akan mulai menjelaskan dari child module vpc yang akan digunakan sebagai kerangka untuk pembuatan resource di root module. Saya awali dengan menjelaskan file ./modules/vpc-apse1/variables.tf. Pada file ini saya definisikan variable variable yang akan digunakan di dalam child module vpc.
# Set variables
variable "environment_name" {
  type        = string
  description = "Set environment name"
  default     = ""
}

variable "vpc_cidr" {
  type        = string
  description = "VPC CIDR"
  default     = ""
}

variable "availability_zone" {
  type        = list(string)
  description = "Availability Zone"
  default     = ["ap-southeast-1a", "ap-southeast-1b", "ap-southeast-1c"]
}

variable "public_subnet_cidr_az_a" {
  type        = list(string)
  description = "Public subnet CIDR within AZ-a"
  default     = []
}

variable "public_subnet_interfix" {
  type        = string
  description = "Give interfix to public subnet name"
  default     = "public"
}

variable "private_subnet_cidr_az_a" {
  type        = list(string)
  description = "Private subnet CIDR within AZ-a"
  default     = []
}

variable "private_subnet_interfix" {
  type        = string
  description = "Give interfix to private subnet name"
  default     = "private"
}

variable "additional_tags" {
  type        = map(string)
  description = "Variable if additional tags is needed"
  default     = {}
}

variable "default_route" {
  type        = string
  description = "Default Route from and to internet"
  default     = "0.0.0.0/0"
}

image

  1. Selanjutnya kita akan membahas file ./modules/vpc-apse1/vpc.tf. Saya membuat kerangka untuk pembuatan resource VPC, Internet Gateway, Elastic IP (EIP) yang akan digunakan oleh NAT Gateway, berikut juga kerangka untuk pembuatan resource NAT Gateway-nya. Subnet yang akan digunakan oleh NAT Gateway adalah subnet dengan index paling kecil/0 di setiap AZ. Di setiap resource juga dibuatkan template tags yang akan dipakai oleh resource. Secara garis besar akan ada kesamaan format dalam template tags. Yang pertama adalah akan membuat tag Name yang akan bersumber dari var environment_name. Dan jika diperlukan dapat menambah tags dengan mengacu ke var additional_tags yang sudah diset dengan type map(string)
# Configuration section for vpc
resource "aws_vpc" "vpc" {
  cidr_block = var.vpc_cidr

  tags = merge(
    { "Name" = var.environment_name },
    var.additional_tags
  )
}

# Configuration section for internet gateway
resource "aws_internet_gateway" "internet_gateway" {
  vpc_id = aws_vpc.vpc.id

  tags = merge(
    { "Name" = var.environment_name },
    var.additional_tags
  )
}

# Configuration section for Elastic IP used by NAT Gateway
resource "aws_eip" "nat_eip_a" {
  vpc = true

  tags = merge(
    {
      "Name" = format(
        "nat-${var.environment_name}-a",
      )
    },
    var.additional_tags
  )
}

# Configuration section for NAT Gateway
# Subnet used by NAT Gateway is the first index public subnet in each AZ
resource "aws_nat_gateway" "nat_gateway_a" {
  allocation_id = aws_eip.nat_eip_a.id
  subnet_id     = aws_subnet.public_subnet_az_a[0].id

  tags = merge(
    {
      "Name" = format(
        "nat-${var.environment_name}-a",
      )
    },
    var.additional_tags
  )

  depends_on = [aws_internet_gateway.internet_gateway]
}

image

  1. Selanjutnya kita akan membahas file ./modules/vpc-apse1/public-subnet.tf. Di file ini, saya membuat kerangka untuk komponen-komponen public subnet. Public subnet di dalam AZ a dapat lebih dari satu, sehingga akan dilakukan count var public_subnet_cidr_az_a untuk menentukan index dari public subnet yang akan dibuat. Availability zone yang digunakan akan mengacu ke var availability_zone index [0] yaitu ap-southeast-1a jika mengacu ke file ./modules/vpc-apse1/variables.tf. Template tags juga sudah disiapkan. Namun akan ada tambahan interfix mengacu ke var public_subnet_interfix dan index number untuk setiap komponen public subnet yang dibuat.
# Configuration section for Public Subnet
resource "aws_subnet" "public_subnet_az_a" {
  count = length(var.public_subnet_cidr_az_a)

  cidr_block        = element(var.public_subnet_cidr_az_a, count.index)
  vpc_id            = aws_vpc.vpc.id
  availability_zone = var.availability_zone[0]

  tags = merge(
    {
      "Name" = format(
        "${var.environment_name}-${var.public_subnet_interfix}-a-${count.index}",
      )
    },
    var.additional_tags
  )
}

Kemudian akan dibuat sebuah template untuk resource Route Table untuk public subnet beserta template tags nya.

# Configuration section for route table public subnet
resource "aws_route_table" "public_subnet" {
  vpc_id = aws_vpc.vpc.id

  tags = merge(
    {
      "Name" = format(
        "${var.environment_name}-${var.public_subnet_interfix}",
      )
    },
    var.additional_tags
  )
}

Berikutnya akan dibuat juga sebuah template default route ke internet yang akan digunakan oleh public subnet. Destination akan mengarah ke default route 0.0.0.0/0 yang sudah di definisikan di dalam default value var default_route dan target/next hop nya akan diarahkan ke Internet Gateway.

# Configuration section for default route to internet from public subnet
resource "aws_route" "default_route_public_subnet" {
  route_table_id         = aws_route_table.public_subnet.id
  destination_cidr_block = var.default_route
  gateway_id             = aws_internet_gateway.internet_gateway.id
}

Terakhir akan dibuat sebuah explicit association untuk Subnet di dalam Route Table public. Disini juga akan dibuat count untuk var public_subnet_cidr_az_a sehingga semua index public subnet yang ada di AZ a akan diasosiasikan ke dalam Route Table.

# Configuration section for route table association on public route table
resource "aws_route_table_association" "public_subnet_az_a" {
  count = length(var.public_subnet_cidr_az_a)

  subnet_id      = element(aws_subnet.public_subnet_az_a[*].id, count.index)
  route_table_id = aws_route_table.public_subnet.id
}

image

  1. Selanjutnya kita akan membahas file ./modules/vpc-apse1/private-subnet.tf. Di file ini, saya membuat kerangka untuk komponen-komponen private subnet. Secara garis besar konfigurasi nya mirip dengan template di public_subnet. Hanya saja var yang digunakan adalah var private_subnet_cidr_az_a pada bagian resource Subnet, Route Table dan Route Table Association. Template tags juga sudah disiapkan. Namun akan ada tambahan interfix mengacu ke var private_subnet_interfix dan index number untuk setiap komponen private subnet yang dibuat.
# Configuration section for private subnet
resource "aws_subnet" "private_subnet_az_a" {
  count = length(var.private_subnet_cidr_az_a)

  cidr_block        = element(var.private_subnet_cidr_az_a, count.index)
  vpc_id            = aws_vpc.vpc.id
  availability_zone = var.availability_zone[0]

  tags = merge(
    {
      "Name" = format(
        "${var.environment_name}-${var.private_subnet_interfix}-a-${count.index}",
      )
    },
    var.additional_tags
  )
}

# Configuration section for route table private subnet
resource "aws_route_table" "private_subnet_az_a" {
  count = length(var.private_subnet_cidr_az_a)

  vpc_id = aws_vpc.vpc.id

  tags = merge(
    {
      "Name" = format(
        "${var.environment_name}-${var.private_subnet_interfix}-a-${count.index}",
      )
    },
    var.additional_tags
  )
}

# Configuration section for route table association on private route table AZ a
resource "aws_route_table_association" "private_subnet_az_a" {
  count = length(var.private_subnet_cidr_az_a)

  subnet_id      = element(aws_subnet.private_subnet_az_a[*].id, count.index)
  route_table_id = aws_route_table.private_subnet_az_a[0].id
}

Namun yang sedikit berbeda adalah konfigurasi default route yang digunakan oleh private subnet. Target/next hop nya akan dirahkan ke NAT gateway yang ada di AZ tersebut.

# Configuration section for default route to internet from private subnet AZ a
resource "aws_route" "default_route_private_subnet_a" {
  route_table_id         = aws_route_table.private_subnet_az_a[0].id
  destination_cidr_block = var.default_route
  nat_gateway_id         = aws_nat_gateway.nat_gateway_a.id
}

image

  1. Selanjutnya kita akan membahas file ./modules/vpc-apse1/outputs.tf. Di file ini, saya membuat kerangka untuk output VPC ID beserta public dan private subnet untuk VPC staging dan production yang nanti akan dipanggil di root module.
# Set outputs
output "subnet_staging_public_a" {
  value = tolist("${aws_subnet.public_subnet_az_a.*.id}")
}

output "subnet_staging_private_a" {
  value = tolist("${aws_subnet.private_subnet_az_a.*.id}")
}

output "subnet_production_public_a" {
  value = tolist("${aws_subnet.public_subnet_az_a.*.id}")
}

output "subnet_production_private_a" {
  value = tolist("${aws_subnet.private_subnet_az_a.*.id}")
}

output "vpc_id" {
  value = aws_vpc.vpc.id
}

image

  1. Selanjutnya kita akan bergeser ke folder yang akan menjadi root module. File pertama yang akan saya jelaskan adalah ./vpc/vpc-apse1/main.tf. Di file ini, saya akan mendeklarasikan konfigurasi terraform yang akan mengacu ke terraform cloud (app.terraform.io) sebagai backend. Dan mereferensikan nama organisasi dan workspace yang digunakan. Kemudian saya juga deklarasikan terraform provider yang digunakan yaitu hashisorp/aws dengan versi terkait. Di akhir saya deklarasikan region aws yang digunakan, mengacu ke variable aws_region yang ada di file ./vpc/vpc-apse1/variable.tf yang berikutnya akan saya jelaskan.
# Setup terraform cloud and workspace
terraform {
  backend "remote" {
    hostname     = "app.terraform.io"
    organization = "lanandra"

    workspaces {
      name = "vpc-ap-southeast-1"
    }
  }
}

# Setup terraform providers
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.74.0"
    }
  }

  required_version = ">= 1.1.5"
}

# Setup AWS provider
provider "aws" {
  region = var.aws_region
}

image

  1. Selanjutnya kita akan membahas file ./vpc/vpc-apse1/variables.tf. Di file ini, saya deklarasikan variable aws_region, availability_zone dan default_route. Variable aws_region digunakan untuk menentukan default AWS region yang digunakan yaitu ap-southeast-1. Variable availability_zone digunakan untuk mendeklarasikan seluruh availability zone yang ada di region ap-southeast-1 ke dalam sebuah list string. Terakhir variable default_route digunakan untuk mendeklarasikan default route (0.0.0.0/0).
# Set variables
variable "aws_region" {
  type        = string
  description = "AWS Region"
  default     = "ap-southeast-1"
}

variable "availability_zone" {
  type        = list(string)
  description = "Availability Zone used by subnet"
  default     = ["ap-southeast-1a", "ap-southeast-1b", "ap-southeast-1c"]
}

variable "default_route" {
  type        = string
  description = "Default Route from and to internet"
  default     = "0.0.0.0/0"
}

image

  1. Selanjutnya kita akan membahas file ./vpc/vpc-apse1/vpc.tf. Di file ini, saya akan membuat dua buah resource yang mengambil sumber referensi dari module.

Yang pertama adalah bagian module vpc_staging. Di bagian ini saya akan definsikan source folder module. Kemudian untuk environment name saya berikan nama staging. Berikutnya saya definisikan CIDR yang digunakan oleh VPC beserta public dan private subnet. Saya juga definsikan additional tags yang saya gunakan yaitu memberikan tag Environment = Staging dan Owner = Luthfi.

# Create VPC from module
module "vpc_staging" {
  source = "../../modules/vpc/vpc-apse1/"

  environment_name         = "staging"
  vpc_cidr                 = "10.1.0.0/16"
  public_subnet_cidr_az_a  = ["10.1.0.0/22"]
  private_subnet_cidr_az_a = ["10.1.12.0/22"]

  additional_tags = {
    Environment = "Staging"
    Owner       = "Luthfi"
  }
}

Yang kedua adalah bagian module vpc_production. Di bagian ini saya akan definsikan source folder module. Kemudian untuk environment name saya berikan nama production. Berikutnya saya definisikan CIDR yang digunakan oleh VPC beserta public dan private subnet. Saya juga definsikan additional tags yang saya gunakan yaitu memberikan tag Environment = Production dan Owner = Luthfi.

module "vpc_production" {
  source = "../../modules/vpc/vpc-apse1/"

  environment_name         = "production"
  vpc_cidr                 = "10.2.0.0/16"
  public_subnet_cidr_az_a  = ["10.2.0.0/22"]
  private_subnet_cidr_az_a = ["10.2.12.0/22"]

  additional_tags = {
    Environment = "Production"
    Owner       = "Luthfi"
  }
}

image

  1. Selanjutnya kita akan membahas file ./vpc/vpc-apse1/sec-groups.tf. Di file ini, saya akan membuat total empat buah security group. Dua security group pertama adalah demo security group untuk public dan private di dalam vpc staging. Security group demo_staging_public adalah security group yang digunakan oleh instance di dalam public subnet. Inbound Rules akan memberikan akses ke port protocol 22, 80 dan 443 dari semua IP dan untuk Outbound Rules akan memberikan akses ke seluruh port dan tujuan IP. Security group demo_staging_private adalah security group yang digunakan oleh instance di dalam private subnet. Inbound Rules akan memberikan akses ke port protocol 22, 80, 44 dan 5432 dengan sumber dari CIDR subnet yang ada di public subnet. Sedangkan Outbound Rules akan memberikan akses ke seluruh port dan tujuan IP. Harap diingat ini hanya untuk keperluan demo di artikel ini. Pada production environment, mohon berikan akses terbatas atau least privileged akses di dalam security group
# Configuration related to security groups
resource "aws_security_group" "demo_staging_public" {
  name        = "demo-staging-public"
  description = "Security Group for demo purposes"
  vpc_id      = module.vpc_staging.vpc_id

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = [var.default_route]
  }

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = [var.default_route]
  }

  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = [var.default_route]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = [var.default_route]
  }

  tags = {
    Name = "demo-staging-public"
  }
}

resource "aws_security_group" "demo_staging_private" {
  name        = "demo-staging-private"
  description = "Security Group for demo purposes"
  vpc_id      = module.vpc_staging.vpc_id

  ingress {
    description = "from staging-public"
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["10.1.0.0/20"]
  }

  ingress {
    description = "from staging-public"
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["10.1.0.0/20"]
  }

  ingress {
    description = "from staging-public"
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["10.1.0.0/20"]
  }

  ingress {
    description = "from staging-public"
    from_port   = 5432
    to_port     = 5432
    protocol    = "tcp"
    cidr_blocks = ["10.1.0.0/20"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = [var.default_route]
  }

  tags = {
    Name = "demo-staging-private"
  }

image

Sedangkan dua buah security group lainnya yaitu demo_production_private dan demo_production_public secara konsep sama dengan dua buah security group di atas. Hanya saja yang berbeda adalah CIDR block yang digunakan adalah CIDR yang ada di dalam VPC production.

resource "aws_security_group" "demo_production_public" {
  name        = "demo-production-public"
  description = "Security Group for demo purposes"
  vpc_id      = module.vpc_production.vpc_id

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = [var.default_route]
  }

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = [var.default_route]
  }

  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = [var.default_route]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = [var.default_route]
  }

  tags = {
    Name = "demo-production-public"
  }
}

resource "aws_security_group" "demo_production_private" {
  name        = "demo-production-private"
  description = "Security Group for demo purposes"
  vpc_id      = module.vpc_production.vpc_id

  ingress {
    description = "from production-public"
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["10.2.0.0/20"]
  }

  ingress {
    description = "from production-public"
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["10.2.0.0/20"]
  }

  ingress {
    description = "from production-public"
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["10.2.0.0/20"]
  }

  ingress {
    description = "from production-public"
    from_port   = 5432
    to_port     = 5432
    protocol    = "tcp"
    cidr_blocks = ["10.2.0.0/20"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = [var.default_route]
  }

  tags = {
    Name = "demo-production-private"
  }
}

image

  1. Selanjutnya kita akan membahas file ./vpc/vpc-apse1/outputs.tf. Di file ini, saya membuat output subnet staging public dan private, subnet production public dan private, security group staging public dan private beserta security group production public dan private. Output subnet diambil dengan mengambil referensi dari output yang ada di dalam child module.
# Set outputs
output "subnet_staging_public_a_0" {
  value = module.vpc_staging.subnet_staging_public_a[0]
}

output "subnet_staging_private_a_0" {
  value = module.vpc_staging.subnet_staging_private_a[0]
}

output "subnet_production_public_a_0" {
  value = module.vpc_production.subnet_production_public_a[0]
}

output "subnet_production_private_a_0" {
  value = module.vpc_production.subnet_production_private_a[0]
}

output "sec_group_demo_staging_public" {
  value = aws_security_group.demo_staging_public.id
}

output "sec_group_demo_staging_private" {
  value = aws_security_group.demo_staging_private.id
}

output "sec_group_demo_production_public" {
  value = aws_security_group.demo_production_public.id
}

output "sec_group_demo_production_private" {
  value = aws_security_group.demo_production_private.id
}

image

  1. Berikutnya adalah melakukan commit dan push terraform code ke repository. Dan lakukan terraform plan dan terraform apply di Terraform Cloud workspace agar infrastructure dapat dibuat/provisioned. Untuk bagian ini hanya saya tampilkan simulasinya saja. Jika ingin melihat lebih detail bagaimana proses provisioning resource AWS via Terraform Cloud, silahkan lihat blogpost saya berikut ini.

image

  1. Setelah provision resource di Terraform Cloud selesai dan berhasil, hal yang dapat kita lakukan adalah verifikasi resource via AWS Web Console. Resource pertama yang kita verifikasi dapat dimulai dari VPC. Masuk ke halaman service VPC, kemudian pilih menu Your VPCs. Pastikan sudah ada dua buah VPC baru dengan nama staging dan production. Pastikan juga CIDR block sudah sesuai dengan yang di-definisikan di terraform code.

image

Pastikan juga tags nya sudah sesuai untuk VPC environment staging dan VPC environment production.

image

image

  1. Selanjutnya masuk ke menu Internet Gateways. Pastikan juga sudah ada buah Internet Gateways dengan nama staging dan production. Untuk Tags secara garis besar akan sama dengan Tags pada resource VPC di atas untuk ke seluruh komponen VPC, yang mungkin beda nantinya pada sebagian nama resource saja, jadi tidak saya jelaskan lebih detail tampilan tags untuk sisa resource yang akan dibahas di artikel ini.

image

  1. Selajutnya masuk ke menu Elastic IPs. Pastikan ada dua buah Elastic IP yang akan digunakan oleh NAT gateway dengan masing masing IP address yang berbeda.

image

  1. Selanjutnya masuk ke menu NAT Gateways. Pastikan ada dua buah NAT Gateway, nat-staging-a akan terasosiasi dengan public IP address yang dipakai oleh Elastic IP nat-staging-a yang ada di poin sebelumnya. Berikutnya nat-production-a akan terasosiasi dengan public IP address yang dipakai oleh Elastic IP nat-production-a.

image

  1. Selanjutnya masuk ke menu Subnets. Pastikan ada dua buah subnet public yaitu satu untuk staging dan satu lainnya untuk production. Berikutnya juga pastikan ada dua buah subnet private dimana satu untuk staging dan satu lainnya untuk production. Pastikan juga CIDR block sudah sesuai.

image

image

  1. Selanjutnya masuk ke menu Route Tables. Pastikan ada dua buah Route Table public yaitu staging-public dan production-public.

image

  1. Pada Route Table staging-public, masuk ke menu Route. Pastikan sudah ada default route (0.0.0.0/0) dengan target ke IGW dengan ID IGW staging. Untuk local route (10.1.0.0/16) sudah secara otomatis terbuat.

image

  1. Selanjutnya di tab Subnet associations, pastikan subnet staging public sudah masuk ke dalam daftar explicit subnet associations.

image

  1. Pastikan hal yang sama seperti poin nomor 18-19 di dalam Route Table production-public. Yang berbeda hanyalah default route diarahkan ke ID IGW production dan subnet association diarahkan ke subnet production public.

image

image

  1. Selanjutnya pastikan juga sudah terbentuk dua buah Route Table private, yang satu adalah staging-private-a-0 dan satu lainnya adalah production-private-a-0.

image

  1. Pastikan hal yang sama seperti poin nomor 18-19 di dalam Route Table staging-private-a-0. Yang berbeda disini adalah default route diarahkan ke ID NAT Gateway staging private dan subnet association diarahkan ke subnet staging private.

image

image

  1. Lakukan verifikasi yang sama di Route Table production-private-a-0. Yang beda adalah target default route diarahkan ke ID NAT Gateway production private dan subnet association diarahkan ke subnet production private.

image

image

  1. Selanjutnya masuk ke menu Security Groups. Pastikan sudah ada empat buah Security Group baru sesuai yang didefinisikan di terraform code.

image

  1. Pada Security Group demo_staging_public dan demo_production_public pastikan inbound rule 22, 80 dan 443 dengan sumber 0.0.0.0/0 dan outbound rule dengan tujuan semua port dan IP address sudah berhasil terbentuk.
Staging

image

image

Production

image

image

  1. Selanjutnya pada Security Group demo_staging_private dan demo_production_private pastikan inbound rule 22, 80, 443 dan 5432 sudah diizinkan, yang berbeda hanya source nya adalah subnet public di masing-masing VPC. Untuk outbound rule dengan tujuan semua port dan IP address pastikan sudah diizinkan.
Staging

image

image

Production

iamge

image

  1. Di Terraform Cloud workspace, kita juga dapat memastikan bahwa outputs yang sudah didefinisikan di terraform code juga sudah berhasil terbentuk.

image

  1. Setelah memastikan seluruh infrastruktur berhasil terbentuk atau provisioned, selanjutnya kita dapat melakukan simulasi menjalankan EC2 instance di kedua VPC tersebut dan di setiap public dan private subnet. Untuk konfigurasi EC2 tidak saya jelaskan lebih detail di artikel ini.

  2. Pertama saya jalankan EC2 di VPC staging dan subnet public. Saya sudah dapat memastikan traffic ping ke domain ludesdeveloper.wordpress.com (outbound traffic) sudah berhasil. Selanjutnya memastikan inbound traffic (http & https) dengan melakukan sudo apt update juga sudah berhasil.

image

image

  1. Berikutnya lakukan simulasi di EC2 yang berjalan di VPC production dan public subnet. Hasil tes juga menunjukan bahwa inbound dan outbound traffic berhasil berjalan.

image

image

  1. Berikutnya lakukan simulasi di EC2 yang berjalan di VPC staging dan private subnet. Hasil tes juga menunjukan bahwa inbound dan outbound traffic berhasil berjalan.

image

image

  1. Berikutnya lakukan simulasi di EC2 yang berjalan di VPC production dan private subnet. Hasil tes juga menunjukan bahwa inbound dan outbound traffic berhasil berjalan.

image

image

Kesimupulan

Akhirnya kita sampai di penghujung artikel ini. Pada artikel ini kita sudah membahas konsep konfigurasi Amazon VPC yang reusable menggunakan terraform module. Kita juga telah melakukan demo pembuatan resource Amazon VPC dan komponennya menggunakan referensi dari module. Selain itu simulasi menjalankan EC2 di VPC dan subnet yang terbentuk dari module tersebut

Silahkan kunjungi GitHub repo saya untuk melihat source code yang saya gunakan pada artikel ini. Untuk VPC child module dapat melihat referensi di bagian ini dan yang bertindak sebagai root module dapat dilihat di bagian ini

Sekian artikel kali ini. Jika ada saran, kritik, atau masukan silahkan tinggalkan di kolom komentar.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

Connecting to %s

Situs yang Didukung WordPress.com.

Atas ↑

%d blogger menyukai ini: