ค้นพบต้นทุนคงที่ของ ECS Fargate (ALB + NAT Gateway) และการทบทวนสถาปัตยกรรม
บทนำ
ผมคิดว่า ECS Fargate คือ “จ่ายเฉพาะที่ใช้” แต่เมื่อรันจริงๆ พบว่ามีต้นทุนคงที่รายเดือนหลายพันบาทหรือมากกว่า
ตัวการคือ ALB (Application Load Balancer) และ NAT Gateway
ทำความเข้าใจโครงสร้างต้นทุน
ต้นทุน ECS Fargate แบ่งเป็น 2 ประเภทหลัก
ต้นทุนผันแปร (จ่ายตามที่ใช้)
| รายการ | หน่วยการเรียกเก็บ |
|---|---|
| Fargate container | vCPU & memory × เวลาทำงาน |
| RDS | เวลาทำงานของ DB instance |
ต้นทุนคงที่ (เรียกเก็บตลอดเวลาที่รัน)
| รายการ | ประมาณการ region Tokyo (2024) | ประมาณรายเดือน |
|---|---|---|
| ALB | $0.0243/ชม. + LCU | ~$18+ / เดือน |
| NAT Gateway (ต่อ AZ) | $0.062/ชม. + data transfer | ~$45+ / เดือน |
NAT Gateway เรียกเก็บต่อ AZ ด้วย multi-AZ (2 AZ) เพื่อความซ้ำซ้อน NAT Gateway อย่างเดียวมีราคา $90+/เดือน
ทำไมถึงไม่สังเกตเห็น
ผมมีความเข้าใจว่า “ECS Fargate แทบจะฟรีเมื่อไม่มี container รัน” อย่างไรก็ตาม ALB และ NAT Gateway ถูกเรียกเก็บเพียงแค่มีอยู่ โดยไม่คำนึงถึงจำนวน container instance
แม้จะ scale tasks ลงเป็น 0 คิดว่ากำลังประหยัดเงิน ต้นทุนคงที่ก็ยังคงมีอยู่ตราบเท่าที่ ALB และ NAT Gateway ยังทำงานอยู่
การทบทวนสถาปัตยกรรม
ก่อนการทบทวน
Internet → ALB → ECS Fargate (Private Subnet)
↓
NAT Gateway → Internet (ECR/SSM outbound)
↓
RDS
หลังการทบทวน (ต้นทุนต่ำสุด)
Internet → ALB → ECS Fargate (Private Subnet)
↓
VPC Endpoint (ECR/S3/SSM) ← แทน NAT Gateway
↓
RDS
แทนที่ NAT Gateway ด้วย VPC Endpoints
| Resource | วัตถุประสงค์ | ทางเลือกแทน |
|---|---|---|
| NAT Gateway | ดึง images จาก ECR | VPC Endpoint for ECR |
| NAT Gateway | เข้าถึง S3 | VPC Gateway Endpoint for S3 (ฟรี) |
| NAT Gateway | SSM Parameter Store | VPC Endpoint for SSM |
ต้นทุน VPC Endpoint
VPC Endpoint (Interface type) ราคา $0.014/ชม. × จำนวน AZ
ใช้ 3 endpoints ใน single AZ:
- $0.014 × 3 = $0.042/ชม.
- รายเดือน: ~$30
ถูกกว่า NAT Gateway ($0.062/ชม. × 1 AZ = $45/เดือน)
ทางเลือกแทน ALB (สำหรับ dev/test environments)
สำหรับการลดต้นทุน dev ลบ ALB และเข้าถึง ECS โดยตรงก็เป็นตัวเลือก
| วิธี | ต้นทุน | ข้อเสีย |
|---|---|---|
| มี ALB | $18+/เดือน | — |
| ไม่มี ALB (direct public IP) | ฟรี | ไม่มี HTTPS (ต้องใช้ self-signed cert ฯลฯ) |
| ไม่มี ALB (ผ่าน CloudFront) | ต้นทุนต่ำ | การตั้งค่าซับซ้อน |
ALB จำเป็นสำหรับ production แต่เราทบทวนว่า ALB จำเป็นสำหรับ dev/test environments หรือไม่
ประมาณการต้นทุนรายเดือนหลังการทบทวน
| Resource | การตั้งค่า | ประมาณรายเดือน |
|---|---|---|
| ECS Fargate | 0.25vCPU × 0.5GB, 1 task, 24 ชม. | ~$10 |
| RDS PostgreSQL | db.t4g.micro, single AZ | ~$15 |
| ALB | 1 หน่วย | ~$18 |
| VPC Endpoint | Interface × 3 (single AZ) | ~$30 |
| S3 | ส่งไฟล์ static | ~$1 |
| รวม | ~$74/เดือน |
เปรียบเทียบกับก่อน (NAT Gateway × 2 AZ) ประหยัดได้ประมาณ $30–40 ต่อเดือน
การประหยัดด้วยการ Scale Down Tasks
ใน dev environments การ scale ECS tasks ลงเป็น 0 ตอนกลางคืนช่วยลดต้นทุน compute ของ Fargate
# Scale down เป็น 0 tasks (กลางคืน/วันหยุดสุดสัปดาห์)
aws ecs update-service \
--cluster dvd-rental-cluster \
--service dvd-rental-service \
--desired-count 0
# Scale กลับเป็น 1 เมื่อเริ่มพัฒนา
aws ecs update-service \
--cluster dvd-rental-cluster \
--service dvd-rental-service \
--desired-count 1
โปรดทราบว่าต้นทุนคงที่สำหรับ ALB และ NAT Gateway (หรือ VPC Endpoint) ยังคงไม่เปลี่ยนแปลง
สรุป
จุดที่มักพลาดในต้นทุน ECS Fargate:
- ALB มีต้นทุนคงที่ $18+/เดือน — เรียกเก็บแม้ tasks = 0
- NAT Gateway ราคา $45+/เดือน (ต่อ AZ) — เพิ่มเป็น 2 เท่าด้วย multi-AZ
- เปลี่ยน NAT Gateway → VPC Endpoint อาจประหยัดได้ $15–30/เดือน
- ใช้การตั้งค่าที่ต่างกันสำหรับ dev กับ production — production ต้องการ multi-AZ, single-AZ เพียงพอสำหรับ dev
“Serverless ถูก” เป็นความจริงครึ่งเดียว — การเข้าใจต้นทุนคงที่ของ ALB และ NAT Gateway ตั้งแต่แรกเป็นสิ่งสำคัญ
บทความที่เกี่ยวข้อง
→ การสร้างแอพ DVD Rental สำหรับผู้ใช้ควบคู่กับหน้าจัดการ — ภาพรวมโครงสร้าง Vue 3 + Spring Boot
→ การสร้างแอพจัดการ DVD Rental ด้วย Spring Boot + Thymeleaf บนฐานข้อมูลตัวอย่าง dvdrental