AWS Application Load Balancing (ALB)

Kusuma Ningrat
14 min readSep 22, 2023

--

Di artikel sebelumnya, saya sudah mencoba untuk menulis terkait AWS Network Load Balancing. Di artikel ini saya akan coba melanjutkan terkait topic Elastic Load Balancing pada AWS, kali ini saya akan coba membahas terkait Application Load Balancing yang merupakan salah satu type dari Load Balancing di AWS. Untuk penjelasan terkait Application Load Balancing itu sendiri silahkan langsung merujuk ke artikel sebelumnya yaitu AWS Elastic Load Balancing.

Oke, seperti biasa sebelum kita mulai marilah kita liat terlebih dahulu architecture yang akan kita bangun pada artikel kali ini.

Terlihat pada gambar diatas bahwa kita akan menggunakan dua EC2 instance dengan subnet public dan multiple Availability Zone (AZ) yang akan berada di target group. Selain itu, kita juga akan menerapkan load balancer yaitu ALB path-based routing yang artinya setiap traffic yang masuk melalui load balancer akan berdasarkan URL path yang diberikan. Contohnya disini untuk path /product akan meneruskan traffic ke service product dan path /checkout ke service checkout yang masing-masing berada di EC2 Instance.

Di artikel kali ini, saya akan menggunakan VPC dan Subnet yang sama seperti pada artikel sebelumnya AWS Network Load Balancing sehingg kita tidak perlu membuat nya ulang.

Okee, sebelum memulai saya sudah menyiapkan simple project dengan menggunakan NodeJS yang dimana isinya terdapat dua services yaitu product dan checkout. Silahkan clone project nya di lokal komputer masing-masing https://github.com/kusumaningrat/aws-alb-nodejs-example. Selain itu disini kita akan menggunakan pm2 untuk menjalankan service NodeJS nya. Untuk lebih jelasnya terkait pm2, silahkan langsung saja baca di dokumentasi nya PM2 Quickstart.

Sekarang langsung saja kita mulai dengan pembuatan EC2 instance nya, disini kita akan membuat dua EC2 instance yaitu dengan instance name product dan checkout. Silahkan login terlebih dahulu ke AWS Management Console.

Kemudian silahkan pilih service EC2 pada Recently visited atau juga bisa melalui search bar dengan mengetika keyword EC2.

Pilih menu Instances pada EC2 Dashboard dan terlihat diatas bahwa saya belum memiliki Instance apapun. Okee, sekarang langsung saja kita buat instance nya yaitu dengan cara klik tombol Launch instances.

Selanjutnya isikan detail dari instance yang akan kita buat, pertama disini kita akan membuat instance denan nama product, Operting System (Amazon Machine Image) nya Ubuntu dengan architecture 64-bit (x86).

Kemudian di bagian instance type biarkan default (t2.micro) seperti pada gambar.

Selanjutnya untuk key pair silahkan pilih key pair yang sudah dibuat dengan nama example atau bisa membuat key pair yang baru. Disini saya akan menggunakan key pair yang sudah saya buat sebelumnya.

Kemudian pada bagian Network Settings klik tombol Edit untuk modifikasi pengaturan jaringan dari instance yang akan kita buat.

Pada bagian VPC, pilih VPC yang sudah kita buat sebelumnya dengan nama elb-vpc dan Subnet dengan nama subnet-az1. Selain itu juga untuk Auto-assign public IP atur menjadi enable agar instance yang kita buat memiliki IP publik.

Selanjutnya pada bagian Firewall (security groups), Pilih Create security group untuk membuat security group baru dengan nama alb-security-group beserta deskripsinya.

Selanjutnya di bagian Inbound Security Group Rules tambahkan rule baru agar dapat mengijinkan request HTTP dari client di internet ke server pada port 3000 (sesuai dengan port aplikasi yang kita buat) sehingga terlihat seperti berikut.

Selanjutnya pada bagian Advanced details scroll kebawah hingga menemukan textbox User data seperti yang terlihat pada gambar berikut.

Kemudian salinkan script dari project yang sudah di download/clone sebelumnya yang terdapat di directory script dengan nama file product_userdata.sh

