โ† Semua pembelajaran / Laravel Nol โ†’ Enterprise
Fase 9 ยท Deploy di AWS

Autoscaling ECS

Penskalaan otomatis yang salah metrik lebih buruk daripada tidak ada sama sekali: ia menambah kapasitas terlambat, lalu menghapusnya tepat sebelum puncak berikutnya. Yang menentukan adalah memilih sinyal yang benar.

Intisari

  • Target tracking adalah bentuk yang paling sederhana dan paling tepat untuk kebanyakan kasus.
  • Untuk service web, ALBRequestCountPerTarget lebih baik daripada CPU.
  • Untuk worker antrean, skalakan dari panjang antrean, bukan dari CPU.
  • Naik cepat, turun lambat โ€” scale-in cooldown harus jauh lebih panjang daripada scale-out.
  • Task baru butuh waktu untuk menyala dan lulus health check; autoscaling bukan obat untuk lonjakan mendadak.

Target tracking untuk service web

aws application-autoscaling register-scalable-target \
  --service-namespace ecs \
  --resource-id service/portal/portal-web \
  --scalable-dimension ecs:service:DesiredCount \
  --min-capacity 2 --max-capacity 20

aws application-autoscaling put-scaling-policy \
  --policy-name web-request-count \
  --service-namespace ecs \
  --resource-id service/portal/portal-web \
  --scalable-dimension ecs:service:DesiredCount \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 800,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "ALBRequestCountPerTarget",
      "ResourceLabel": "app/portal-alb/abc/targetgroup/portal-web/def"
    },
    "ScaleOutCooldown": 60,
    "ScaleInCooldown": 300
  }'
MetrikCocok untukKelemahan
ALBRequestCountPerTargetService webTidak melihat permintaan yang mahal secara tidak wajar
ECSServiceAverageCPUUtilizationBeban terikat CPUAplikasi Laravel sering menunggu I/O โ€” CPU rendah padahal penuh
ECSServiceAverageMemoryUtilizationDeteksi kebocoranMemori jarang mencerminkan beban
Metrik kustom (panjang antrean)WorkerPerlu dipasang sendiri

Kenapa CPU sering menyesatkan untuk Laravel. Permintaan yang menunggu database atau API luar hampir tidak memakai CPU, tapi tetap menahan satu worker. Kamu bisa berada dalam kondisi setiap worker sibuk dan antrean permintaan mengular, sementara CPU menunjukkan 30% โ€” dan autoscaling berbasis CPU tidak melakukan apa-apa. Jumlah permintaan per target mengukur beban yang sebenarnya.

Worker antrean: skalakan dari panjang antrean

aws application-autoscaling put-scaling-policy \
  --policy-name worker-antrean \
  --service-namespace ecs \
  --resource-id service/portal/portal-worker \
  --scalable-dimension ecs:service:DesiredCount \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 100,
    "CustomizedMetricSpecification": {
      "MetricName": "ApproximateNumberOfMessagesVisible",
      "Namespace": "AWS/SQS",
      "Dimensions": [{ "Name": "QueueName", "Value": "portal-default" }],
      "Statistic": "Average"
    },
    "ScaleOutCooldown": 60,
    "ScaleInCooldown": 300
  }'

Metrik yang lebih baik lagi: backlog per task. "100 pesan menunggu" berarti hal berbeda saat ada 2 worker dibandingkan saat ada 20. Metrik kustom pesan_menunggu / jumlah_task menskalakan dengan benar di kedua ujung. Untuk memulai, panjang antrean saja sudah jauh lebih baik daripada CPU.

Naik cepat, turun lambat

Scale outScale in
Cooldown60 detik300 detik
Kalau salahBayar kapasitas berlebih sebentarKapasitas hilang tepat sebelum puncak berikutnya
Sikap yang tepatAgresifKonservatif

Asimetri ini disengaja. Biaya salah menambah task adalah beberapa sen; biaya salah mengurangi task adalah halaman yang lambat atau error saat lalu lintas kembali naik. Lalu lintas jarang naik dengan mulus โ€” ia bergelombang, dan penurunan yang terlalu cepat membuatmu terus tertinggal di setiap gelombang.

Penskalaan terjadwal

aws application-autoscaling put-scheduled-action \
  --service-namespace ecs \
  --resource-id service/portal/portal-web \
  --scalable-dimension ecs:service:DesiredCount \
  --scheduled-action-name pagi \
  --schedule "cron(30 22 * * ? *)" \
  --scalable-target-action MinCapacity=6,MaxCapacity=30

Untuk lalu lintas yang polanya bisa diperkirakan, penskalaan terjadwal mengalahkan yang reaktif. Kalau kamu tahu lalu lintas melonjak setiap pagi, menaikkan kapasitas minimum sepuluh menit sebelumnya jauh lebih baik daripada menunggu metrik memberi tahu โ€” karena saat metrik bergerak, penggunamu sudah lebih dulu merasakan lambatnya. Perhatikan zona waktu: cron di sini memakai UTC.

Batas yang sesungguhnya

Waktu yang dibutuhkanPerkiraan
Alarm CloudWatch bereaksi1โ€“3 menit
Fargate menyediakan task30โ€“60 detik
Kontainer menarik image (dengan cache)10โ€“30 detik
Aplikasi menyala dan lulus health check15โ€“45 detik
Total2โ€“5 menit

Konsekuensinya: autoscaling tidak menyelamatkanmu dari lonjakan mendadak. Artikel yang tiba-tiba viral menaikkan lalu lintas dalam hitungan detik, bukan menit. Yang melindungimu di jendela itu adalah kapasitas minimum yang memadai dan โ€” jauh lebih penting untuk situs konten โ€” cache CDN, yang menyerap lonjakan tanpa menyentuh satu pun task. Autoscaling menangani perubahan bertahap; CDN menangani yang mendadak.

Menghemat biaya

  1. Pakai Fargate Spot untuk service worker โ€” pekerjaannya bisa diulang, jadi gangguan bisa diterima.
  2. Jangan pakai Spot untuk service web kecuali kamu benar-benar siap dengan penggantian task mendadak.
  3. ARM (Graviton) lebih murah per unit performa; PHP berjalan baik di atasnya โ€” pastikan image dibangun untuk arm64.
  4. Turunkan kapasitas minimum di malam hari lewat penskalaan terjadwal.
  5. Compute Savings Plan untuk kapasitas dasar yang selalu berjalan.

Latihan: pasang target tracking berbasis ALBRequestCountPerTarget dengan target 800, lalu jalankan uji beban yang menaikkan lalu lintas bertahap. Catat berapa lama dari lonjakan sampai task baru benar-benar melayani permintaan โ€” angka itu adalah kapasitas cadangan yang harus selalu kamu siapkan.

Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.