← Semua pembelajaran / Laravel Nol → Enterprise
Fase 9 · Deploy di AWS

Application Load Balancer

ALB adalah satu-satunya pintu masuk ke task-mu. Tiga setelannya — health check, deregistration delay, dan keep-alive — menentukan apakah pengguna melihat error saat kamu men-deploy.

Intisari

  • TLS berhenti di ALB; sertifikatnya dari ACM dan diperbarui otomatis.
  • Target group berisi task-task yang sehat; ALB hanya mengirim lalu lintas ke sana.
  • deregistration_delay memberi waktu permintaan yang sedang berjalan untuk selesai.
  • Keep-alive penting untuk worker mode — koneksi yang dibuka ulang menghapus sebagian keuntungannya.
  • Idle timeout ALB harus lebih pendek daripada timeout aplikasi, bukan sebaliknya.

Bentuk lalu lintas

internet
  │
  ├─ :80  → listener HTTP  → redirect 301 ke HTTPS
  └─ :443 → listener HTTPS (sertifikat ACM)
              │
              └─ target group "portal-web" (port 8000)
                   ├─ task 1  ✓ sehat
                   ├─ task 2  ✓ sehat
                   └─ task 3  ✗ tidak sehat → tidak dikirimi lalu lintas

Health check target group

Path                 : /up
Port                 : traffic-port
Protokol             : HTTP
Kode sukses          : 200
Interval             : 15 detik
Timeout              : 5 detik
Healthy threshold    : 2
Unhealthy threshold   : 3
SetelanTerlalu agresifTerlalu longgar
IntervalBeban tambahan yang tidak perluTask rusak tetap menerima lalu lintas lama
Unhealthy thresholdGangguan sesaat memicu penggantian taskTask rusak bertahan terlalu lama
TimeoutTask yang sedang sibuk dianggap matiDeteksi kegagalan jadi lambat

Health check yang terlalu agresif bisa menyebabkan kegagalan berantai. Saat lalu lintas melonjak dan semua task menjadi lambat, health check ikut lambat dan gagal. ALB mengeluarkan task-task itu, sehingga beban yang sama menimpa task yang lebih sedikit — yang lalu ikut gagal. Endpoint /up yang ringan dan tidak menyentuh database adalah pertahanan pertama terhadap pola ini.

Deregistration delay

deregistration_delay.timeout_seconds = 30

Saat sebuah task akan dihentikan, ALB berhenti mengirim permintaan baru ke sana, lalu menunggu selama nilai ini sebelum benar-benar memutuskannya. Tanpa jeda ini, permintaan yang sedang diproses akan terputus di tengah jalan — dan pengguna melihat 502.

NilaiAkibat
0 detikPermintaan berjalan terputus. Deploy selalu menghasilkan sejumlah 502
30 detikTitik awal yang baik untuk aplikasi web
300 detik (default)Aman, tapi deploy jadi sangat lambat

Nilai ini harus selaras dengan stopTimeout ECS. Urutan yang benar: ALB berhenti mengirim permintaan baru → menunggu deregistration delay → ECS mengirim SIGTERM → aplikasi menyelesaikan sisanya dalam stopTimeout. Kalau stopTimeout lebih pendek daripada deregistration delay, task dibunuh sebelum ALB selesai menunggu — dan jeda itu jadi sia-sia.

Keep-alive dan idle timeout

idle_timeout.timeout_seconds = 60          # ALB
routing.http.desync_mitigation_mode = defensive

Keep-alive penting untuk worker mode. Dokumentasi RoadRunner menyebut peningkatan performa sekitar 40% dengan koneksi keep-alive. ALB memakainya secara default terhadap target; yang perlu kamu pastikan adalah aplikasi tidak menutup koneksi lebih dulu. Sebagai aturan, idle timeout di sisi aplikasi harus lebih panjang daripada idle timeout ALB, supaya ALB yang memutuskan kapan koneksi berakhir — bukan aplikasi yang menutup koneksi yang sedang dipakai ALB, yang berakhir sebagai 502 sporadis.

Aturan listener

Prioritas 10  path /health/deep     → target group, hanya dari IP internal
Prioritas 20  host api.portal.com   → target group "portal-api"
Prioritas 30  path /horizon/*       → target group web (dilindungi juga di aplikasi)
Default       *                     → target group "portal-web"
# Listener HTTP: selalu alihkan ke HTTPS
:80 → redirect 301 → https://#{host}:443/#{path}?#{query}

Header yang diteruskan

HeaderIsinyaDibaca Laravel sebagai
X-Forwarded-ForIP asli klien$request->ip()
X-Forwarded-Protohttps$request->isSecure()
X-Forwarded-Port443URL yang dihasilkan
X-Amzn-Trace-IdID pelacakanBerguna untuk korelasi log
// bootstrap/app.php — tanpa ini, tautanmu memakai http:// dan rate limit salah sasaran
$middleware->trustProxies(at: '*');

Metrik yang perlu dipasangi alarm

MetrikArtinya
HTTPCode_Target_5XX_CountAplikasimu melempar error
HTTPCode_ELB_5XX_CountALB tidak menemukan target sehat — lebih serius
TargetResponseTime (p95)Latensi sesungguhnya yang dirasakan pengguna
UnHealthyHostCountTask yang dikeluarkan dari rotasi
RejectedConnectionCountALB mencapai batas koneksi
TargetConnectionErrorCountTask menutup koneksi lebih dulu — periksa keep-alive

Bedakan dua metrik 5XX yang pertama. Target_5XX berarti aplikasimu menjawab dengan error — ada bug. ELB_5XX berarti ALB sendiri tidak bisa mendapatkan jawaban — tidak ada target sehat, atau semuanya menolak koneksi. Yang kedua biasanya menandakan masalah deploy atau kapasitas, dan layak memicu alarm yang membangunkan orang.

Latihan: pasang ALB dengan health check ke /up dan deregistration_delay=30. Lalu jalankan curl berulang tiap 200 ms sambil memicu deploy, dan hitung berapa banyak respons non-200 yang muncul. Angka nol adalah target; angka selain itu berarti ada setelan yang belum selaras.

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