#!/bin/bash
echo "Installing Node.js"
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
NODE_MAJOR=20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
sudo apt update
sudo apt install -y nodejs
node -v

echo "Cloning Project"
cd /home/ubuntu
git clone https://github.com/kusumaningrat/aws-alb-nodejs-example
cd aws-alb-nodejs-example/
git switch product
git pull origin product

echo "Installing Dependencies"
npm install

echo "Instaling pm2"
sudo npm install pm2@latest -g
sudo pm2 start index.js

Terdapat beberapa tahapan yang dilakukan script diatas, yaitu pertama akan menginstall package nodejs dengan versi 20, kemudian melakukan clone project dari github ke server dan yang terakhir menginstall package pm2 serta menjalankan service dari project tersebut menggunakan pm2.

Oke, jika sudah klik tombol Launch Instance dan tunggu beberapa saat untuk pembuatan instance nya.

Sampai tahap ini, kita sudah berhasil membuat instance dengan nama product. Selanjutnya kita buat instance lagi dengan nama checkout, langsung saja klik tombol Launch Instances.

Selanjutnya kita isikan informasi terkait nama instance, os yang digunakan dan architecture nya.

Kemudian pada bagian key pair, pilih key pair example sesuai dengan yang sudah kita buat sebelumnya.

Di bagian Network Settings klik tombol Edit untuk modifikasi pengaturan jaringan pada instance yang akan kita buat.

Pada bagian VPC, pilih VPC yang sudah kita buat sebelumnya dengan nama elb-vpc dan Subnet dengan nama subnet-az1. Selain itu juga untuk Auto-assign public IP atur menjadi enable agar instance yang kita buat memiliki IP publik.

Selanjutnya pada bagian Firewall (security groups), klik Select existing security group dan pilih security group yang sudah kita buat sebelumnya dengan nama alb-security-group.

Selanjutnya di bagian Advanced details scroll kebawah hingga menemukan textbox User data dan salinkan script pada directory script dengan nama file checkout_userdata.sh dari project yang sudah di clone.

#!/bin/bash

echo "Installing Node.js"
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
NODE_MAJOR=20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
sudo apt update
sudo apt install -y nodejs
node -v

echo "Cloning Project"
cd /home/ubuntu
git clone https://github.com/kusumaningrat/aws-alb-nodejs-example
cd aws-alb-nodejs-example/
git switch checkout
git pull origin checkout

echo "Installing Dependencies"
npm install

echo "Instaling pm2"
sudo npm install pm2@latest -g
sudo pm2 start index.js

Oke jika sudah, klik tombol Launch instance untuk melanjutkan proses pembuatan instance.

Sekarang kita akan coba akses service yang sudah dijalankan di server menggunakan ip public dari setiap instance. Untuk melihat ip public dari instance silahkan pilih instance tersebut dengan cara klik checkbox dari daftar instance.

Copy ip public dari instance tersebut kemudian paste dan buka di salah satu web browser dengan menambahkan informasi port dari aplikasi nya yaitu 3000 dan endpoint nya yaitu /product.

Lakukan hal yang sama untuk mengakses service checkout menggunakan ip dari instance checkout pada port 3000 dan endpoint nya /checkout.

Okeh, jadi disini kedua service nya sudah berjalan dengan baik di masing-masing instance. Sekarang kita akan lanjut untuk konfigurasi Load Balancer nya.

Pertama kita akan buat Target Groups untuk instance. Masih di menu Instances, scroll ke bawah hingga menemukan menu Target Grups.

Terlihat diatas kita belum memiliki target group, sekarang kita akan buat target group baru dengan cara klik tombol Create target group.

Terdapat dua bagian yang akan kita konfigurasi yaitu pertama detail dari target groups nya dan mendaftarkan instance (target) untuk target group yang kita buat.

Pertama untuk target type nya kita pilih Instances karna service yang kita punya berjalan di EC2 Instance dan nama target group nya yaitu product-tg.

Kemudian pada bagian dropdown VPC pilih elb-vpc sesuai dengan yang sudah kita buat serta Protocol nya HTTP dengan port 3000 dan protocol version nya yaitu HTTP1.

