โ† Semua pembelajaran / Go Nol โ†’ Enterprise
Fase 10 ยท Deploy di AWS

Application Load Balancer

ALB menerima TLS, memilih target sehat, dan meneruskan permintaan. Sebagian besar masalah "502 acak" dan "beberapa permintaan gagal setiap deploy" berasal dari ketidakcocokan antara setelan ALB dan setelan aplikasi Go-mu.

Intisari

  • IdleTimeout aplikasi harus lebih besar daripada idle timeout ALB โ€” kalau tidak, 502 acak.
  • Deregistration delay harus โ‰ฅ durasi permintaan terpanjang, dan sejalan dengan graceful shutdown.
  • Health check target group menunjuk endpoint yang tidak menyentuh database.
  • Algoritma least outstanding requests biasanya lebih baik daripada round-robin untuk API.
  • ALB menerima trafik hanya dari CloudFront di depan situs publik โ€” batasi lewat security group atau header rahasia.

Setelan yang harus selaras

Setelan ALBNilaiHarus selaras dengan
Idle timeout60 dtkIdleTimeout Go = 65 dtk (lebih besar)
Deregistration delay30 dtkโ‰ฅ permintaan terpanjang; โ‰ค stopTimeout ECS
Health check interval10 dtkinterval ร— ambang < jeda tidur shutdown
Healthy threshold2โ€”
Unhealthy threshold2โ€”
Health check timeout5 dtk< interval
Health check path/sehatTidak menyentuh database

Baris pertama menjelaskan hampir semua "502 acak". Kalau server Go menutup koneksi keep-alive lebih dulu daripada ALB menyadarinya, ALB bisa mengirim permintaan ke koneksi yang sedang ditutup โ€” dan hasilnya 502 untuk pengguna sungguhan, dengan log aplikasi yang bersih total karena permintaannya memang tidak pernah sampai. Aturannya: IdleTimeout aplikasi selalu beberapa detik lebih besar daripada idle timeout ALB (Fase 3).

Anatomi deploy tanpa 502

t=0    ECS memulai task baru
t=15   Task baru lolos health check (2 ร— 10 dtk) โ†’ didaftarkan ke target group
t=15   ALB mulai mengirim trafik ke task baru
t=15   ECS mengirim SIGTERM ke task lama
t=15   Task lama: /siap membalas 503 (readiness)
t=25   ALB menandai task lama unhealthy โ†’ berhenti mengirim permintaan BARU
t=25   Task lama mulai srv.Shutdown() โ†’ selesaikan yang sedang berjalan
t=45   Deregistration delay habis; task lama sudah keluar
t=45   โœ… nol permintaan yang terpotong
Kalau salahGejalanya
Deregistration delay terlalu pendekPermintaan yang sedang berjalan terpotong saat deploy
Aplikasi tidak punya readinessALB mengirim permintaan ke task yang sedang mati
stopTimeout < graceful shutdownSIGKILL memotong transaksi di tengah
Health check terlalu lambat mendeteksiTrafik terus dikirim ke task yang sudah menutup
Task baru terdaftar sebelum siap503 di awal deploy

Algoritma penyeimbangan

AlgoritmaCocok untuk
Round robinPermintaan berdurasi seragam
Least outstanding requestsAPI dengan durasi bervariasi โ€” mencegah task lambat kebanjiran
Weighted randomDistribusi khusus

Header yang ditambahkan ALB

X-Forwarded-For     : IP klien (bisa berupa rantai)
X-Forwarded-Proto   : https
X-Forwarded-Port    : 443
X-Amzn-Trace-Id     : Root=1-63f...  โ† untuk X-Ray dan korelasi log
// Ambil IP klien dengan benar: hitung dari KANAN sebanyak proxy
// tepercayamu. Elemen paling kiri bisa diketik sendiri oleh klien (Fase 6).
func ipKlien(r *http.Request, jumlahProxy int) string { ... }

// Jejak ALB layak dicatat: ia yang menghubungkan log aplikasimu
// dengan log akses ALB.
log.InfoContext(ctx, "permintaan",
	"amzn_trace_id", r.Header.Get("X-Amzn-Trace-Id"))

Membatasi ALB hanya menerima dari CloudFront

Tanpa pembatasan, penyerang bisa memanggil ALB LANGSUNG dan melewati:
  โ€ข aturan AWS WAF yang dipasang di CloudFront
  โ€ข cache CDN (sehingga setiap permintaan menembus ke origin)
  โ€ข pembatasan geografis

Dua cara membatasinya:

  A. Security group yang merujuk daftar prefix terkelola CloudFront
     (com.amazonaws.global.cloudfront.origin-facing)

  B. Header rahasia bersama: CloudFront menambahkan X-Origin-Verify,
     ALB listener rule menolak permintaan tanpa nilai yang benar

Aturan listener

Prioritas 1  Host: api.contoh.id           โ†’ target group toko-api
Prioritas 2  Path: /admin/*                โ†’ target group toko-admin
Prioritas 3  Header: X-Origin-Verify salah โ†’ 403 tetap
Default                                     โ†’ target group toko-server

HTTP :80 โ†’ redirect permanen ke HTTPS :443

ALB memakai kuota bersama: 100 aturan per listener, 5 kondisi per aturan. Untuk routing yang lebih rumit dari itu, lakukan di aplikasi โ€” router Go-mu (Fase 3) jauh lebih fleksibel, bisa diuji, dan ikut ke dalam git.

Metrik ALB yang layak dialarmkan

MetrikArtinya
HTTPCode_ELB_5XX_CountALB sendiri yang gagal โ€” biasanya tidak ada target sehat
HTTPCode_Target_5XX_CountAplikasimu yang membalas 5xx
TargetResponseTime p95/p99Latensi sungguhan yang dirasakan pengguna
UnHealthyHostCount> 0 secara berkelanjutan = masalah
RejectedConnectionCountBatas koneksi tercapai
TargetConnectionErrorCountKetidakcocokan idle timeout

Bedakan dua metrik 5xx pertama saat insiden. ELB_5XX berarti masalahnya di lapisan load balancer โ€” biasanya semua target dinyatakan tidak sehat. Target_5XX berarti aplikasimu berjalan dan membalas error. Keduanya butuh tindakan yang sama sekali berbeda.

Latihan: setel idle timeout ALB ke 60 detik dan IdleTimeout Go ke 30 detik, lalu kirim permintaan berulang lewat koneksi keep-alive selama beberapa menit โ€” cari 502 di log akses ALB. Naikkan IdleTimeout Go ke 65 dan ulangi.

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