Konfigurasi Dasar Amazon VPC Menggunakan Terraform (Bagian 1)

TL;DR Konfigurasi Amazon VPC public subnet dengan menggunakan Terraform

Salah satu bagian atau layer penting dalam sebuah infrastruktur aplikasi adalah network.

Amazon Virtual Private Cloud (VPC) adalah service yang memungkinkan pengguna AWS untuk membuat virtual network di atas infrastruktur AWS. Amazon VPC memiliki fungsi menyerupai dengan traditional network yang ada di Data Center on premise, namun dijalankan di atas infrastruktur AWS dan dengan memanfaatkan skalabilitas yang dimiliki oleh infrastruktur AWS.

Beberapa konsep yang ada di dalam Amazon VPC sebagai berikut:

  • Virtual Private Cloud (VPC): virtual network yang ada di dalam sebuah akun aws
  • Subnet: range/jangkauan IP address di dalam sebuah VPC.
  • Route Table: sekumpulan rule yang berisi route/jalur yang menentukan kemana arah network traffic dijalankan.
  • Internet Gateway: gateway/gerbang yang menghubungkan VPC dengan internet.
  • VPC endpoint: Endpoint yang digunakan untuk menghubungkan VPC dengan AWS service yang di-support tanpa harus melalui Internet Gateway, NAT Gateway/Instance, VPN, atau AWS Direct Connect.
  • CIDR block: CIDR(Classless Inter-Domain Routing) adalah metodologi yang digunakan untuk mengagregasi route dan alokasi IP address.

Secara default pada setiap region di setiap akun AWS akan terbentuk VPC default secara otomatis. VPC default siap atau dapat digunakan tanpa harus dikonfigurasi terlebih dahulu. Namun jika kita memelukan VPC dengan custom configuration, kita dapat melakukan konfigurasi VPC sesuai dengan kebutuhan kita (non-default VPC).

Dalam terminologi Amazon VPC, dikenal istilah public subnet dan private subnet. Public subnet digunakan untuk resource yang dapat berinteraksi langsung dengan internet melalui Internet Gateway. Sedangkan private subnet digunakan oleh resource yang tidak dapat diakses/berinteraksi langsung dengan internet. Jika private subnet ingin berinteraksi dengan internet, dapat menggunakan Network Address Translation (NAT) gateway/device yang berada di public subnet.

Contoh penggunaan public dan private subnet di Amazon VPC adalah jika kita ingin membuat multi-tier website. Dimana web server berada di public subnet, sedangkan database server berada di private subnet.

Untuk penjelasan lebih detail terkait Amazon VPC, dapat melihat dokumentasi Amazon VPC disini

Pada artikel ini saya akan mencoba menjelaskan dasar-dasar konfigurasi Amazon VPC tentang bagaimana mengkonfigurasi public subnet di Amazon VPC. Skenario yang saya gunakan adalah akan membuat sebuah nondefault VPC di region ap-southeast-1. Kemudian dalam vpc tersebut akan dibuat public subnet. Nantinya di dalam public subnet akan di-asosiasikan internet gateway sebagai penghubung public subnet dengan internet. Agar dapat berinteraksi ke internet, juga dibuat sebuah route table yang di dalamnya berisi route ke internet dari public subnet tersebut. Di dalam VPC juga akan saya buat sebuah security group yang nantinya akan di-asosiasikan ke sebuah EC2 yang bertindak seolah-olah sebagai web server. Topologi nya seperti berikut:

image

Konfigurasi resource VPC 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:

vpc/
├─ vpc-apse1/
   ├─ main.tf
   ├─ sec-groups.tf
   ├─ variables.tf
   ├─ vpc.tf

  1. Sebagai langkah awal, saya mulai dengan membuat satu file dengan nama 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 variable.tf yang berikutnya akan saya jelaskan.

    image

# 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.57.0"
    }
  }

  required_version = ">= 1.0.6"
}

# Setup AWS provider
provider "aws" {
  region = var.aws_region
}
  1. Langkah berikutnya yaitu dengan membuat variable di file variable.tf. Di file ini saya deklarasikan variable aws_region, az_apse_1a dan default_route. Variable aws_region digunakan untuk menentukan default AWS region yang digunakan yaitu ap-southeast-1. Variable az_apse_1a digunakan untuk mendeklarasikan availability zone ap-southeast-1a. Terakhir variable default_route digunakan untuk mendeklarasikan default route (0.0.0.0/0).

    image

# Setup AWS Region
variable "aws_region" {
  type        = string
  description = "AWS Region"
  default     = "ap-southeast-1"
}

# Setup Availability Zone
variable "az_apse_1a" {
  type        = string
  description = "Availability Zone used by subnet"
  default     = "ap-southeast-1a"
}

# Setup Default Route
variable "default_route" {
  type        = string
  description = "Default Route from and to internet"
  default     = "0.0.0.0/0"
}
  1. Selanjutnya adalah konfigurasi VPC dan komponen terkait seperti Internet Gateway, Subnet, Route Table dan Route. Konfigurasi saya lakukan di file vpc.tf. Di artikel ini saya akan membuat sebuah vpc dengan nama apse1_0 dengan CIDR block 10.0.0.0/16. Kemudian akan di attach sebuah Internet Gateway ke VPC tersebut. Selanjutnya saya akan membuat public subnet untuk VPC apse1_0 dengan nama public_apse1_0 yang memiliki CIDR block 10.0.0.0/22 dan berada di availability zone ap-southeast-1a.

    Berikutnya saya akan membuat Route Table untuk dengan nama public_apse1_0. Subnet public_apse1_0 akan di-asosiasikan ke dalam Route Table ini. Kemudian di dalam Route Table ini akan dibuat sebuah Route baru dengan tujuan default route (0.0.0.0/0) melalui Internet Gateway.

    image

# Configuration section for vpc
resource "aws_vpc" "apse1_0" {
  cidr_block = "10.0.0.0/16"

  tags = {
    Name = "apse1-0"
  }
}

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

  tags = {
    Name = "apse1-0"
  }
}

# Configuration section for subnet
resource "aws_subnet" "public_apse1_0" {
  cidr_block        = "10.0.0.0/22"
  vpc_id            = aws_vpc.apse1_0.id
  availability_zone = var.az_apse_1a

  tags = {
    Name = "public-apse1-0"
  }
}

# Configuration section for route table
resource "aws_route_table" "public_apse1_0" {
  vpc_id = aws_vpc.apse1_0.id

  tags = {
    Name = "public-apse1-0"
  }
}

resource "aws_route" "default_public_apse1_0" {
  route_table_id         = aws_route_table.public_apse1_0.id
  destination_cidr_block = var.default_route
  gateway_id             = aws_internet_gateway.apse1_0.id
}

resource "aws_route_table_association" "public_apse1_0" {
  subnet_id      = aws_subnet.public_apse1_0.id
  route_table_id = aws_route_table.public_apse1_0.id
}
  1. Selanjutnya saya akan konfigurasi security group di file sec-groups.tf. Di artikel ini saya akan membuat security group dengan nama demo_public_apse1_0 di dalam vpc apse1_0. Ingress/Inbound rule untuk security group ini adalah mengizinkan/allow port 22, 80 dan 443 dari semua sumber (0.0.0.0/0). Dan untuk Egress/Outbound rule, saya izinkan atau allow semua traffic (semua protocol, semua port dan semua tujuan). Rule ini hanya untuk keperluan demo, untuk production environment, sebaiknya anda gunakan rule yang lebih spesifik dan least privileged.

    image

# Configuration related to security groups

