Kalau lo udah ngikutin artikel pertama, sekarang servicenya udah jalan di belakang ALB. Tapi setupnya masih basic masih HTTP dan baru satu service.
Di artikel ini gua bahas setup ALB yang lebih nyata dari pengalaman di production:
- HTTPS dengan SSL (Wildcard) yang dibeli sendiri, bukan dari ACM gratis
- Satu ALB untuk banyak service sekaligus
- Routing berdasarkan subdomain via host header
- CNAME di Google Cloud DNS
Kenapa Satu ALB untuk Banyak Service?
ALB itu billingnya per jam, bukan per service. Jadi kalau lo punya 5 service dan masing-masing pake ALB sendiri, lo bayar bakal mahal banget itu wkwk.
Pake satu ALB, lo bisa handle banyak service sekaligus lewat listener rules. app1.domain.com ke service A, app2.domain.com ke service B, semua lewat satu ALB yang sama.
Ini yang gua pake di production dan ini yang paling worth buat setup dari awal.
Step 1: Beli SSL dan Import ke ACM
Kebanyakan artikel yang ada pake SSL gratis dari ACM langsung. Tapi kalau lo beli domain di IDCloudhost, NiagaHoster, RumahWeb atau provider lokal lain dan mau pake SSL yang lo beli sendiri, caranya beda.
Format yang Dibutuhin ACM
Waktu import SSL ke ACM, lo butuh tiga hal:
-
Certificate body: file
.crtatau.pemdari SSL lo -
Private key: file
.keyyang lo generate waktu request SSL - Certificate chain: file intermediate/bundle dari provider SSL lo
Kalau lo beli SSL di third party, biasanya lo dapat file zip yang isinya ketiga file itu. ada yang harus diminta lewat open ticket ada yang baisanya udah include langsung di service SSL, pokoknya tergantung dari third party lo. Pastiin lo nyimpen private keynya waktu generate CSR karena ACM bakal minta itu waktu import.
Cara Import ke ACM
Masuk ke AWS Console > Certificate Manager > Import certificate:
- Paste isi file certificate body ke kolom Certificate body
- Paste isi private key ke kolom Certificate private key
- Paste isi certificate chain ke kolom Certificate chain
- Klik Next, kasih tag kalau mau, lalu Import
Setelah berhasil, status certificate lo bakal Issued. Kalau statusnya Pending validation, itu berarti lo pake request ACM bukan import, pastiin lo pilih yang import.
Catatan: Private key itu sensitif. Jangan pernah commit ke repository atau share ke siapapun.
Step 2: Buat Target Group per Service
Sebelum setup ALB, lo harus siapin target group dulu untuk setiap service yang mau lo expose.
Masuk ke EC2 > Target Groups > Create target group:
- Target type: IP (wajib untuk ECS Fargate karena networkMode awsvpc)
- Protocol: HTTP
-
Port: sesuaikan dengan port container lo, misalnya
50011untuk service A,50012untuk service B - VPC: pilih VPC yang sama dengan ECS service lo
- Health check protocol: HTTP
-
Health check path: endpoint health check lo, misalnya
/api/v1/health
Ulangi untuk setiap service yang mau lo attach ke ALB.
Soal Health Check Path
Ini yang sering bikin orang nyangkut. Health check path harus return status 200. Kalau lo belum punya endpoint health check di NestJS lo, bikin dulu yang simpel:
@Get('health')
health() {
return { status: 'ok' };
}
Kalau health check gagal, ALB bakal terus drain dan replace task lo tanpa henti.
Step 3: Buat ALB dan Setup Listener 443
Buat ALB
Masuk ke EC2 > Load Balancers > Create > Application Load Balancer:
- Name: kasih nama yang deskriptif
- Scheme: Internet-facing
- IP address type: IPv4
- VPC: pilih VPC yang sama dengan ECS lo
- Subnets: pilih minimal 2 public subnet di AZ yang berbeda, ini wajib
-
Security group: buat security group baru yang allow inbound port 443 dari
0.0.0.0/0
Buat Listener 443
Di bagian Listeners waktu buat ALB:
- Protocol: HTTPS
- Port: 443
- Default SSL/TLS certificate: pilih certificate yang baru lo import di Step 1
- Default action: untuk sekarang pilih "Return fixed response" dengan status 404, nanti lo ganti waktu tambah rules
Klik Create load balancer.
Step 4: Setup Listener Rules by Host Header
Ini inti dari artikel ini. Listener rules yang nentuin subdomain mana routing ke service mana.
Masuk ke EC2 > Load Balancers > pilih ALB lo > tab Listeners > klik View/edit rules di listener 443.
Tambah Rule per Service
Klik Add rule untuk setiap service:
Rule untuk app1.domain.com: // GANTI INI
-
Condition: Host header =
app1.domain.com -
Action: Forward to target group
app1-target-group - Priority: 1
Rule untuk app2.domain.com: // GANTI INI
-
Condition: Host header =
app2.domain.com -
Action: Forward to target group
app2-target-group - Priority: 2
Ulangi untuk setiap service yang lo punya.
Default Rule
Default rule itu yang jalan kalau request masuk tapi ga match sama rule manapun. Jangan dibiarkan kosong atau error, kasih fixed response 404 atau redirect ke halaman utama lo.
Penting: Urutan priority itu ngaruh. ALB ngecheck rules dari priority terkecil ke terbesar. Kalau ada dua rules yang bisa match, yang prioritynya lebih kecil yang menang.
Step 5: CNAME di Google Cloud DNS
Ini yang beda dari semua artikel lain yang pake Route53. Lo tinggal point subdomain lo ke ALB DNS name.
Ambil ALB DNS Name
Masuk ke EC2 > Load Balancers > pilih ALB lo. Di bagian bawah lo bakal liat DNS name, formatnya kira-kira:
nama-alb-lo-1234567890.ap-southeast-1.elb.amazonaws.com
Tambah CNAME di Google Cloud DNS
Masuk ke Google Cloud Console > Network Services > Cloud DNS > pilih zone domain lo:
- Klik Add record set
-
DNS name:
app1(ini subdomain lo, jadi fullnya jadiapp1.domain.com) - Resource record type: CNAME
- TTL: 300 (5 menit cukup buat testing)
- Canonical name: paste ALB DNS name lo di sini
- Klik Create
Ulangi untuk setiap subdomain yang lo punya.
Tunggu beberapa menit untuk DNS propagation, biasanya 5 menit kalau TTL lo 300.
Step 6: Attach Target Group ke ECS Service
Kalau ECS service lo belum di-attach ke target group yang baru lo buat, lo perlu update servicenya.
Masuk ke ECS > cluster lo > service > Update service:
- Di bagian Load balancing, tambah target group yang sesuai
- Pastiin container name dan port match sama yang ada di task definition lo
Setelah update, ECS bakal register task yang jalan ke target group tersebut.
Step 7: Verifikasi
Setelah DNS propagation selesai, cek satu-satu:
-
Target Group di console, pastiin health check statusnya
healthy. Kalau masihinitialtunggu beberapa menit, kalauunhealthycek health check path lo -
Akses via browser, buka
https://app1.domain.comdan pastiin HTTPSnya valid dan app lo respond - Cek certificate, klik ikon gembok di browser, pastiin certificate yang kepakai itu yang lo import tadi
Kalau HTTPSnya invalid atau browser bilang "certificate not trusted", kemungkinan certificate chain lo waktu import belum lengkap.
Lessons Learned
Beberapa hal yang gua pelajarin dari setup ini di production:
1. Urutan listener rules itu ngaruh
ALB ngecheck dari priority terkecil. Kalau lo punya wildcard rule kayak *.domain.com, taruh di priority paling besar supaya ga nutup rules yang lebih spesifik.
2. Default rule jangan dikosongkan
Kalau ada request yang masuk ke ALB tapi ga match rule manapun, default rule yang handle. Kasih fixed response 404 daripada biarkan error ga jelas.
3. Health check path harus konsisten
Gua pernah ganti path health check di code tapi lupa update di target group. Hasilnya task terus-terusan di-replace sama ECS karena ALB nganggep servicenya unhealthy.
4. Certificate chain harus lengkap
Waktu import SSL ke ACM, certificate chain itu wajib. Kalau lo skip atau paste yang salah, browser bakal bilang certificate not trusted meskipun SSL lo valid.
5. TTL DNS waktu testing
Set TTL ke 300 dulu waktu testing. Kalau lo set terlalu tinggi dan ada yang salah, lo harus nunggu lama banget sampai DNS update.
6. Satu service satu target group, jangan dicampur
Gua pernah kena kasus aneh, refresh page di app1.domain.com tapi responsenya bergantian dari dua service yang berbeda. Ternyata penyebabnya dua ECS service lo attach ke target group yang sama. ALB by default distribusi traffic secara round robin ke semua task yang registered di target group tersebut. Jadi request pertama ke service A, request kedua ke service B, terus bergantian. Solusinya simpel: satu service harus punya satu target group tersendiri.
7. Satu ALB bisa handle banyak certificate
Kalau lo punya beberapa domain yang berbeda (bukan subdomain), ALB support multiple certificate via SNI. Lo bisa import beberapa SSL dan attach ke listener yang sama.
Penutup
Setelah setup ini selesai, lo punya satu ALB yang handle semua service lo dengan HTTPS yang proper. Tiap kali mau tambah service baru, tinggal:
- Buat target group baru
- Tambah listener rule baru di ALB
- Tambah CNAME baru di Google Cloud DNS
- Attach target group ke ECS service
Ga perlu buat ALB baru, ga perlu beli SSL baru selama domainnya masih sama.
Kalau ada pertanyaan drop di komentar, gua jawab sesuai pengalaman gua.
Top comments (0)