VPC, subnet & jalur keluar
Task di subnet privat tidak bisa menghubungi internet tanpa bantuan. Bagaimana kamu memberikan bantuan itu menentukan sebagian besar tagihan jaringanmu.
Intisari
- Task ECS di subnet privat, tanpa IP publik. RDS di subnet privat terpisah.
- Untuk menghubungi Midtrans dan Cloudflare API, task butuh NAT Gateway โ dan itu ditagih per jam dan per GB.
- VPC Endpoint untuk ECR, S3, Secrets Manager, dan CloudWatch memotong sebagian besar lalu lintas NAT.
- Security group saling merujuk, bukan memakai rentang CIDR.
- Dengan Cloudflare Tunnel, ALB publik hilang โ tapi NAT tetap dibutuhkan untuk lalu lintas keluar.
Tata letak
VPC 10.0.0.0/16
Subnet publik (3 AZ) 10.0.0.0/24, 10.0.1.0/24, 10.0.2.0/24
โโ ALB
โโ NAT Gateway
Subnet privat aplikasi (3 AZ) 10.0.10.0/24, 10.0.11.0/24, 10.0.12.0/24
โโ Task ECS
Subnet privat data (3 AZ) 10.0.20.0/24, 10.0.21.0/24, 10.0.22.0/24
โโ RDS writer
โโ RDS reader
โโ ElastiCache
Tiga Availability Zone, bukan dua. Dengan dua AZ, kehilangan satu berarti kehilangan setengah kapasitasmu โ dan autoscaling butuh menit untuk menggantinya. Dengan tiga, kehilangan satu berarti kehilangan sepertiga, yang biasanya masih di dalam margin. Subnet tidak berbiaya; yang berbiaya adalah NAT Gateway di dalamnya.
Security group yang saling merujuk
# SG untuk task ECS: hanya menerima dari ALB
aws ec2 authorize-security-group-ingress \
--group-id sg-portal-web \
--protocol tcp --port 4321 \
--source-group sg-portal-alb
# SG untuk RDS: hanya menerima dari task ECS
aws ec2 authorize-security-group-ingress \
--group-id sg-portal-db \
--protocol tcp --port 3306 \
--source-group sg-portal-web
Merujuk security group, bukan CIDR. Dengan --source-group, aturannya berarti
"apa pun yang memakai security group itu" โ dan tetap benar saat kamu menambah subnet, mengubah rentang
IP, atau menskalakan task. Aturan berbasis CIDR seperti 10.0.10.0/24 harus diperbarui
setiap kali topologi berubah, dan yang terlupa akan menghasilkan kegagalan koneksi yang membingungkan.
NAT Gateway: komponen yang tagihannya mengejutkan
| Komponen biaya | Sifatnya |
|---|---|
| Per jam per NAT Gateway | Dibayar meski tidak dipakai sama sekali |
| Per GB yang diproses | Termasuk lalu lintas ke layanan AWS lain |
| Ditambah egress internet biasa | Terpisah lagi |
Tiga NAT Gateway (satu per AZ), 24ร7:
biaya per jam ร 3 ร 730 jam = tetap, tiap bulan
+ setiap GB yang lewat = variabel
Yang lewat NAT tanpa VPC Endpoint:
- Menarik image dari ECR tiap deploy (ratusan MB ร jumlah task)
- Membaca secret dari Secrets Manager (tiap task start)
- Menulis log ke CloudWatch (TERUS-MENERUS)
- Panggilan ke Midtrans (kecil)
- Panggilan ke Cloudflare API (kecil)
Log ke CloudWatch lewat NAT adalah kebocoran biaya yang paling sering tidak disadari. Ia mengalir terus-menerus, dua puluh empat jam, dan tiap GB-nya ditagih dua kali: sekali oleh NAT dan sekali oleh CloudWatch. VPC Endpoint untuk CloudWatch Logs menghapus bagian NAT-nya sepenuhnya.
VPC Endpoint
# Gateway endpoint โ GRATIS. Pasang ini dulu.
aws ec2 create-vpc-endpoint --vpc-id vpc-xxx \
--service-name com.amazonaws.ap-southeast-3.s3 \
--route-table-ids rtb-priv-a rtb-priv-b rtb-priv-c
# Interface endpoint โ ditagih per jam per AZ, tapi biasanya lebih murah dari NAT
for s in ecr.api ecr.dkr secretsmanager logs; do
aws ec2 create-vpc-endpoint --vpc-id vpc-xxx \
--vpc-endpoint-type Interface \
--service-name com.amazonaws.ap-southeast-3.$s \
--subnet-ids subnet-priv-a subnet-priv-b subnet-priv-c \
--security-group-ids sg-portal-endpoints \
--private-dns-enabled
done
| Endpoint | Jenis | Menghemat |
|---|---|---|
| S3 | Gateway (gratis) | Layer image ECR disimpan di S3 โ ini besar |
| ECR API + DKR | Interface | Penarikan image tiap deploy |
| Secrets Manager | Interface | Tiap task start |
| CloudWatch Logs | Interface | Aliran log terus-menerus |
Endpoint S3 gratis dan memberi penghematan terbesar per rupiah. Layer image container disimpan di S3, jadi setiap penarikan image lewat endpoint ini alih-alih NAT. Kalau kamu hanya memasang satu endpoint, pasang yang ini.
Menghemat NAT lebih jauh
| Pilihan | Hemat | Risiko |
|---|---|---|
| Satu NAT Gateway, bukan tiga | Dua pertiga biaya tetap | Titik kegagalan tunggal lintas AZ |
| VPC Endpoint untuk semua layanan AWS | Sebagian besar lalu lintas | Nol |
| Cloudflare Tunnel | Biaya ALB | Nol; NAT tetap perlu |
| Kurangi verbositas log | Biaya NAT + CloudWatch | Lebih sedikit informasi saat menelusuri |
Untuk portal produksi, jangan turunkan ke satu NAT Gateway. Kalau AZ tempat NAT itu berada bermasalah, seluruh task di ketiga AZ kehilangan jalur keluar โ termasuk kemampuan menghubungi Midtrans, yang berarti pembayaran berhenti.
Kalau memakai Cloudflare Tunnel
Tanpa Tunnel:
Subnet publik : ALB, NAT Gateway
Subnet privat : task ECS
Dengan Tunnel:
Subnet publik : NAT Gateway saja
Subnet privat : task ECS + sidecar cloudflared
Tidak ada ALB. Tidak ada IP publik.
Kamu menghemat biaya ALB dan menghapus permukaan serangannya (Fase 8), tapi NAT tetap dibutuhkan โ
cloudflared membuka koneksi keluar ke Cloudflare, dan itu lewat NAT.
Verifikasi
# Dari dalam container yang sedang jalan
aws ecs execute-command --cluster portal --task <id> --container web \
--interactive --command "/bin/sh"
# Di dalamnya:
wget -qO- https://api.midtrans.com/v2/ping # harus bisa (lewat NAT)
nc -zv portal.abc.rds.amazonaws.com 3306 # harus bisa (SG)
wget -qO- http://169.254.169.254/ # metadata โ tidak lewat jaringan
# Berapa yang lewat NAT? Aktifkan VPC Flow Logs, lalu:
aws logs start-query \
--log-group-name /aws/vpc/flowlogs \
--start-time $(date -d '1 day ago' +%s) --end-time $(date +%s) \
--query-string 'fields @timestamp, srcAddr, dstAddr, bytes
| filter srcAddr like /^10\.0\.1[0-2]\./
| stats sum(bytes) as total by dstAddr
| sort total desc | limit 20'
Kueri ini memberitahumu ke mana lalu lintas keluarmu benar-benar pergi. Kalau alamat teratasnya milik layanan AWS, kamu punya VPC Endpoint yang belum dipasang โ dan penghematan yang tinggal diambil.
Latihan: pasang VPC Endpoint untuk S3 (gratis) dan CloudWatch Logs, lalu bandingkan metrik
BytesOutToDestination NAT Gateway sebelum dan sesudahnya selama 24 jam. Lalu jalankan kueri
Flow Logs di atas dan daftarkan tujuan teratasnya โ tiap layanan AWS di daftar itu adalah endpoint yang
belum kamu pasang.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.