Terraform: Deploy Infrastruktur Sederhana Untuk Aplikasi Web

Achmad Zulfikar
NDID Engineering
Published in
11 min readNov 21, 2023

Apa itu Terraform?

HashiCorp Terraform adalah infrastructure as code tools (IaC) yang digunakan untuk membangun infrastruktur pada lingkungan cloud maupun on-premise dalam bentuk file konfigurasi yang mudah dipahami oleh manusia. File konfigurasi yang dihasilkan oleh Terraform memungkinkan pengguna untuk melakukan versioning pada file konfigurasi, re-use dan membagikan file konfigurasi guna menjamin konsistensi pada siklus proses provisioning resource infrastruktur.

Terraform membangun dan mengelola resource pada cloud platform dengan memanfaatkan API yang terdapat pada masing-masing cloud platform. Terraform memanfaatkan provider (salah satu fitur pada Terraform) untuk bekerja secara virtual pada saat berinteraksi dengan berbagai macam cloud platform.

Bagaimana Terraform Bekerja?

HashiCorp dan Terraform menyediakan berbagai macam provider yang dapat digunakan mengelolah berbagai macam platform (multi-platform), resource dan service. Beberapa platform pupuler yang saat ini disupport oleh Terraform adalah Amazon Web Service (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog dan lainnya.

Terdapat tiga langkah utama pada siklus eksekusi Terraform dalam proses development, sebagai berikut:

Write

Proses mendefinisikan resource yang akan dibangun pada sebuah lingkungan cloud platform. Proses ini menghasilkan file konfigurasi (file teks dengan ekstensi *.tf) yang berisi definisi semua resource yang dibutuhkan pada sebuah infrastruktur cloud, misalnya file konfigurasi akan berisi konfigurasi untuk membangun sebuah virtual server dan menempatkan virtual server ke dalam virtual private cloud dengan konfigurasi security tertentu.

Plan

Proses ini akan menghasilkan sebuah rencana eksekusi terhadap file konfigurasi yang telah dibuat pada langkah sebelumnya. Rencana eksekusi adalah detail informasi mengenai service apa saja yang akan ditambahkan, diubah ataupun dihapus dengan membandingkan file konfigurasi dan kondisi infrastruktur saat ini.

Apply

Proses ini akan melakukan perubahan pada lingkungan infrastruktur yang dituju sesuai dengan file konfigurasi yang dibuat pada step sebelumnya, misalnya Terraform akan menambahkan aturan baru kedalam security group pada sebuah virtual server. Proses ini membutuhkan approval dari sisi user saat dijalankan.

Mengapa memilih Terraform?

Terdapat beberapa keunggulan yang ditawarkan oleh Terraform sebagai berikut:

Manage any infrastructure

Terraform dapat digunakan untuk management infrastruktur di beberapa cloud yang populer saat ini misalnya Amazon Web Service (AWS), Azure dan Google Cloud Platform (GCP)

Track your infrastructure

Terraform plan menampilkan rencana perubahan yang akan dilakukan sebelum melakukan eksekusi perubahan secara langsung pada infrastruktur. Terraform juga menyimpan status dari infrastruktur kedalam file state yang akan menjadi acuan dalam melakukan perubahan selanjutnya.

Automate changes

Terraform merupakan tools IaC yang bersifat deklaratif yang berisi informasi mengenasi kondisi terbaru dari infrastruktur. Terraform user tidak harus menuliskan secara detail mengenai langkah-langkah yang dibutuhkan untuk membangun sebuah infrastruktur, Terraform secara otomatis akan menentukan langkah-langkah yang dibutuhkan untuk membangun infrasturktur sesuai dengan file konfigurasi.

Standardize configuration

Terraform mendukung penggunaan ulang dari file konfigurasi dalam bentuk module yang berisi kumpulan konfigurasi untuk mendefinisikan sebuah infrastruktur. Konsep tersebut dapat menghemat waktu dan dapat menjadi best practice dalam proses development.

Collaborate

Terraform menggunakan file text untuk menyimpan konfigurasi dari infrastruktur. File text tersebut dapat diintegrasikan dengan beberapa tools untuk versioning dan Terraform Cloud untuk mendukung konsistensi dalam kolaborasi antar tim.

Bagaimana proses deploy insfrastruktur dengan Terraform?

Pada artikel ini akan dijelaskan langkah-langkah yang dibutuhkan untuk membangun infrastruktur web sederhana pada AWS infrastuktur. Web infrastruktur yang dibangun terdiri dari satu buah VPC, satu buah public subnet dan satu buah private subnet pada satu availability zone yang sama. Web server diletakkan dalam public subnet dan database server diletakkan dalam private subnet dengan masing-masing security group, Internet gateway ditambahkan untuk memfasilitasi trafik dari internet menuju public subnet dalam VPC. Adapun arsitektur yang akan dibangun sesuai dengan gambar berikut:

Visual Studio Code digunakan sebagai editor pada langkah selanjutnya. Visual Studio Code adalah salah satu tools yang sering digunakan dalam implementasi Terraform. Berikut adalah langkah-langkah yang dibutuhkan untuk integrasi Visual Studio Code dengan AWS.

1. Download Visual Studio Code melalui website (https://code.visualstudio.com/download), pilih installer Visual Studio Code yang dibutuhkan sesuai dengan sistem operasi yang digunakan kemudian lakukan instalasi.

2. Setelah proses instalasi Visual Studio Code selesai, buka Visual Studio Code kemudian pilih extension pada menu sebelah kiri editor. Ketik aws tool pada kolom search dan lakukan instalasi AWS Toolkit extension sesuai dengan gambar berikut:

3. Ulangi langkah yang sama untuk melakukan instalasi Terraform extension sesuai dengan gambar berikut:

4. Setelah melakukan instalasi AWS Toolkit dan Terraform extension, Langkah selanjutnya adalah melakukan konfigurasi pada profile AWS yang akan digunakan. Pilih AWS Toolkit extension pada menu sebelah kiri editor, pilih simbol titik kemudian pilih connect to AWS sesuai dengan gambar berikut:

5. Untuk melakukan konfigurasi profile AWS, pilih edit credential sesuai dengan gambar berikut:

6. Langkah sebelumnya akan membuka dua file text yaitu config dan credential. Lakukan modifikasi pada file text credential dengan manambahkan informasi access key dari AWS akun sesuai dengan gambar berikut:

7. Setelah menambahkan informasi access key, simpan perubahan pada file credential dan tutup file config dan credential. Proses konfigurasi Visual Studio Code selesai.

Setelah proses konfigurasi Visual Studio Code selesai, Langkah selanjutnya adalah menambahkan direktori kedalam workspace Visual Studio Code kemudian menambahkan file baru dengan ekstensi *.tf. Untuk menambahkan direktori kedalam workspace pilih file pada bagian atas editor kemudian pilih add folder to workspace. Pilih direktori yang akan ditambahkan kedalam workspace kemudian pilih add pada jendela dialog windows explorer.

Untuk menambahkan file baru pilih file pada bagian atas editor kemudian pilih new text file kemudian masukkan nama file yang akan ditambahkan (main.tf).

Konfigurasi provider dan VPC

Setelah menambahkan file main.tf, Langkah selanjutnya adalah menambahkan deklarasi resource AWS yang dibutuhkan sesuai dengan arsitektur pada gambar sebelumnya. Tambahkan deklarasi resource pada file main.tf untuk konfigurasi provider yang digunakan (AWS) dan untuk membuat VPC (lab-vpc) yang akan digunakan pada infrastruktur sesuai dengan gambar berikut:

Simpan perubahan pada file main.tf kemudian buka terminal dan eksekusi perintah terraform sebagai berikut:

$terraform init

$terraform plan

$terraform apply

Setelah melakukan eksekusi perintah terraform dan pesan sukses tampil pada terminal, buka akun AWS kemudian lakukan pengecekan VPC yang baru ditambahkan. VPC baru dengan nama lab-vpc akan ditambahkan pada daftar VPC.

Konfigurasi public subnet, private subnet dan route table

Tambahkan dua buah subnet pada VPC. Subnet pertama adalah public subnet (lab-public-subnet) dengan route table (lab-public-subnet-route-table) yang akan melakukan route trafik menuju internet dan subnet kedua adalah private subnet (lab-private-subnet) sesuai dengan gambar berikut:

Simpan perubahan pada file main.tf kemudian buka terminal dan eksekusi perintah terraform sebagai berikut:

$terraform plan

$terraform apply

Setelah melakukan eksekusi perintah terraform dan pesan sukses tampil pada terminal, buka akun AWS kemudian lakukan pengecekan subnet yang baru ditambahkan. Subnet baru dengan nama lab-public-subnet dan lab-private subnet akan ditambahkan pada daftar subnet.

Lakukan pengecekan pada route table yang baru ditambahkan. Route table baru dengan nama lab-public-route-table akan ditambahkan pada daftar route table.

Konfigurasi internet gateway

Tambahkan internet gateway kemudian attach internet gateway ke VPC yang dibuat pada langkah sebelumnya sesuai dengan gambar berikut:

Simpan perubahan pada file main.tf kemudian buka terminal dan eksekusi perintah terraform sebagai berikut:

$terraform plan

$terraform apply

Lakukan pengecekan pada internet gateway yang baru ditambahkan. Internet gateway baru dengan nama lab-internet-gateway akan ditambahkan pada daftar internet gateway.

Konfigurasi Security Group

Tambahkan dua buah security group untuk masing-masing instance yang akan dibuat pada tahap selanjutnya. Security group pertama (lab-web-security-group) digunakan untuk web server yang akan menyaring trafik dari internet dan hanya memperbolehkan trafik melalui port 443 HTTPS dan port 80 HTTP, trafik yang menuju port yang lainnya akan diblok oleh security group. Security group kedua (lab-database-security-group) digunakan untuk database server yang akan menyaring trafik dalam VPC dan hanya memperbolehkan trafik melalui port 2121 dan berasal dari lab-web-security-group, trafik yang menuju port lainnya atau tidak berasal dari lab-web-security-group akan diblok oleh security group. Penambahan dua buah security group sesuai dengan gambar berikut:

Simpan perubahan pada file main.tf kemudian buka terminal dan eksekusi perintah terraform sebagai berikut:

$terraform plan

$terraform apply

Lakukan pengecekan pada security group yang baru ditambahkan. Security group baru dengan nama lab-web-security-group dan lab-database-security-group akan ditambahkan pada daftar security group.

Lakukan pengecekan detail untuk masing-masing security group. Pilih lab-web-security-group kemudian pastikan rule yang ditambahkan sesuai dengan file konfigurasi.

Lakukan pengecekan detail untuk masing-masing security group. Pilih lab-database-security-group kemudian pastikan rule yang ditambahkan sesuai dengan file konfigurasi.

Konfigurasi EC2 Instance

Tambahkan dua buah EC2 instance untuk web server dan database server. Web server ditempatkan pada subnet public dan menggunakan security group lab-web-security group, otomatisasi assignment ip public diaktifkan pada web server. Database server ditempatkan pada private subnet dan menggunakan lab-database-security-group. Penambahan dua buah EC2 instance sesuai dengan gambar berikut:

Simpan perubahan pada file main.tf kemudian buka terminal dan eksekusi perintah terraform sebagai berikut:

$terraform plan

$terraform apply

Lakukan pengecekan pada EC2 instance yang baru ditambahkan. EC2 instance baru dengan nama web-server dan database-server akan ditambahkan pada daftar EC2 instance.

Lakukan pengecekan detail untuk masing-masing EC2 instance. Pilih web-server dan pastikan konfigurasi VPC, subnet, public IPv4 (IPv4 public mungkin berbeda pada setiap eksekusi) dan security group sesuai dengan arsitektur pada gambar sebelumnya.

Lakukan pengecekan detail untuk masing-masing EC2 instance. Pilih database-server dan pastikan konfigurasi VPC, subnet dan security group sesuai dengan arsitektur pada gambar sebelumnya.

Semua resource yang digunakan dalam artikel ini termasuk free-tier sehingga tidak akan ada biaya yang dikenakan oleh pihak AWS pada proses demonstrasi. Setelah melakukan demonstrasi buka terminal kemudian eksekusi perintah berikut pada terminal untuk menghapus resource yang sudah dibuat sebelumnya.

$terraform destroy

Kesimpulan

Terraform adalah sebuah tools yang sangat mendukung dalam proses implementasi suatu system. File konfigurasi yang dihasilkan oleh Terraform dapat mengeliminasi aktifitas yang berulang pada proses implementasi suatu system, File konfigurasi Terraform dapat digunakan untuk membangun infrastruktur yang sama pada berbagai environment (Development, Testing dan Production). Mekanisme re-use pada Terraform akan mempersingkat waktu yang dibutuhkan untuk implementasi dan release suatu system.

Terraform juga dapat mendukung proses pengembangan suatu system dengan mengintegrasikan file konfigurasi dengan versioning tools sehingga memudahkan user untuk memantau perubahan terhadap infrastuktur selama pengembangan system.

Terraform menggunakan bahasa yang mudah dipahami pada proses deklarasi resource infrastuktur pada file konfigurasi selain itu perintah untuk melakukan eksekusi pada terminal juga sederhana.

File lengkap main.tf yang digunakan sebagai berikut.

//Setup Provider
provider "aws" {
region = "ap-southeast-3"
}

//Setup VPC
resource "aws_vpc" "lab-vpc" {
cidr_block = "10.16.0.0/16"

tags = {
Name = "lab-vpc"
}
}

//Setup Internet Gateway
resource "aws_internet_gateway" "lab-internet-gateway" {
vpc_id = aws_vpc.lab-vpc.id

tags = {
Name = "lab-internet-gateway"
}
}

//Setup Public Subnet
resource "aws_subnet" "lab-public-subnet" {
vpc_id = aws_vpc.lab-vpc.id
cidr_block = "10.16.0.0/24"

tags = {
Name = "lab-public-subnet"
}
}

resource "aws_route_table" "lab-public-route-table" {
vpc_id = aws_vpc.lab-vpc.id

tags = {
Name = "lab-public-route-table"
}
}

resource "aws_route" "lab-public-route" {
route_table_id = aws_route_table.lab-public-route-table.id
destination_cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.lab-internet-gateway.id
}

resource "aws_route_table_association" "lab-public-subnet-association" {
subnet_id = aws_subnet.lab-public-subnet.id
route_table_id = aws_route_table.lab-public-route-table.id
}


//Setup Private Subnet
resource "aws_subnet" "lab-private-subnet" {
vpc_id = aws_vpc.lab-vpc.id
cidr_block = "10.16.1.0/24"

tags = {
Name = "lab-private-subnet"
}
}

//Setup Web Server On Public Subnet
resource "aws_security_group" "lab-web-security-group" {
vpc_id = aws_vpc.lab-vpc.id
name = "lab-web-security-group"
description = "Web Server Security Group"

ingress {
description = "Allow HTTPS from Internet"
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}

ingress {
description = "Allow HTTP from Internet"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}

egress {
description = "Allow All Trafic from Internet"
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}

tags = {
Name = "lab-web-security-group"
}
}

resource "aws_instance" "web-server" {
ami = "ami-0d6c66e2edef56378"
instance_type = "t3.micro"
subnet_id = aws_subnet.lab-public-subnet.id
security_groups = [ aws_security_group.lab-web-security-group.id ]
associate_public_ip_address = true

tags = {
Name = "web-server"
}
}

//Setup Database Server on Private Subnet
resource "aws_security_group" "lab-database-security-group" {
vpc_id = aws_vpc.lab-vpc.id
name = "lab-database-security-group"
description = "Database Server Security Group"

ingress {
description = "Allow Access from Web Server"
from_port = 2121
to_port = 2121
protocol = "tcp"
security_groups = [ aws_security_group.lab-web-security-group.id ]
}

tags = {
Name = "lab-database-security-group"
}
}

resource "aws_instance" "database-server" {
ami = "ami-0d6c66e2edef56378"
instance_type = "t3.micro"
subnet_id = aws_subnet.lab-private-subnet.id
security_groups = [ aws_security_group.lab-database-security-group.id ]

tags = {
Name = "database-server"
}
}

--

--