- กรณีที่ การตั้งค่าเครือข่าย VPC และ NAT Gateway ของ AWS ผิดพลาด ทำให้เกิดค่าใช้จ่ายในการโอนถ่ายข้อมูล S3 ราว $900 ภายในวันเดียว และยอดสะสมรายเดือนเกิน $1,000
- แม้จะเข้าใจกันว่าการโอนถ่ายจาก EC2 ไปยัง S3 นั้นฟรี แต่หาก วิ่งผ่าน NAT Gateway ภายใน VPC จะมีค่าประมวลผลข้อมูลแบบคิดเงิน
- สาเหตุของปัญหาคือ ไม่ได้ตั้งค่า VPC Gateway Endpoint สำหรับ S3 จึงไม่มีเส้นทางเชื่อมต่อไปยัง S3 โดยตรงโดยไม่ผ่าน NAT Gateway
- Gateway Endpoint นั้น ฟรีและไม่มีค่าบริการรับส่งข้อมูล สามารถตั้งค่าได้ง่ายด้วย Terraform เป็นต้น
- เป็นกรณีตัวอย่างที่แสดงให้เห็นถึง ความสำคัญของการเฝ้าระวังค่าใช้จ่ายและการตรวจสอบการตั้งค่า VPC Endpoint เมื่อต้องดูแลโครงสร้างพื้นฐานบน AWS
เบื้องหลังของปัญหา
- Geocodio ใช้ AWS เพื่อทำมิเรอร์ไฟล์ข้อมูลภูมิศาสตร์ภายในขนาดใหญ่ไปยัง S3
- ข้อมูลประกอบด้วย address points, boundary data, ข้อมูลสำมะโนประชากร ฯลฯ มีขนาดตั้งแต่หลาย GB ไปจนถึงหลายร้อย GB
- จำเป็นต้องซิงก์เป็นประจำจากแพลตฟอร์ม ETL ที่โฮสต์บน Hetzner ไปยังโครงสร้างพื้นฐานประมวลผลบน AWS
- เรื่องที่ ค่าโอนถ่ายข้อมูลของ AWS สูง เป็นข้อร้องเรียนร่วมกันของทั้งอุตสาหกรรม โดย Cloudflare และ Corey Quinn ก็เคยชี้ปัญหานี้ไว้
- ผู้เขียนได้ตรวจสอบโครงสร้างค่าใช้จ่ายก่อนเริ่มโปรเจกต์ และประเมินต้นทุนจากข้อเท็จจริงว่า
- การโอนถ่าย EC2–S3 ภายในรีเจียนเดียวกันนั้นฟรี
- การอัปโหลดไปยัง S3 (ขาเข้า) ฟรี
ค่าใช้จ่ายที่ไม่คาดคิด
- หลังจากนำกระบวนการซิงก์กับ S3 ขึ้นใช้งาน ก็ได้รับการแจ้งเตือนความผิดปกติจาก AWS Cost Anomaly Detection
- ภายในวันเดียว ปริมาณข้อมูลผ่าน NAT Gateway อยู่ที่ 20,167.32GB คิดเป็นค่าใช้จ่าย $907.53
- ค่าใช้จ่ายสะสมรายเดือนทะลุ $1,000 ไปแล้ว
- จึงเริ่มตรวจสอบว่า เหตุใดจึงถูกคิดค่าบริการ NAT Gateway ทั้งที่เข้าใจว่าการโอนถ่าย EC2–S3 ฟรี
การวิเคราะห์สาเหตุ: วิ่งผ่าน NAT Gateway
- หาก VPC ใช้ NAT Gateway ทราฟฟิกไปยัง S3 ก็จะถูก route ผ่าน NAT Gateway โดยปริยาย
- แม้จะเป็นการเรียกใช้บริการ AWS ภายในรีเจียนเดียวกัน หากผ่าน NAT ก็จะมี ค่าประมวลผลข้อมูล $0.045 ต่อ GB
- ด้วยเหตุนี้ แม้การโอนถ่ายระหว่าง EC2–S3 จะฟรี ก็ยังถูกคิด ค่าใช้จ่ายของ NAT Gateway
- วิธีแก้คือ สร้าง VPC Gateway Endpoint สำหรับ S3
- ทำให้ เชื่อมต่อจาก VPC ไปยัง S3 ได้โดยตรง โดยไม่ผ่าน NAT Gateway หรือ Internet Gateway
- ฟรีทั้งหมด ไม่มีทั้งค่าบริการรายชั่วโมงและค่ารับส่งข้อมูล
กระบวนการแก้ไข
- เนื่องจากจัดการโครงสร้างพื้นฐานด้วย Terraform จึง เพิ่ม resource ของ Gateway Endpoint และผูกเข้ากับ route table
- AWS จะอัปเดต routing ให้อัตโนมัติ เพื่อส่งทราฟฟิก S3 ไปยัง Endpoint แทน NAT Gateway
- หลังจากนั้น การคิดค่าบริการที่เกี่ยวข้องกับ NAT Gateway ก็หยุดลง
บทเรียนและคำแนะนำ
- แม้จะใช้งาน AWS มานาน ก็ยังเกิดค่าใช้จ่ายจาก การตกหล่นการตั้งค่า VPC Endpoint สำหรับ S3 ได้
- ระบบเครือข่ายของ AWS มีความซับซ้อน และ โครงสร้างค่าใช้จ่ายอาจเปลี่ยนไปมากตามวิธีการตั้งค่า
- คำแนะนำเพื่อป้องกันไม่ให้เกิดซ้ำ
- เปิดใช้ AWS Cost Anomaly Detection: ช่วยตรวจจับค่าใช้จ่ายผิดปกติได้ตั้งแต่เนิ่น ๆ
- ใช้ VPC Endpoint: ถือเป็นสิ่งจำเป็นเมื่อเข้าถึง S3·DynamoDB จาก VPC ที่ใช้ NAT Gateway
- ตรวจสอบสมมติฐาน: อย่าเชื่อเพียงว่า “การโอนถ่าย EC2–S3 ฟรี” ควรทดสอบด้วยปริมาณน้อยก่อนแล้วติดตามค่าใช้จ่าย
- คลาวด์มีความซับซ้อน: ต่อให้เป็นผู้ใช้ระยะยาวก็ยังต้องระมัดระวังอย่างต่อเนื่อง
- ยังมีการยกตัวอย่างกรณีคล้ายกันของ Recall.ai ที่จ่าย $1 ล้านต่อปี สำหรับค่าใช้จ่ายในการประมวลผลข้อมูล WebSocket
การดำเนินการหลังจากนั้น
- Geocodio ตรวจสอบเส้นทางการสื่อสารกับ S3 ของทุก VPC และ ตั้งค่า Gateway Endpoint ครบแล้ว
- แนะนำผู้ใช้ AWS ให้ ตรวจสอบการตั้งค่า VPC Endpoint
- สรุป: NAT Gateway คิดค่าบริการแม้กับทราฟฟิกไปยังบริการของ AWS และ สามารถหลีกเลี่ยงค่าใช้จ่ายได้ด้วยการใช้ VPC Endpoint
แหล่งข้อมูลเพิ่มเติม
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เห็นกรณีแบบนี้ที่เป็น บิลค่าใช้จ่ายถล่มทลาย โผล่ในซับเรดดิตเกี่ยวกับคลาวด์หลัก ๆ ทั้งสามแห่งแทบวันละครั้งอยู่บ่อย ๆ
ผู้ให้บริการคลาวด์มักส่งการแจ้งเตือนแบบล่าช้าเสมอ และผู้ใช้ก็ทำได้แค่ ภาวนาและขอความช่วยเหลือ
แถมบางรายยังอ้างว่า “ในทางเทคนิคแล้วเป็นไปไม่ได้ที่จะมีบัญชีแบบ hard cap” แต่ในความเป็นจริง Azure มีบัญชีแบบนั้นอยู่แล้ว
ผมใช้ AWS มานานกว่าสิบปีแล้ว และพบว่าความไม่ต่อเนื่องของการออกแบบระหว่างบริการกับ การแบ่งเป็นไซโลภายในองค์กร นั้นรุนแรงมาก
ในองค์กรใหญ่ ๆ ไม่มีผู้บริหารคนไหนอยากแก้ปัญหาที่จะกระทบ KPI ของตัวเอง แต่จะไปโฟกัสกับการเปิดตัวบริการตามกระแสอย่าง AI หรือบล็อกเชนเพื่อเก็บแต้มเลื่อนตำแหน่งแทน
เลือกได้ระหว่างแพลน $0, $15, $200 ซึ่งช่วยกันบิลพุ่งจากคำขอใช้งานหรือการโอนถ่ายข้อมูลที่เพิ่มขึ้นแบบไม่คาดคิดได้
ลิงก์บล็อกทางการของ AWS
เธรด HN ที่เกี่ยวข้อง
แม้การตั้งเพดานค่าใช้จ่ายพร้อมรักษาเสถียรภาพของบริการจะเป็นเรื่องยาก แต่กรณีนี้ก็ พิสูจน์แล้วว่าในทางเทคนิคทำได้จริง
เพื่อหลีกเลี่ยงความเสี่ยงด้านชื่อเสียงจากการหยุดให้บริการหรือปัญหาโครงสร้างพื้นฐานล่ม
แต่ปัญหาอาจอยู่ที่ตัวคลาวด์เองก็ได้ สำหรับธุรกิจขนาดเล็กที่ต้องการ โครงสร้างต้นทุนที่คาดการณ์ได้ คลาวด์อาจไม่ใช่ตัวเลือกที่เหมาะ
เรื่องแบบนี้เกิดบ่อยเกินไปจนผมคิดว่า S3 VPC Endpoint ควรถูกตั้งเป็นค่าเริ่มต้นตอนสร้าง VPC
และถ้าใช้ทางเลือกอย่าง fck-nat แทน NAT Gateway ก็จะประหยัดค่าทราฟฟิกต่อ GB ได้
ควรอยู่ในสถานะปฏิเสธการเข้าถึงเป็นค่าเริ่มต้น แล้วค่อยอนุญาตการเข้าถึงอินเทอร์เน็ตอย่างชัดเจน ไม่เช่นนั้นผู้โจมตีอาจขโมยข้อมูลออกไปได้
ผมก็เคยพลาดคล้าย ๆ กัน
เคยอัปโหลดข้อมูลทดสอบไปยังอัลกอริทึมแนะนำของ AWS แล้วลืมมันไป จนหลายเดือนต่อมาธนาคารแจ้งเตือนว่าเงินในบัญชีไม่พอ
อัลกอริทึมยังทำงานต่อเนื่องและถูกคิดเงินเดือนละมากกว่า 1,000 ดอลลาร์ สุดท้ายเงินหายไป 5,000 ดอลลาร์
ผมเช็กยอดเงินทุกวัน ทำเครื่องหมายให้อีเมลเรียกเก็บเงินทุกฉบับเป็นอีเมลสำคัญ
และติดนิสัยตั้ง วงเงินบัตรเสมือน แยกไว้สำหรับแต่ละบริการ
ผมก็เคยพลาดแบบเดียวกันและเสียไป 60,000 ดอลลาร์
ผมไม่เข้าใจว่าทำไม S3 Endpoint ถึงไม่ถูก deploy เป็นค่าเริ่มต้น
ผมมักถูกถามว่า “ทำไมค่า AWS ถึงพุ่งระเบิด” ซึ่งส่วนใหญ่เป็นเพราะการผสมกันของ NAT + S3 + สมมติฐานที่ผิด
การโอนข้อมูลจาก EC2 ไป S3 ฟรีก็จริง แต่ถ้าวิ่งผ่าน NAT จะเสียเงิน
เพราะงั้นผมจึงให้เช็กลิสต์นี้
ยังดีที่ Cost Anomaly Detection ทำงานทันเวลา เสีย 1,000 ดอลลาร์ก็ยังเจ็บ แต่ดีกว่าเสีย 20,000 ดอลลาร์
ผมตกใจตอนเห็นว่าการดาวน์โหลดข้อมูลจาก AWS ต้องจ่าย $0.09 ต่อ GB
ตอนอัปโหลดข้อมูลเข้าไปฟรี แต่จะดึงออกมากลับต้องเสียเงินงั้นเหรอ?
กรณีนี้เป็นเคสพิเศษที่เกิดจากการตั้งค่า NAT ผิดจนทราฟฟิกภายในถูกนับเป็นทราฟฟิกภายนอก
สงสัยว่า Amazon คืนเงินสำหรับความผิดพลาดแบบนี้หรือเปล่า
VPC NAT Gateway มีชื่อเสียมาก
ตอนอยู่ Amazon ผมก็เคยเจอปัญหาคล้ายกัน แต่เป็นบัญชีของบริษัทเลยไม่ได้เสียเงินเอง
คนที่ต้องจ่ายเงินจริง ๆ นี่น่าเห็นใจมาก
ถึงจะไม่ได้ช่วยกรณีนี้โดยตรง แต่เมื่อวาน AWS เปิดตัว แพ็กเกจราคาเหมาจ่ายสำหรับ CDN
และยังมี tier $0 ที่รวม S3 storage กับ bandwidth มาด้วย
ลิงก์ที่เกี่ยวข้อง
หวังว่าในอนาคตจะขยายไปยังบริการอื่นด้วย
ตอนอายุ 22 ผมเพิ่งเริ่มจับงาน infra ครั้งแรก แล้วโดน บิล 300 ดอลลาร์ภายในสองวัน
AWS ยอดเยี่ยมก็จริง แต่สำหรับมือใหม่ การคำนวณค่าใช้จ่ายไม่โปร่งใสเกินไป