โ† Semua pembelajaran / Astro Nol โ†’ Portal Berita
Fase 10 ยท Deploy di AWS

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 biayaSifatnya
Per jam per NAT GatewayDibayar meski tidak dipakai sama sekali
Per GB yang diprosesTermasuk lalu lintas ke layanan AWS lain
Ditambah egress internet biasaTerpisah 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
EndpointJenisMenghemat
S3Gateway (gratis)Layer image ECR disimpan di S3 โ€” ini besar
ECR API + DKRInterfacePenarikan image tiap deploy
Secrets ManagerInterfaceTiap task start
CloudWatch LogsInterfaceAliran 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

PilihanHematRisiko
Satu NAT Gateway, bukan tigaDua pertiga biaya tetapTitik kegagalan tunggal lintas AZ
VPC Endpoint untuk semua layanan AWSSebagian besar lalu lintasNol
Cloudflare TunnelBiaya ALBNol; NAT tetap perlu
Kurangi verbositas logBiaya NAT + CloudWatchLebih 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.