Jika sudah, biarkan pengaturan lainnya default dan klik tombol Next.

Terlihat diatas terdapat dua instances yaitu product dan checkout, karna saat ini kita membuat target group untuk instance product maka pilih product dan klik tombol Include as pending below.

Jika sudah, makan pada bagian Review targets akan terlihat satu instance yang sudah kita daftarkan yaitu instance product.

Oke, setelah itu langsung saja klik tombol Create target group.

Sekarang lakukan hal yang sama untuk membuat target group untuk instance checkout. Langsung saja klik tombol Create target group.

Kemudian pilih target group type nya Instances dan nama target group nya checkout-tg.

Selanjutnya untuk VPC, pilih elb-vpc dan protocol nya HTTP dengan port 3000 serta protocol version HTTP1.

Jika sudah, biarkan pengaturan lainnya secara default dan klik tombol Next.

Kemudian pilih instance checkout kemudian klik tombol Include as pending below untuk mendaftarkan instance ke target group yang akan kita buat.

Jika sudah, kemudian silahkan lihat pada bagian Review targets yang mana akan terdapat satu instance yaitu checkout.

Oke, setelah itu klik tombol Create target group untuk melanjutkan proses pembuatan target group baru.

Selanjutnya kita akan buat satu target group lagi dengan nama main-tg dengan instance product. Tujuan nya agar ketika user mengakses URL load balancer yang kita buat nantinya dan tidak mendefinisikan endpoint nya seperti /product dan /checkout maka akan diarahkan ke homepage. Langsung saja klik tombol Create target group.

Kemudian pada bagian dropdown VPC pilih elb-vpc sesuai dengan yang sudah kita buat serta Protocol nya HTTP dengan port 3000 dan protocol version nya yaitu HTTP1.

Jika sudah, biarkan pengaturan lainnya default dan klik tombol Next.

Pilih instance product dan klik tombol Include as pending below.

Jika sudah, makan pada bagian Review targets akan terlihat satu instance yang sudah kita daftarkan yaitu instance product.

Oke, setelah itu langsung saja klik tombol Create target group.

Dapat dilihat bahwa sekarang kita sudah berhasil membuat tiga target groups. Namun coba perhatikan kolom Load balancer, disana keterang nya None associated yang artinya target groups tersebut belum di asosiasikan ke load balancer manapun. Oleh karena itu, sekarang kita lanjut untuk membuat load balancer nya.

Pertama, buka dashboard load balancer nya dengan cara pilih menu Load Balancers.

Langsung saja kita buat baru dengan cara klik tombol Create load balancer.

Terlihat diatas terdapat tiga type load balancer yaitu Application Load Balancer, Network Load Balancer dan Gateway Load Balancer. Langsung klik tombol create pada Application Load Balancer.

Kemudian kita langsung saja isikan informasi dari load balancer nya pada Basic configuration dengan mengatur nama load balancer yaitu nodejs-alb, schema nya Internet-facing karena akan menerima request dari internet dan type IP nya IPv4.

Selanjutnya pada bagian Network mapping, pilih VPC yang sudah dibuat yaitu elb-vpc dengan availability zone ap-southeast-1a (apse1-az1) dan ap-southeast-1b (apse1-az2).

Selanjutnya untuk Security Groups disini saya sudah membuat security group baru dengan nama webserver yang memiliki rules untuk SSH di port 22 dan HTTP request di port 80 dari internet.

Jika belum membuat security group dengan rules tersebut, silahkan buat security group baru dengan klik link create a new security group dan silahkan sesuaikan rules nya seperti yang sudah saya buat.

Selanjutnya pada Listeners and routing bagian Forward to pilih main-tg sebagai target groups nya.

Jika sudah, klik tombol Create load balancer untuk melanjutkan proses pembuatan.

Oke disini kita sudah berhasil membuat Load Balancer dengan nama nodejs-alb, pertanyaan nya, sekarang apakah kita sudah bisa melakukan testing ? bisa saja, akan tetapi hanya satu endpoint saja yang dapat diakses yaitu root endpoint nya atau homepage. Kalo penasaran, langsung saja klik load balancer nya kemudian salin nilai DNS Name dari load balancer tersebut. Namun sebelum itu, pastikan State dari load balancer nya Active.

