Di bagian ini saya ingin menunjukkan cara untuk menambahkan autoscaling pada kode yang sudah kita buat di bagian sebelumnya.

Kenapa kita harus menggunakan autoscaling? Alasan adalah agar kita bisa melayani semua pengunjung yang datang ke aplikasi kita dengan biaya yang optimal.

Gambar di bawah menunjukkan pola jumlah kunjungan pengguna ke situs-situs belanja seperti Amazon.com. Biasanya jumlah pengunjung akan mencapai puncaknya pada siang hari, kemudian menurun di malam hari.

Pola jumlah pengunjung.
(Credit: Scaling Up to Your First 10 Millions presentation)

Agar kita bisa melayani pengguna tanpa ada masalah, kita harus meyakinkan jumlah server yang kita cukup besar, sehingga tidak ada pengguna yang tidak bisa mengakses aplikasi. Tanpa ada cloud, jika kita membutuhkan 5 server agar bisa melayani puncak jumlah pengguna, maka server tersebut harus kita nyalakan juga pada saat jumlah pengguna di titik terkecil.

Bayangkan jika Anda harus melayani beban pengguna pada saat waktu-waktu spesial saat pengguna melonjak lebih tinggi dari biasanya, seperti hari raya Lebaran atau hari raya Natal.

Pola jumlah pengunjung mendekati hari Natal.

Akan sangat tidak efisien jika kita harus membeli dan mengelola server sangat banyak untuk dinyalakan sepanjang tahun demi melayani lonjakan yang hanya terjadi sekali dua kali.

Dengan adanya fitur Autoscaling di AWS Cloud, kita bisa melakukannya secara lebih optimal. Kita bisa menyalakan server saat pengguna melonjak, dan bisa mematikan jika jumlah pengguna menurun.

Ilustrasi Penambahan Task Saat Trafik Normal dan Meningkat

Penggunaan task secara efisien ini akan menyebabkan penghematan biaya. Dalam ilustrasi di bawah, kita bisa menghemat hingga 70% dengan menyesuaikan task sesuai kebutuhan.

Sekarang kita kembali ke implementasi melanjutkan tutorial sebelumnya. Perlu diingat bahwa class ApplicationLoadBalancedFargateService adalah abstraksi yang mengenkapsulasi banyak construct di bawahnya.

const fargateService = new ecsPatterns.ApplicationLoadBalancedFargateService(this, 'Service', {
    cluster: ecsCluster,
    taskImageOptions: {
       image: ecs.ContainerImage.fromAsset('.')
    },
});

Dengan kode di atas, kita bisa mengkonfigurasi autoscaling dengan beberapa baris kode.

const fargateService = new ecsPatterns.ApplicationLoadBalancedFargateService(this, 'Service', {
    cluster: ecsCluster,
    taskImageOptions: {
        image: ecs.ContainerImage.fromAsset('.')
    },
});

const autoScalingGroup = fargateService.service.autoScaleTaskCount({
    minCapacity: 2,
    maxCapacity: 10
});

Pada di atas kita akan mengambil object AutoScalingGroup dengan memanggil method autoScaleTaskCount dengan kapasitas task minimum 2 dan maksimum 10.

Autoscaling Berdasarkan Jadwal

Di kode di atas kita melakukan konfigurasi autoscaling dengan kapasitas minimum 2 task dan maksimum 10 task. Jumlah ini bisa disesuaikan dengan jumlah yang kita butuhkan dalam melayani pengguna. Saya menganjurkan jumlah minimum lebih dari 1 agar bisa tahan dari kegagalan (failure-tolerant).

Untuk fitur penjadwalan ini kita harus mengimpor dependensi @aws-cdk/aws-applicationautoscaling di package.json. Eksekusi npm install untuk menginstall dependensi tersebut.

  "dependencies": {
    "@aws-cdk/aws-ecr": "^1.15.0",
    "@aws-cdk/aws-ecs": "^1.15.0",
    "@aws-cdk/aws-ecs-patterns": "^1.15.0",
    "@aws-cdk/core": "^1.15.0",
    "@aws-cdk/aws-applicationautoscaling": "^1.15.0",
    "cdk": "^1.22.0",
    "source-map-support": "^0.5.9"
  }

Selanjutnya kita mengimpor di app.ts.

import appAutoscaling = require("@aws-cdk/aws-applicationautoscaling");

Kita tinggal menambahkan pemanggilan scaleOnSchedule pada objek autoScalingGroup. Umumnya penjadwalan yang biasa dilakukan adalah menambahkan task menjelang siang dan menurunkan task menjelang malam.

const autoScalingGroup = fargateService.service.autoScaleTaskCount({
    minCapacity: 2,
    maxCapacity: 10
});
autoScalingGroup.scaleOnSchedule('ScaleUpInMorning', {
    schedule: appAutoscaling.Schedule.cron({hour: '03', minute: '30'}),
    minCapacity: 10,
});
autoScalingGroup.scaleOnSchedule('ScaleDownInEvening', {
    schedule: appAutoscaling.Schedule.cron({hour: '10', minute: '00'}),
    maxCapacity: 5,
});

Sekarang kita menjadwalkan penambahan task dengan minimum 10 task pada pukul 3.30 waktu UTC atau 10.30 pagi waktu Jakarta. Penurunan task kita lakukan pada pukul 10 waktu UTC atau 5 sore waktu Jakarta dengan maksimal 5 task. Eksekusi cdk deploy untuk mengaplikasikan perubahan yang kita buat.

Jumlah task akan meningkat saat memasuki jadwal.

Autoscaling Berdasarkan Penggunaan CPU

Selain melakukan konfigurasi autoscaling berdasarkan jadwal, kita juga bisa mengkonfigurasi berdasarkan metrik lain seperti CPU utilization. Di sini kita mengasumsikan jika pengguna makin banyak maka CPU yang digunakan juga semakin besar.

autoScalingGroup.scaleOnCpuUtilization('CpuScaling', {
    targetUtilizationPercent: 50,
    scaleInCooldown: cdk.Duration.seconds(60),
    scaleOutCooldown: cdk.Duration.seconds(60),
});

Pada contoh ini, autoscaling akan berusaha menjaga agar CPU yang digunakan agar tetap di angka 50%. Jika berada di bawah 50% maka ECS akan melakukan scale in mengurangi jumlah task, dan sebaliknya jika berada di atas 50% maka akan menambah jumlah task. Parameter scaleInCoolDown dan scaleOutCoolDown adalah jumlah waktu untuk menunggu sebelum adanya proses scale out dan scale in.


Demikian penjelasan tentang auto scaling dan bagaimana cara menggunakannya pada Amazon ECS dengan AWS CDK. Saya menyarankan untuk mencoba-coba bereksperimen agar menemukan jumlah yang cocok dengan aplikasi yang akan dibangun. Jangan lupa mengeksekusi cdk destroy jika aplikasi percobaan ini sudah tidak digunakan.

Jika Anda mempunyai pertanyaan atau usul untuk topik selanjutnya, silakan tulis di bagian komentar.

Leave a comment

Leave a Reply

%d bloggers like this: