雲端帳單怎麼不會月底突然爆掉?
一句話回答
帳單月底才爆,多半是 serverless 資料庫(用多少算多少、閒置會自己休眠的資料庫)被高頻排程卡住無法休眠、或查詢一次撈太多。解法分兩層:事前幫每個服務設花費上限+用省錢守則寫程式;事後每天拉一次用量自己算日費(可用 GitHub Actions 免費排程做一支費用日報寄給自己),不等月結就發現異常。
先搞懂:為什麼帳單會「月底才爆」
- 雲端服務幾乎都是月結:用了多少,要到月底結算那天才一次看到總數。
- 平常沒有人盯著每天的用量,錢就在背景一點一點流掉。等發現不對,往往這個月已經過完了。
- 用 AI 開發之後這件事更明顯:你蓋東西的速度變快,開的服務、排程(設定好時間就自動去跑的小任務)、資料庫也跟著變多。
- 我自己手上就有好幾個專案的資料庫掛在同一張帳單上。哪一個在偷偷加速,如果不主動去看,根本分不出來。
先認識主角:什麼是 serverless 資料庫
- 現在很多資料庫是 serverless(無伺服器) 計費。白話說:你不用自己買一台機器整天開著養它,而是用多少算多少;沒人用的時候,它會自己休眠停下來,休眠那段時間不算錢。這就是它便宜的原因(常見的像 Neon、Supabase)。
- 帳單裡最花錢的一項通常叫 compute(運算時間),就是資料庫「醒著、正在幫你算東西」的時間。醒得越久,這項越貴。
- 記住這個前提,下面兩個最常見的坑就好懂了。
最容易中的雷:它被「叫不醒又睡不著」
- 雷點在這:只要你放一個每分鐘去戳它一下的排程,它就永遠醒著、compute 一直在算錢,帳單月底才爆給你看。
- (這種「每隔一小段時間就主動去問一次有沒有新東西」的做法叫輪詢。輪詢太密,就是把資料庫吵得沒辦法睡。)
- 這是很多人第一次用 serverless 資料庫都會中的坑。它不是壞掉,是被你自己的排程卡住了休眠。
- 記住一句話就好:閒置能休眠,才是它省錢的前提。別用高頻排程把它吵醒。
冷啟動:它只是在睡,你卻以為它壞了
這一段特別講清楚,因為它最容易被誤判、也最容易讓人做出「搬家」這種昂貴的錯誤決定。
- serverless 資料庫沒人用會休眠,省下的錢是有代價的:當你要用它的那一刻,它得先「開機暖身」,這幾秒到十幾秒就叫冷啟動(cold start)。
- 平常有人一直在用、它保持醒著時,你完全感覺不到。但那些「偶爾才連一次」的動作最容易撞上冷啟動——例如程式更新上線、半夜的定時備份、定時健檢。因為那個當下沒有人幫它提前暖身,它就是在睡。
- 我真的踩過一次:把「資料庫遷移」(更新資料庫結構的動作)放進上線流程,結果一直跳「連不到資料庫」。第一時間我以為是平台壞了,差點把整套東西搬去別家。
- 查了半天才發現:資料庫在睡、暖身要十幾秒,但我的程式預設只等五秒就放棄、直接報錯(這個「最多等幾秒沒回應就放棄」的設定,叫連線逾時)。把它改成「多等一下再放棄」就解決了,根本不用搬家。
- 最常遇到的版本是這個:早上第一個打開網站、或月初第一次開某張報表,特別慢;等第二次、第三次就順了。那多半不是系統爛,是它剛睡醒在暖身。
- 有些平台可以設定「保持喚醒」或縮短休眠時間,但那等於叫它少睡,會多花錢——要不要為了那幾秒的順暢多付這筆,是你的取捨。
- 一句話收:冷啟動不是故障,是省錢設計的副作用。看到「第一次特別慢」或「偶爾連不到」,先想「它是不是剛睡醒」,別急著怪平台、更別急著搬家——搬錯方向的功,才是最貴的浪費。
還有一種燒錢:一次撈太多
- 除了排程,最常見的燒錢是「一個查詢一次撈太多資料」(查詢=程式去資料庫要資料的動作)。
- 我看過一個系統,每次幫客人查資料,都先把上萬筆整批撈進記憶體再慢慢比對。結果又慢、又一直吃資料庫的運算,而且多數時候還對不到人。
- 後來改成先建一個索引(像書本後面的目錄,讓你不用翻整本書就能直接跳到那一頁),需要哪一筆抓哪一筆,同樣的事變成即時,也不再空燒運算。
- 工程上這種「本來一次就能拿完、卻拆成上百次去問」的毛病有個名字叫 N+1,名字你不用記,記症狀就好:一個頁面越用越慢、資料越多越卡,通常就是它在『每次都把整張表搬出來自己數』。這種地方最會默默燒錢,也最好改。
事前:先讓帳單有天花板(看情況取用,不是每條都要硬做)
- 新排程先問一句:能不能拉長間隔、或改成「事件觸發」(有事情發生的當下才去做,而不是你一直去問有沒有事;常見做法叫 webhook 或 queue)?別預設每分鐘輪詢。
- 別卡住 serverless 資料庫的休眠:需要定時做的事,間隔能拉多長就拉多長。
- 查詢別一次撈整張表:能讓資料庫先幫你篩選、分頁、只回需要的欄位,就別整包撈回來自己算。
- 主檔類資料快取久一點:快取就是把常用的資料先存一份在手邊,之後不用每次都重新去要。商品、客戶、設定這種很少變的,快取設久一些,少打幾次資料庫。
- 外部付費 API 能合併、能快取就別每次重打:API 就是程式跟另一個服務「要資料的窗口」。同樣的資料,不要每個請求都去問一次。
但別省過頭:需要即時的就別硬省
要提醒一句:真的需要即時的場景,就別為了省錢犧牲該有的反應速度。上面那些是「動工前先想一遍」的預設,不是不能破例的死規則。哪些該省、哪些該留即時,是你判斷的。
盯緊花費:每天看,不要等月結
- 幫每個雲端服務設用量/花費上限+帳單警報:後台能設的都設一個你能接受的月上限,被異常用量或盜刷波及時,至少有個天花板。
- 每天拉一次用量、自己算日費:這是最有感的一步。月結是落後指標,等它出來已經來不及;每天看一次,哪個服務今天突然加速,你當天就知道。
我怎麼用「零成本」做一支費用日報
我幫自己養了一個「看帳的」:一支小程式,每天早上把過去 24 小時、每個專案燒了多少,換算成錢寄到我信箱。重點是這支監測工具本身完全不花錢、也不會反過來燒錢。它的每個設計都是為了這件事:
- 用 GitHub Actions 的免費排程跑:GitHub Actions 是 GitHub 提供的、免費幫你「到點就自動跑一段程式」的服務。一天只跑一次。放在自己的伺服器或雲端函式反而會多一份計費;用這個免費排程,我電腦沒開它也照跑。
- 只用平台的唯讀 API 抓用量:唯讀就是只能看、不能改。唯讀不會去吵醒資料庫、也不產生額外費用。監測自己絕不能變成新的花費來源。
- 一個關鍵的坑:多數雲端平台連「每小時用量」都要你升級到更貴的方案才給,便宜方案通常只拿得到「本月到現在的累計」。所以我每天存一張用量快照(把當下的累計數字記下來),隔天用今天的累計減掉昨天的,自己算出「這一天到底用了多少」。
- 套官方公開定價自己換算成日費,再用免費的寄信額度寄一封 email 給自己。
- 整支程式不裝任何額外套件:能用內建功能就用內建的。跑得快,也少一個「供應鏈攻擊」的破口(供應鏈攻擊就是你借來用的第三方套件被人動了手腳,反過來害到你)。
- 一次給我三個數字:昨天花多少、照這樣整個月會花多少、這個月到現在已經花了多少。只看一個會誤判——有時單日正常但照趨勢月底會爆,有時反過來。
我不只顧「花多少」,也顧「還活著沒」
- 除了這支看帳的,我還養了一支專門顧「網站是不是還活著」的監控:定時檢查服務有沒有掛掉、反應慢不慢,出事就寄信通知我。
- 它還有一個「心跳」機制:萬一連監控自己都掛了、沒有按時回報,我一樣會收到警告。監控最怕的就是它自己先死了、你卻還不知道。
- 這兩支加起來,一支看錢、一支看命,就是我不用時時盯著、晚上也睡得比較著的原因。
把省錢變成 AI 的「預設動作」
不是每次都要自己記這些。我把「動工前先想會不會多花錢」寫成 AI 的固定守則,每次要寫新功能,它會先幫我把排程、查詢、重複呼叫算一遍,看到可能爆費就先講。你可以直接把下面這段貼給你的 AI:
我要你當我的雲端費用健檢員,我會貼給你專案的程式碼、排程設定、資料庫查詢。請幫我: 一、找出會一直花錢的地方:高頻排程/輪詢、跑很久的查詢、每個 request 都重複呼叫的外部 API 二、標出哪些查詢可能一次撈太多(整張表撈出來、N+1) 三、看有沒有讓 serverless 資料庫無法休眠的設計(例如每分鐘戳一次的 cron) 四、每一項給我省錢改法,並標出哪些不能動(真的需要即時的別亂改) 沒把握的也標出來讓我自己確認,不要漏
常見問題
我不太懂技術細節,這篇對我有用嗎?
有用。就算不碰程式,你也能做兩件最有感的事:到每個雲端服務後台設一個花費上限加帳單警報、每天花十秒看一眼用量。剩下的技術部分,把這篇的省錢守則和上面那段提示詞交給你的 AI 或工程師就好。
serverless 資料庫是不是很容易爆費,該避開嗎?
不用避開,它閒置休眠(沒人用就自己停下來不算錢)反而是省錢的設計。真正會爆的是「被高頻排程卡住、睡不著」。只要別用每分鐘戳它的排程、把定時任務的間隔拉長,它通常比一台整天開著的資料庫還省。
為什麼我的網站有時候第一次打開特別慢?
很可能就是「冷啟動」:服務沒人用時會休眠省錢,你第一個打開時它要先暖身幾秒到十幾秒,第二次就順了。這不是壞掉,是省錢設計的副作用。如果你很在意這幾秒,有些平台可以設「保持喚醒」,但那會多花錢,自己權衡。
GitHub Actions 的免費排程真的不用錢嗎?
對一般用量來說是。它每個月有免費額度(以分鐘計),一天跑一次的費用日報這種輕量任務綽綽有餘。要注意的是額度是整個帳號共用,如果你同時掛很多專案的排程,會互相吃額度,這時再把跑得少的往外拉就好。
我怎麼知道到底是哪個服務、哪一天在燒?
關鍵是「每天存一份、分項又分專案」。日報把每個專案、每個項目(運算、儲存、傳輸)拆開列,哪一項今天變多一眼就看到;有了每日快照,你還能往回對是哪一天開始不對勁。
「省錢守則」是不是每條都要照做?
不是。那些是「動工前先想一遍」的預設,不是死規則。真的需要即時的功能,就別為了省錢犧牲反應速度。該省的省、該留即時的留,是你判斷。