Sekarang coba tambahkan misalnya untuk /checkout dan gimana hasilnya ?

Yupss, maka akan muncul pesan Cannot GET /checkout. Itu artinya karena endpoint /checkout belum kita tambahkan pada load balancer nya. Oke, sekarang kita coba tambahkan pada tab Listeners and rules.

Akan terdapat satu rules di dalamnya. Kemudian pilih rules tersebut dan klik dropdown Manage rules -> Edit Rules.

Oke terlihat bahwa hanya ada satu rules Default. Sekarang kita buat rule baru dengan cara klik tombol Add rule.

Kemudian isika nama aturan nya (rule) dengan nilai product dan klik tombol Next.

Sekarang kita akan buat condition untuk rule nya yaitu dimana agar ketika user mengakses load balancer nya dengan endpoint /product, maka akan di teruskan ke target group product-tg yang mana isinya adalah instance product. Langsung saja klik tombol Add condition.

Karna disini kita akan mengakses load balancer berdasarkan path, maka di bagian condition types pilih Path dan isikan isValue nya dengan nilai /product.

Jika sudah, silahkan klik tombol Confirm untuk melanjutkan proses pembuatan kondisi.

Maka akan terlihat satu kondisi yang sudah kita buat tadi. Klik tombol Next.

Selanjutnya di bagian Actions Type, pilih Forward to target groups dan pilih target group dengan nama product-tg sesuai dengan rule yang akan kita buat.

Kemudian priority untuk rule product kita akan kasih nilai 5 untuk priority nya. Priority disini maksudnya, ketika request masuk melalui load balancer maka rule dengan priority yang lebih kecil akan diberikan beban terlebih dahulu. Semakin kecil nilai priority pada rule maka akan lebih cepat di evaluasi.

Setelah itu, silahkan review rule yang akan dibuat dan jika dirasa sudah tepat langsung saja klik tombol Create.

Oke dengan cara yang sama seperti diatas, kita juga akan menambahkan rule untuk checkout. langsung saja klik tombol Add rule.

Kemudian isika nama aturan nya (rule) dengan nilai checkout dan klik tombol Next.

Sekarang kita akan buat condition untuk rule nya agar ketika user mengakses load balancer nya dengan endpoint /checkout akan di teruskan ke target group checkout-tg yang isinya adalah instance checkout. Langsung saja klik tombol Add condition.

Karna disini kita akan mengakses load balancer berdasarkan path, maka di bagian condition types pilih Path dan isikan isValue nya dengan nilai /checkout.

Jika sudah, silahkan klik tombol Confirm untuk melanjutkan proses pembuatan kondisi.

Maka akan terlihat satu kondisi yang sudah kita buat tadi. Klik tombol Next.

Selanjutnya di bagian Actions Type, pilih Forward to target groups dan pilih target group dengan nama product-tg sesuai dengan rule yang akan kita buat.

Kemudian priority untuk rule product kita akan kasih nilai 10.

Setelah itu, silahkan review rule yang akan dibuat dan jika dirasa sudah tepat langsung saja klik tombol Create.

Oke disini terlihat kita sudah memiliki tiga rule sesuai dengan yang sudah kita buat sebelumnya.

Siipp, sekarang saatnya kita melakukan pengujian. Seperti pada langkah sebelumnya salin nilai DNS Name dari load balancer nya dan buka di browser.

Sekarang coba tambahkan /product di akhir url nya.

Okehh sudah aman, sekarang coba juga tambahkan /checkout di akhir url.

Yeyyy!! sekarang kita sudah bisa mengakses kedua service nya menggunakan load balancer dengan metode path-based routing.

Jadi, itu merupakan cara membuat Application Load Balancer berdasarkan path. Silahkan teman-teman bisa juga menggunakan aplikasi lain dengan bahasa pemrograman yang lain juga sesuai dengan kebutuhan masing-masing:)

--

--

Kusuma Ningrat

I spend a lot of time in front of Computer to stay alive and to keep cloud's blue.