AWS EC2 Auto Scaling With ALB Path Based Routing
Haloo semuanya, kali ini saya akan melanjutkan tulisan saya di artikel sebelumnya yaitu terkait AWS Application Load Balancer (ALB) yang dimana membahas terkait bagaimana mendistribusikan traffic menggunakan load balancer berdasarkan path routing yang telah ditentukan. Di artikel kali ini, saya akan coba untuk menulis tentang EC2 auto scaling dengan Application Load Balancing (ALB) yang sudah dibuat sebelumnya. Artikel ini merupakan lanjutan dari artikel AWS Application Load Balancer (ALB), sehingga jika kalian ingin mengikuti artikel ini, disarankan untuk mengikuti artikel sebelumnya.
Sebelum kita masuk ke tahap konfigurasi, marilah kita bahas sedikit tentang Auto Scaling. Jadi, apa yang dimaksud dengan Auto Scaling ?
AWS Auto Scaling memonitor aplikasi Anda dan secara otomatis menyesuaikan kapasitas untuk mempertahankan kinerja yang stabil dan dapat diprediksi dengan biaya serendah mungkin. (AWS Site Docs)
Jadi, sederhananya auto scaling ini akan memonitor aplikasi yang kita jalankan pada AWS dan memastikan kinerja dari aplikasi kita tetap optimal. Auto scaling akan otomatis meningkatkan resource ketika terdapat permintaan yang tinggi ke aplikasi kita dan akan menurunkan nya ketika permintaan nya sudah kembali normal. Umumnya terdapat dua jenis scaling yaitu horizontal scaling dan vertical scaling. Mari kita lihat terlebih dahulu perbedaan antara keduanya.
- Horizontal Scaling (Scale out): Jenis penskalaan (scaling )ini lebih mengarah ke penambahan atau pengurangan node (server) di suatu jaringan tertentu. Misalkan, awal pertama kali menjalankan aplikasi dengan hanya menggunakan satu node (server), kemudian ada momen dimana aplikasi menerima traffic yang tinggi. Nah, jika kita menggunakan horizontal scaling maka otomatis node (server) nya akan bertambah sesuai kebutuhan dan konfigurasi yang kita ditentukan dan hebat nya lagi, node (server) yang ditambahkan tadi akan otomatis dihapus ketika traffic pada aplikasi kembali normal. Untuk gambaranya dapat dilihat seperti dibawah.
- Vertical Scaling (Scale up): Berbeda dengan horizontal scaling, vertical scaling akan akan melakukan penskalaan pada sumber daya yang ada di satu server. Misalkan kita sudah menjalankan aplikasi kita di satu node (server) dengan memory 8 GB dan vCPU 2 cores, kemudian suatu ketika traffic dari aplikasi kita melonjak dan menyebabkan akses ke aplikasi melambat. Nah, jika menggunakan vertical scaling maka sumber daya dari node (server) tersebut yang akan diskalakan, misalkan yang awalnya memory 8GB menjadi 16GB atau 32GB dan vCPU menjadi 3 cores. Contohnya seperti pada gambar dibawah.
Okee, jadi diatas merupakan sedikit gambaran terkait auto scaling dan jenis-jenis nya.
Selanjutnya untuk memastikan konfigurasi ALB pada artikel AWS Application Load Balancer (ALB) masih berjalan, silahkan coba akses load balancer nya menggunakan alamat DNS masing-masing.
Oke, sekarang kita lanjut ke tahap konfigurasi auto scalling dan di artikel kali ini akan menggunakan jenis horizontal scaling. seperti biasa kita lihat terlebih dahulu architecture yang akan kita bangun. Kira-kira architecture nya terlihat seperti pada gambar dibawah.
Pertama, kita akan memodifikasi code untuk masing-masing services yang awalnya hanya melakukan sekali request menjadi loop request. Kurang lebih code nya seperti dibawah.
services/product.js (*before)
router.get('/', (req, res) => {
const filePath = path.join(__dirname, '../data.json');
const dumyData = fs.readFileSync(filePath);
const data = JSON.parse(dumyData);
res.json({
data
})
});
services/product.js (*after)
router.get('/', (req, res) => {
let dumyData;
const filePath = path.join(__dirname, '../data.json');
for (let i = 0; i <= 1000; i++){
dumyData = fs.readFileSync(filePath);
}
const data = JSON.parse(dumyData);
res.json({
data
})
});
services/checkout.js (*before)
router.get('/', (req, res) => {
const customer = "Customer 1";
const filePath = path.join(__dirname, '../data.json');
const dumyData = fs.readFileSync(filePath);
const data = JSON.parse(dumyData);
res.json({
"message": 'Successfully checkout the product',
"customer_name": customer,
"data": data[0]
})
});
services/checkout.js (*after)
router.get('/', (req, res) => {
let dumyData;
const customer = "Customer 1";
const filePath = path.join(__dirname, '../data.json');
for (let i = 0; i < 1000; i++) {
dumyData = fs.readFileSync(filePath);
}
const data = JSON.parse(dumyData);
res.json({
"message": 'Successfully checkout the product',
"customer_name": customer,
"data": data[0]
})
});
Atau full code nya dapat dilihat atau di clone di Github melalui laman berikut https://github.com/kusumaningrat/aws-alb-nodejs-example/tree/product dan https://github.com/kusumaningrat/aws-alb-nodejs-example/tree/checkout
Selanjutnya sekarang kita akan buat auto scaling group nya, namun pertama kita perlu stop atau terminate kedua instance sebelumnya yaitu product dan checkout dan membuat Launch template. Sederhana nya launch template ini dijadikan sebagai template untuk instance yang akan dibuat oleh auto scaling group.
Untuk melakukan terminate instance, centang checkbox pada list EC2 instances.
Kemudian klik dropdown Instance state dan pilih Terminate instance dan ketika muncul dialog konfirmasi, pilih Terminate.
Sehingga state dari EC2 instances pada list menjadi Terminated.
Selanjutnya, masih di Dashboard EC2, navigasi ke menu Launch Templates.
Langsung saja klik tombol Create launch template untuk membuat launch template baru.
Kemudian isikan detail dari launch template yang kita buat. Pertama isikan template name nya dengan nilai product-autoscale-template, version description dapat di isi bebas (sesuaikan ketentuan masing-masing) dan centang checkbox Provide guidance to help me set up a template that I can use with EC2 Auto Scaling.
Lanjut ke bagian Launch template contents, untuk OS nya pilih Ubuntu dengan versi Ubuntu Server 22.04 LTS dengan architecture 64-bit (x86).
Selanjutnya pada bagian Instance Type pilih t2.micro dan Key pair (login) pilih example (sesuaikan dengan nama key yang dibuat masing-masing).
Selanjutnya pada bagian pengaturan jaringan (Network Settings), untuk Subnet dibiarkan default (Don’t include in launch template) dan Firewall (security groups) pilih existing security group yang sudah dibuat sebelumnya yaitu dengan nama alb-security-group (sesuaikan nama security group masing-masing).
Kemudian klik Advanced network configuration dan atur Auto-assing public IP menjadi Enable.
Selanjutnya scroll kebawah dibagian Advanced details dan cari User data.
Kemudian, copy dan paste script untuk product pada directory script/product_userdata.sh di 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 product
git pull origin product
echo "Installing Dependencies"
npm install
echo "Instaling pm2"
sudo npm install pm2@latest -g
sudo pm2 start index.js
Jika sudah, klik tombol Create launch template untuk membuat template baru.
Diatas terlihat bahwa kita sudah berhasil membuat template dengan nama product-autoscale-template. Silahkan ulangi step diatas untuk membuat template dengan nama checkout-autoscale-template dan sesuaikan script nya. Sehingga akan terlihat dua template di dashboard.
Okee, sekarang kita lanjut buat auto scaling group nya. Masih di Dashboard EC2, navigasi ke menu Auto Scaling Groups di paling bawah.
Okee, jadi langsung saja kita buat auto scaling group baru dengan cara klik tombol Create Auto Scaling group.
Kemudian isikan nama auto scaling group nya yaitu product-autoscaling-group dan pilih product-autoscale-template pada Launch template dengan versi 1 (Default).
Jika sudah, klik tombol Next untuk melanjutkan konfigurasi.
Kemudian isikan konfigurasi Network nya sesuai dengan VPC yang sudah dibuat yaitu elb-vpc dengan subnet yaitu subnet-az1.
Jika sudah, klik tombol Next untuk melanjutkan konfigurasi.
Selanjutnya pada tahap ini, kita akan attach auto scaling nya ke target group dari load balancer yang sudah kita buat sebelumnya. Pilih Attach to an existing load balancer dan pilih product-tg seperti yang terlihat pada gambar dibawah.
Pada bagian Health Checks, centang checkbox Turn on Elastic Load Balancing health checks.
Selanjutnya pada bagian Configure group size and scaling policies, kita akan mengatur dan menentukan berapa jumlah instance yang kita inginkan untuk tetap tersedia, minimum dan maximum jumlah instance yang kita inginkan. Sebagai contoh disini untuk Desired Capacity dan Minimum nya 2 serta maximum nya 3. Artinya, setelah auto scaling nya dibuat, maka harus terdapat dua EC2 instance yang berjalan dan ketika terjadi traffic yang tinggi, maka auto scaling akan menambah jumlah instance nya menjadi tiga instance.
Selanjutnya pada bagian Scaling Policies kita akan menentukan apa yang menjadi acuan dari auto scaling group nya untuk mengambil keputusan dalam menambah ataupun mengurangi jumlah instance. Disini kita akan menggunakan rata-rata utilisasi penggunaan CPU pada instance untuk melakukan scaling.
Jika sudah, klik tombol Next hingga ke bagian Review.
Silahkan review hasil konfigurasi yang sudah dilakukan dan jika dirasa sudah sesuai, maka langsung saja klik tombol Create Auto Scaling Group.
Okee, selanjutnya kita akan membuat auto scaling group juga untuk service checkout dengan cara yang sama seperti tahap sebelumnya. Langsung saja klik tombol Create Auto Scaling Group.
Kemudian isikan nama auto scaling group nya yaitu checkout-autoscaling-group dan pilih checkout-autoscale-template pada Launch template dengan versi 1 (Default).
Jika sudah, klik tombol Next.
Kemudian pada tahap konfigurasi Network, pilih elb-vpc dengan subnet nya yaitu subnet-az2.
Jika sudah, klik tombol Next untuk melanjutkan konfigurasi.
Selanjutnya pada tahap konfigurasi load balancing, pilih Attach to an existing load balancer dan pilih checkout-tg seperti yang terlihat pada gambar dibawah.
Pada bagian Health Checks, centang checkbox Turn on Elastic Load Balancing health checks.
Selanjutnya untuk konfigurasi group size sama seperti sebelumnya yaitu Desired Capacity dan Minimum nya 2 serta maximum nya 3.
Konfigurasi Scaling Policies juga sama seperti sebelumnya yaitu dengan menggunakan rata-rata utilisasi penggunaan CPU dari EC2 instance untuk menentukan scaling.
Jika sudah, klik tombol Next hingga ke bagian Review.
Silahkan review hasil konfigurasi yang sudah dilakukan dan jika dirasa sudah sesuai, maka langsung saja klik tombol Create Auto Scaling Group.
Jika semuanya sudah selesai, maka akan terlihat dua auto scaling group di dashboard.
Untuk mengecek apakah instance nya sudah sesuai permintaan di tahap konfigurasi, silahkan buka menu Instances dan pastikan ada dua (2) instances yang running yaitu masing-masing memiliki satu instance untuk product dan checkout.
Okee, sekarang kita akan melakukan tahap pengujian untuk auto scaling. Pertama silahkan buka project yang sudah di download melalui github di tahap sebelumnya dan tambahkan script berikut ke dalam project tersebut.
tester/main.py
from multiprocessing import Pool
from requests import get
URL = 'http://nodejs-alb-621790754.ap-southeast-1.elb.amazonaws.com/product'
def send_request(val):
try:
while True:
res = get(f'{URL}', timeout=30)
data = res.json()
print('Sending request')
print(data)
except Exception as e:
print(e)
if __name__ == '__main__':
with Pool(50) as p:
p.map(send_request, URL)
Perhatikan pada URL untuk menyesuaikan dengan endpoint dari load balancer masing-masing.
Okee, jika sudah sekarang jalankan file tersebut menggunakan perintah berikut.
python tester/main.py
Scriptnya akan melakukan request ke endpoint load balancer nya secara loop seperti yang terlihat seperti gambar. Script ini guna untuk membebani server dimana service tersebut dijalankan.
Untuk melihat penggunaan CPU saat script tersebut dijalankan, silahkan balik ke menu Auto Scaling Groups dan pilih salah satu (misalkan disini product-autoscaling-group) dan pada detail auto scaling group pindah ke tab monitoring lalu pilih EC2.
Okee, dapat dilihat disini penggunaan CPU nya diatas dari yang kita tentukan yaitu dari 30 menjadi 38.3 penggunaan CPU saat ini. Ini artinya, scaling group akan secara otomatis menambah jumlah instance.
Kita perlu menunggu beberapa menit untuk auto scaling meluncurkan instance baru. Untuk melihat aktivitas dari auto scaling nya. Silahkan pindah ke tab Activity.
Dapat dilihat bahwa, tracking policy yang kita buat mendeteksi adanya traffic yang tinggi yang menyebabkan rata-rata penggunaan CPU lebih dari yang kita tentukan. Oleh karena itu, auto scaling group akan membuat instance baru lagi untuk product.
Jika kita lihat pada menu Instances, maka sekarang akan terdapat total 5 instances (3 untuk product dan 2 untuk checkout) di masing-masing AZ ap-southeast-1a (subnet-az1) dan ap-southeast-1b (subnet-az2).
Okee, sekarang coba stop script testing yang sebelumnya dijalankan melalui terminal vscode dengan cara menekan kombinasi keyboard ctrl + c atau kill terminal dengan klik tanda trash pada terminal dan lihat apa yang terjadi.
Yupss, auto scaling akan men-terminate kembali instance yang sudah ditambahkan ketika request menurun atau rata-rata utilitas penggunaan CPU nya dibawah 30. Tunggu beberapa saat, maka akan terlihat kembali hanya 4 instances yang tersedia.
Silahkan lakukan pengetesan yang sama juga pada endpoint /checkout untuk mengecek konfigurasi auto scaling group nya.
Jadi, itu merupakan salah satu implementasi untuk auto scaling pada AWS dengan pada EC2 instances. Sebenernya bisa juga pada services yang lain seperti Elastic Container Service (ECS) dan Lambda Function.
Thank you:)