cover

Serverless 不是沒有伺服器,是你不用管伺服器。聽起來像是甲方的夢想對吧?但跟所有「聽起來很美」的東西一樣,魔鬼在細節裡。

先講結論

Serverless 最適合「流量不穩定、邏輯簡單、不需要長時間跑」的場景。如果你的服務是穩定高流量的 API,Serverless 反而可能比一台長駐的容器還貴。它不是萬靈丹,它是一把好用但挑場合的瑞士刀。


到底什麼時候該用?

我自己的判斷標準很簡單:如果這個東西閒著的時間比忙的時間多,就該考慮 Serverless。

典型場景:

  • 圖片上傳後自動縮圖——你不會為了偶爾的上傳養一台 server
  • Webhook 觸發資料同步——事件來了才跑,沒事就睡
  • 排程報表——每天凌晨跑一次,其他 23 小時都在燒錢?
  • 小型 API——流量低到不值得開一台 EC2

反過來說,如果你的服務需要跑超過 15 分鐘、需要低延遲的即時連線、或者流量穩定且大,那就別硬套 Serverless,老老實實用容器吧。


Cold Start:Serverless 最痛的地方

每次我跟人介紹 Serverless,第一個被問的問題一定是 cold start。

所謂 cold start,就是你的 function 閒置太久被回收之後,下一次請求進來要重新啟動容器、載入依賴、初始化 runtime。這個過程短則幾十毫秒,長則好幾秒。

對策其實也不複雜,但需要紀律:

// 保持函式輕量,不要塞一堆巨大依賴
// 能 lazy load 就 lazy load
export const handler = async (event) => {
  const body = JSON.parse(event.body || '{}')
  return {
    statusCode: 200,
    body: JSON.stringify({ ok: true, id: body.id }),
  }
}
  • 減少套件大小——你真的需要整個 lodash 嗎?
  • 用 provisioned concurrency 預熱——花錢買延遲
  • 別在初始化階段做 DB 連線以外的重事

試過在 Lambda 裡跑機器學習模型,cold start 十幾秒,使用者都以為網站掛了。


Function 設計的四個紀律

寫 Serverless function 跟寫一般 API 最大的差別是:你的 function 隨時會被殺掉重來。所以:

單一職責——一個 function 只做一件事。想塞多個 endpoint?用 API Gateway 路由,別在 function 裡面自己 switch case。

無狀態——不要依賴本地檔案或記憶體。上一次的執行環境可能已經被回收了。狀態丟回 Redis、DB 或 S3。

短執行——盡量壓在 5-10 秒內。超過的任務拆成多段用 Queue 串起來。

可重試——冪等性不是 nice to have,是必須。因為平台可能會重送事件,你的 function 如果沒有冪等設計,就會產生重複資料。


成本模型:便宜到貴的交叉點

Serverless 的計費邏輯是「用多少付多少」。閒置時幾乎不花錢,這對低流量服務來說太香了。

但你有沒有算過高流量的情況?

假設一個 Lambda function 每月被呼叫 1000 萬次,每次跑 200ms,128MB 記憶體。這筆帳算下來,可能比一台 t3.small 跑整個月還貴。

所以你一定要做成本試算。 找出流量與成本的交叉點,在那個點之前用 Serverless,過了那個點就該考慮長駐服務。


IaC 管理:Serverless 不代表可以手動配

你以為不用管 server 就可以在 console 上點點點?別鬧了。觸發器、權限、環境變數、版本部署,這些東西一樣要用 IaC 管理。

resource "aws_lambda_function" "api" {
  function_name = "order-api"
  runtime       = "nodejs20.x"
  handler       = "index.handler"
  filename      = "dist.zip"
  memory_size   = 512
  timeout       = 10
}

用 Terraform 或 SAM 把所有配置寫成 code,commit 進 repo,才不會出現「staging 跟 prod 的觸發器設定不一樣但沒人知道」這種鬼故事。


延伸閱讀


Serverless 最大的謊言是「不用管伺服器」。你只是把管伺服器的責任外包給了雲端,然後多了一堆新的東西要管。