resource "aws_security_group" "demo_public_apse1_0" {
  name        = "demo-public-apse1-0"
  description = "Security Group for demo purposes"
  vpc_id      = aws_vpc.apse1_0.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-public-apse1-0"
  }
}
  1. Selanjutnya adalah melakukan terraform plan dan terraform apply di Terraform Cloud. Namun bagian ini saya hanya gambarkan ilustarsinya saja. Pastikan di production, plan dan apply berhasil/success.

    image

  2. Setelah infrastructure/service berhasil dibuat oleh Terraform, selanjutnya kita dapat melakukan verifikasi via AWS Web Console. Pertama yang kita lakukan adalah dengan masuk ke halaman service VPC dan masuk ke menu VPC, pastikan vpc apse1-0 sudah berhasil terbentuk dengan CIDR block yang sesuai.

    image

  3. Berikutnya masuk ke menu Internet Gateway. Pastikan Internet Gateway dengan nama apse1-0 sudah ter-associate dengan VPC apse1-0.

    image

  4. Berikutnya masuk ke menu Subnet. Pastikan Subnet public-apse1-0 sudah berhasil terbentuk dengan CIDR block yang sesuai.

    image

  5. Beriktunya masuk ke menu Route Tables. Pastikan Route Table public-apse1-0 sudah berhasil terbentuk.

    image

  6. Pastikan Route yang ter-associate dengan Route Table public-apse1-0. Secara otomatis, Route Table akan menambahkan route ke local CIDR block yang ada dalam vpc tersebut, dalam contoh disini adalah 10.0.0.0/16. Setelah itu akan ada 1 Route tujuan 0.0.0.0/0 (default route) via Internet Gateway, seperti yang sudah di deklarasikan di Terraform code.

    image

  7. Selanjutnya pastikan Subnet associations yang ada pada Route Table tersebut. Pada artikel ini, Subnet public-apse1-0 di associate secara explicit ke dalam Route Table public-apse1-0.

    image

  8. Selanjutnya masuk ke menu Security Groups. Pastikan Security Group demo-public-apse1-0 sudah berhasil terbentuk.

    image

  9. Pastikan Inbound Rule di Security Group tersebut sudah mengizinkan port 22, 80 dan 443.

    image

  10. Selanjutnya pastikan Outbound Rule di Security Group sudah mengizinkan semua traffic.

    image

  11. Berikutnya adalah simulasi menjalankan EC2 di atas VPC dan Subnet yang baru dibentuk di atas. Konfigurasi EC2 tidak saya jelaskan secara detail di artikel ini. Namun saya akan membuat sebuah demo EC2 dengan nama demo-ubuntu-public-0. EC2 ini akan dijalankan di atas VPC apse1-0 dan menggunakan subnet public-apse1-0. Karena Subnet public-apse1-0 di deklarasikan menggunakan Availability Zone (AZ) ap-southeast-1a, maka EC2 juga akan berjalan di AZ tersebut.

    Karena EC2 berjalan di atas public subnet, saya coba asosiasikan juga public IP address ke EC2 tersebut. Sehingga EC2 memiliki IP address private yg berada di range CIDR public-apse1-0 dan juga memiliki 1 IP public.

    image

  12. Kemudian EC2 demo-ubuntu-public-0 akan dijalankan menggunakan Security Group demo-public-apse1-0.

    image

  13. Selanjutnya verifikasi koneksi dari EC2 demo tersebut. Saya mencoba untuk melakukan docker pull image nginx dan menjalankan container nginx di port 80. Selain itu saya verifikasi koneksi via ping ke nama domain ludesdeveloper.wordpress.com. Dari hasil tes ini, dapat disimpulkan koneksi outbound dari EC2 sudah berhasil dan juga inbound juga berhasil karena berhasil docker pull image (umumnya menggunakan port HTTPS).

    image

  14. Setelah itu memastikan juga panggil Public IP address yang digunakan oleh EC2 tersebut. Hasilnya berhasil menampilkan halaman nginx dan dapat disimpulkan inbound port 80 ke EC2 tersebut juga berhasil.

    image

Kesimpulan

Akhirnya kita sampai di penghujung artikel ini. Pada artikel ini kita sudah membahas konsep dasar dari Amazon VPC. Setelah itu kita juga telah melakukan bagaimana cara konfigurasi Amazon VPC, Public Subnet dan beberapa komponen lain menggunakan Terraform. Kita juga telah melakukan demo menjalankan EC2 di atas VPC dan Public Subnet yang baru dibuat di artikel ini.

Silahkan kunjungi github repo saya untuk melihat source code yang saya gunakan pada artikel ini.

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

Sekian dan terima kasih.

Satu respons untuk “Konfigurasi Dasar Amazon VPC Menggunakan Terraform (Bagian 1)

Add yours

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: