กรณีสยองของเทคโนโลยี Serverless
(serverlesshorrors.com)- เป็นเว็บไซต์ที่รวบรวมกรณีจริงซึ่งแสดงให้เห็น ความเสี่ยงค่าใช้จ่ายพุ่งกระฉูด ที่ซ่อนอยู่เบื้องหลังความสะดวกของการคิดค่าบริการตามการใช้งาน
- สามารถเปรียบเทียบ บิลที่คาดไม่ถึง ที่เกิดกับ Cloudflare, Vercel, AWS, Firebase, Netlify, BigQuery ฯลฯ แยกตามบริการและสาเหตุได้
- แม้แต่โปรเจกต์เล็กหรือบริการส่วนบุคคลก็อาจกลายเป็นบิลมูลค่าสูงได้ในพริบตา เช่น บิล Cloudflare $36,000, Vercel $46,485.99 หรือ Firebase $100,000 ในวันเดียว
- สาเหตุที่เกิดซ้ำคือ แบนด์วิดท์, DDoS/DoS, สตอเรจ, การใช้งานที่ implement ผิด, recursion, queue loop และปริมาณการใช้งานที่เพิ่มขึ้นเกี่ยวกับ event, รูปภาพ, documentation และ AI
- เมื่อใช้บริการแบบ serverless และ pay-as-you-go ควรตรวจสอบเพดานค่าใช้จ่าย, cache, รูปแบบ request และ loop อัตโนมัติทั้งก่อนและหลัง deploy
ลักษณะของเว็บไซต์และวิธีส่งเคส
- ServerlessHorrors เป็นบล็อกเรียบง่ายที่รวบรวมให้อ่านกรณีค่าใช้จ่ายและเหตุขัดข้องที่เกิดระหว่างใช้งาน serverless
- ผู้สร้างคือ Andras ซึ่งทำงานเกี่ยวกับ Coolify, Jean และโปรเจกต์โอเพนซอร์สหลายรายการ รวมถึงงานที่เกี่ยวข้องกับ coolLabs
- รับการแจ้งเคสผ่าน 2 ช่องทาง
กรณีเด่นที่นำไปสู่บิลมูลค่าสูง
- $36,000: โปรเจกต์ข้างเคียง RetainDB ได้รับบิล Cloudflare $36k ทั้งที่มีผู้ใช้ 81 คน
- สาเหตุคือ Durable Object writes 16B ครั้ง, runaway queue loop, Durable Object writes ที่ไม่ได้ batch และ KV list scan ที่รันทุก request
- แท็ก: cloudflare, workers, durable-objects, kv, queues
- $46,485.99: Jmail มียอด pageviews เกิน 450M และแม้หลังจากลดผลกระทบด้วย cache จำนวนมากแล้ว บิล Vercel ก็ยังเพิ่มเป็น $46k
- แท็ก: vercel, bandwidth
- $100,000.420: เว็บไซต์อัปโหลดเกม WebGL ที่ได้รับความนิยมพอสมควรถูก DoS จนบิล Firebase ในวันเดียวกลายเป็น $100k
- แท็ก: google, storage, firebase
- $120,000.420: กรณีที่ Cloudflare พยายามเรียกให้จ่าย $120k ภายใน 24 ชั่วโมง แล้วถอดเว็บไซต์ลง
- แท็ก: cloudflare, bandwidth
- $104,500.123: กรณีได้รับอีเมลแจ้งบิลค้างชำระ $104,500.00 จาก Netlify
- แท็ก: netlify, bandwidth, ddos
- $96,280.69: กรณีบิลมูลค่าสูงที่เกี่ยวกับ bandwidth ของ Vercel
- แท็ก: vercel, bandwidth, new
- $72,000.999: กรณีทดสอบ Firebase + Cloud Run แล้วเผาเงินไป $72K จนเกือบล้มละลาย
- แท็ก: google, firebase, cloudrun, wrong-implementation, recursion
- $70,000.69: โปรเจกต์ที่เคยจ่ายเดือนละ $50 อยู่ดี ๆ วันหนึ่งก็มีบิล $70,000 ออกมา
- แท็ก: google, storage, firebase, gcs
กรณีเพิ่มเติมที่บันทึกไว้แยกตามบริการ
- $23,000.420: EchoFox ถูกสแปมจนบิล Vercel พุ่งเป็น $23k และเกิด 56k+ accounts and trials
- แท็ก: vercel, bandwidth, ddos
- $22.639,69: แค่ใช้ชุดข้อมูลสาธารณะใน BigQuery playground แต่ได้รับบิล 22k USD
- แท็ก: google, bigquery, sql
- $11,000.69: ระหว่างถูกโจมตี DoS มีการส่งอีเมลมูลค่า $11k และสูญเสียฐานข้อมูล
- แท็ก: ddos, mailgun
- $4,241.69: กรณีที่ระงับบริการชั่วคราวแล้ว แต่ AWS บล็อกและต้องจ่ายค่าใช้จ่าย
- แท็ก: aws
- $3,000.69: กรณีเตือนให้ระวังเมื่อทดสอบหรือ deploy บน Vercel
- แท็ก: vercel, bandwidth, wrong-implementation
- $1,300.69: เกิดค่าใช้จ่ายหลังสร้าง AWS S3 bucket ที่ว่างและเป็น private ใน region ที่ต้องการ
- แท็ก: aws, s3, security, ddos
- $1273.69: เกิดค่าใช้จ่าย PostHog หลังขอให้ Devin AI เปลี่ยนแปลง codebase
- แท็ก: posthog, devin, ai, cognition-labs, new
- ~$1189.420/month: ในแผน $69/month Webflow เรียกเก็บ $1189.420 ในเดือนเดียว
- แท็ก: webflow, bandwidth, image
- $738.420: สมัคร Vercel Pro เดือนละ $20 และเพิ่ม spending limit $120 แล้ว แต่ก็ยังเกิดบิล
- แท็ก: vercel, bandwidth, vercels-mistake, spending-limit
- $620.123: กรณี Vercel ที่ sitemap.txt ใช้งานหลายร้อย GB/hours
- แท็ก: vercel, bandwidth
- $530.19: กรณี PostHog ที่ไม่เคยเสียค่าใช้จ่ายมาก่อน แต่จู่ ๆ ถูกเรียกเก็บ $530
- แท็ก: posthog, events, new
- $400.69: Cloudflare Images เรียกเก็บ $400 ต่อเดือนแทนที่จะเป็น $110 ตามคาด พร้อมมีการคิดเงินล่วงหน้าที่สับสนและการขาดการสนับสนุนเกิน 8 เดือน
- แท็ก: cloudflare, images, billing
- $383.69: กรณี Mintlify ที่ได้รับบิลเกือบ $400 สำหรับเว็บไซต์ documentation
- แท็ก: mintlify, ai, documentation
- $250/month: ต้องเสียค่าใช้จ่าย $250 ต่อเดือน หรือ $3,000 ต่อปี สำหรับ 9,000 page visits
- แท็ก: framer, bandwidth, images and videos
- $103.26: กรณี AWS ที่ $103 กลายเป็นเคสสยองในสถานการณ์ใช้งาน free tier
- แท็ก: aws, dark-pattern, free-tier
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
น่าเสียดายจริง ๆ และรู้สึกเหมือนถอยหลังด้วยซ้ำ ไฟล์ขนาด 3.44MB ไม่ควรกลายเป็นปัญหา และถึงจะเป็นปัญหา คำตอบก็ไม่ควรเป็น “ไปอัปโหลดไว้ที่อื่น”
ถ้ามีบทเรียนหนึ่งอย่างจากเรื่องนี้ก็คือ ไม่มีอะไรฟรีจริง และความเสียหายใหญ่แบบนี้ควรถูกป้องกันได้ด้วยการตั้งขีดจำกัดในรูปแบบใดรูปแบบหนึ่ง VPS ราคาถูกมากและจัดการง่าย แถมมีขีดจำกัดอัตโนมัติด้วย: https://lowendbox.com/blog/1-vps-1-usd-vps-per-month/
ไม่คิดว่ากรณีของ Netlify เกิดจาก สถาปัตยกรรม serverless เอง serverless มีปัญหาทางเทคนิคมากมายก็จริง แต่ปัญหาการได้รับบิลก้อนใหญ่เพราะทราฟฟิกขาเข้านั้นแยกจาก serverless
ต่อให้เอาเครื่องของตัวเองไปวางแบบ colocation และจ่ายค่าทราฟฟิก ถ้าศูนย์ข้อมูลไม่ช่วยกัน DDoS ให้และคิดเงินเป็นระดับ TB เรื่องเดียวกันก็เกิดขึ้นได้ แน่นอนว่า colocation มีราคาต่อ TB ถูกกว่า Netlify มาก โอกาสได้บิล 100,000 ดอลลาร์จึงต่ำกว่า แต่ถ้าอย่างนั้นประเด็นหลักก็ไม่ควรเป็น “ความสยองของ serverless” แต่ควรเป็น ค่าทราฟฟิกที่แพงเกินเหตุ และการไม่มี DDoS mitigation
Andres ผู้สร้างบล็อกนี้ก็กำลังทำ coolify ซึ่งเป็นทางเลือกแบบ self-hosting แทน Heroku/Netlify ด้วย หลังใช้มาหลายเดือน มันเหมือนซอสลับที่ช่วยให้ self-host ของอย่าง changedetector, jdownloader, vaultwarden ได้ง่ายขึ้น
ชุมชนก็กำลังเติบโตได้ค่อนข้างดี ผู้คนช่วยกันส่ง template ใหม่ ๆ และช่วยกัน debug ผมลองเพิ่ม template ของ Syncthing ไปด้วย แต่พอดิสก์เต็มบนอินสแตนซ์พื้นที่ 10GB หลายอย่างก็พังลงมา ตรงนี้ถ้ามีการแจ้งเตือนหรือการป้องกันที่ดีกว่านี้ก็น่าจะดี นอกนั้นถือว่าค่อนข้างเสถียร
https://github.com/coollabsio/coolify
อาจจะเป็นการตอบสนองเกินเหตุ แต่ตัดสินใจย้ายเว็บส่วนตัวออกจาก Netlify แล้ว เดิมไม่ได้ต้องการอะไรมากไปกว่าที่สำหรับวาง HTML และคิดว่า Netlify “ดีพอ” แต่ไม่รู้มาก่อนว่ามีปัญหาแบบนี้
เว็บไซต์ที่เสียหายล่าสุดมีจำนวนผู้เข้าชมต่อวัน ระดับการเป็นที่รู้จัก และลักษณะเฉพาะกลุ่มคล้ายกับเว็บของผม เลยรู้สึกใกล้ตัวมากขึ้น ผมชอบวิธี build HTML ในเครื่องแล้วอัปโหลดไปไว้ที่ไหนสักแห่งอยู่แล้ว ดังนั้นการย้ายจริง ๆ ก็แค่อัปเดต DNS สิ่งที่แปลกคือ ตัวเลือกยอดนิยมส่วนใหญ่ เช่น Netlify, Vercel, Cloudflare ไม่ได้มี ขีดจำกัดการใช้จ่าย ให้จริง ๆ ทั้งที่ดูเหมือนเป็นฟีเจอร์พื้นฐานมาก
https://vercel.com/blog/introducing-spend-management-realtime...
เธรดความคิดเห็นของ Netlify ที่ลิงก์อยู่ในโพสต์ Reddit หนึ่งก็น่าอ่าน: https://answers.netlify.com/t/limit-bandwidth-to-avoid-high-...
ตัวแทนของ Netlify พูดชัดเจนว่า แม้จะเป็น tier ฟรี หากถูก DDoS ก็จะไม่ทำอะไรเพื่อป้องกันบิลค่าแบนด์วิดท์ที่ไม่สมเหตุสมผล
ตัวชี้วัดการคิดเงินบางอย่างมีรายงานหรือการแจ้งเตือนช้าหลายชั่วโมง ค่าเริ่มต้นควรปลอดภัย และการเพิ่มขีดจำกัดควรทำได้ง่าย
ไม่รู้ว่าโมเดลธุรกิจแบบนี้จะยั่งยืนได้ไหม สมัยที่เราเป็นเจ้าของเซิร์ฟเวอร์ เรายังดึงปลั๊กได้ แต่ตอนนี้ไม่มีทางรู้เลยว่าใครจะเรียก
/apiหนึ่งล้านครั้งต่อนาทีการที่ผู้ให้บริการคลาวด์เรียกเก็บเงินเกินควรในรายการที่ตนมีสิทธิ์เรียกเก็บ รู้สึกคล้ายกับช่างซ่อมรถที่ระหว่างตรวจเช็ก routine เจอว่าชิ้นส่วนเล็ก ๆ เสีย แล้วอะไหล่ที่เปลี่ยนก็เสียต่อเนื่องด้วยเหตุผลเดียวกัน จึงเปลี่ยนวนซ้ำไม่รู้จบโดยไม่แจ้งข้อมูลอะไรเลยเป็นเวลา 2 สัปดาห์ สุดท้ายพอผมไปที่อู่แล้วบอกให้หยุด ก็เรียกเก็บค่า ชิ้นส่วนที่เสีย 999,999,999 ชิ้น
ในฐานะผู้ใช้รายเล็กที่ไม่ใช่องค์กรขนาดใหญ่ เราไม่สามารถอ่านเอกสารการปรับแต่งทุกซอกทุกมุมได้หมด ต้องการเพดานแบบตายตัวที่เมื่อถึงวงเงินใช้จ่ายที่กำหนดไว้ก็ปิดทุกอย่างไปเลย และถ้าจำเป็นถึงขั้นข้อมูลหายก็ยอมได้ แต่ดูเหมือนพวกเขาจะไม่ทำแบบนั้น เพราะถ้าผู้ใช้ระวังงบประมาณ รายได้ก็จะเสียหาย และบางกรณีก็คำนวณยอดเรียกเก็บล่วงหน้าได้ยากด้วย
อุปมาที่แม่นกว่าคือมีคนที่รู้เลขทะเบียนรถไปบอกช่างให้ทำตามคำขออะไรก็ได้ แล้วช่างก็ทำตามนั้น
เมื่อไม่นานมานี้ผมสร้างคีย์ OpenAI API ซึ่งโดยค่าเริ่มต้นจะบังคับใช้ โควตา และเมื่อถึงลิมิตก็จะปิดใช้งานคีย์ หากผู้ใช้พร้อมรับคำขอมากขึ้น จึงค่อยเพิ่มโควตาด้วยตนเอง
น่าแปลกที่บริษัทจำนวนมากกว่านี้ไม่ตั้งค่าเริ่มต้นแบบนี้เพื่อกันบิลเซอร์ไพรส์พวกนี้ พอมาคิดดูแล้ว อาจเป็นเพราะสุดท้ายผู้ใช้ก็มักจะยอมจ่ายเงินนั่นแหละ
ผมมองว่าความน่ากลัวที่สุดของคลาวด์อาจไม่ใช่ serverless แต่เป็นการที่เรายอมรับการจ่าย ค่าใช้จ่ายทราฟฟิกข้าม availability zone ด้วยเหตุผลว่าเป็นการเตรียมรับมือหากผู้ให้บริการคลาวด์ล้มเหลว
กล่าวอีกอย่างคือ ผู้ให้บริการกำลังเรียกเก็บเงินจำนวนไม่น้อยสำหรับค่าใช้จ่ายในการบรรเทาปัญหาที่ตัวผู้ให้บริการเองอาจมี
ในเธรดนี้ทุกคนบอกว่านี่ไม่ใช่ปัญหา serverless แต่เป็นปัญหาคลาวด์ ซึ่งก็ถูก แต่ประเด็นหลักยังคงอยู่ แบนด์วิดท์แทบจะเป็นกำไรสุทธิ และการคิดค่าแบนด์วิดท์แพงขนาดนี้พร้อมกับไม่ให้เครื่องมือแก่ลูกค้าเพื่อรับมือการโจมตีที่อยู่นอกเหนือการควบคุมของลูกค้า ดูค่อนข้างแย่
ตามเธรดนี้ Netlify ไม่มีแม้แต่ตัวเลือกให้ปิดไซต์ชั่วคราวระหว่างถูก DDoS: https://answers.netlify.com/t/limiting-bandwidth-traffic-to-...
Netlify อาจมีวิธีแก้หลายอย่างได้ เช่น การควบคุมการเรียกเก็บเงิน การจำกัดคำขอ เพดานแบนด์วิดท์ หรือถ้าเป็น DDoS จริงก็ยกเว้นส่วนที่เกินให้ แต่ดูเหมือนไม่สนใจ เพราะจะเหมือนฆ่าห่านที่ออกไข่ทองคำ แค่ดูฟีเจอร์ที่ CDN ของ bunny.net มีให้ก็เทียบได้แล้ว: https://support.bunny.net/hc/en-us/articles/360014190440-Und...
น่าผิดหวังที่เราออกจะยอมรับคำอธิบายของผู้ให้บริการคลาวด์ง่ายเกินไป ทั้งที่อธิบายด้วยอย่างอื่นนอกจากความโลภได้ยาก
ทำไมการไม่มีเพดานค่าใช้จ่ายถึงเป็นปัญหา serverless? นั่นคือ ปัญหาคลาวด์ ต่างหาก
อย่างไรก็ตาม ถ้าเป็นเซิร์ฟเวอร์คลาวด์ขนาดเล็ก เมื่อถูกโจมตีก็อาจล่มได้ และถ้าเหมือน AWS ที่คิดเงินเฉพาะทราฟฟิกขาออก นั่นก็เป็นผลดีกับผู้ใช้
ต่อให้ DDoS VPS DigitalOcean เดือนละ 5 ดอลลาร์ของผม ต้นทุนคอมพิวต์ก็ไม่เพิ่ม และมีแนวโน้มจะรับโหลดไม่ไหวแล้วล่มก่อนที่ค่าโอนข้อมูลจะสะสมมากนัก ปริมาณโอนข้อมูลของ DigitalOcean ก็คิดตามการใช้งานเช่นกัน แต่ก็น่าจะชนเพดานก่อนหน้านั้น
นี่คือ ปัญหาการเรียกเก็บเงิน หรือปัญหาสถาปัตยกรรม ควรให้จำกัดคำขอเพื่อป้องกันการเรียกเก็บเกิน หรือให้ตัดเมื่อถึงยอดเงินที่กำหนด
ในสภาพแวดล้อมแบบดั้งเดิม การวาง circuit breaker ทำได้ง่ายกว่าโดยนัย แต่ก็ยังต้องพิจารณาอยู่ดี ต้องทำ load test ทั้งกรณีสำเร็จและล้มเหลว
ผมใช้คลาวด์อินสแตนซ์ จึงไม่มีปัญหานี้และจะไม่มีต่อไป ถ้าเป็น serverless ก็คงเจอปัญหานี้แล้ว