⏱️ 第十三章:無伺服器架構的痛點 - Serverless Cronjob 自動化

在第十章中,我們學會了如何在 FastAPI 裡面用 APScheduler 寫一個倒數計時的鬧鐘。 當你在自己電腦 (Localhost) 測試時,這個鬧鐘運作得完美無瑕,每天晚上六點準時發 Line 通知。

但是,當你滿心歡喜地把專案部署到 Vercel 或是 Render 的免費方案 (Serverless 或會自動休眠的環境) 之後,你會發現一個殘酷的事實:你的鬧鐘永遠不會響了!老闆再也沒收到報表!

這章我們將為你解開雲端部署最大的雷區,並教你企業級的解法。


⚠️ 為什麼雲端的 Cronjob 會失效?(Serverless 的原罪)

像 Vercel 這種 Serverless 架構,或是 Render 的免費主機,它們為了節省資源,都有一個特性:「沒有人呼叫 API 時,主機就會自動休眠 (Sleep) 或銷毀 (Scale to Zero)。

這就像是你把鬧鐘設好後,放進了一個會自動關機的保險箱裡。 你的 FastAPI 程式在沒人打卡的時候,根本不在記憶體裡執行!既然程式都關機了,裡面的 APScheduler 當然也就死掉了,時間到了也沒辦法觸發。

💡 企業級解法:從外部觸發 (External HTTP Trigger)

既然伺服器內部會睡著,我們就不能依賴內部的鬧鐘。 業界標準的解法是:把鬧鐘裝在外面,時間到了,從外面拿大聲公 (發送 HTTP Request) 去把伺服器叫醒,並執行任務!

我們需要做兩件事:

  1. 在 FastAPI 開一支專門用來執行排程邏輯的 API 端點 (例如 POST /api/cron/daily-report)。
  2. 利用雲端平台內建的 Cron 服務 (如 Vercel Cron, GitHub Actions, 或第三方 Cron-job.org),每天定時去打這支 API。

🛠️ 第一步:把排程邏輯變成 API 端點

首先,我們要把原本寫在 APScheduler 裡面的邏輯,搬出來變成一支可以被外部呼叫的 API,並加上簡單的安全鎖,防止駭客亂打。

🔥【Vibe Prompt 實戰咒語】 我原本在 FastAPI 用 APScheduler 寫了一個 daily_report 的定時任務,但我現在要部署到 Serverless 環境。 請幫我: 1. 把產生報表與發送 Line 的邏輯,移到一支獨立的 API 路由:POST /api/cron/daily-report 裡面。 2. 為了安全性,請在這個路由加上一個 Header 驗證機制 (例如 Authorization: Bearer <CRON_SECRET>)。 只有知道這把 Secret Key 的系統,才能成功觸發這支 API。若驗證失敗回傳 401。

修改後的程式碼會長這樣,非常乾淨:

from fastapi import FastAPI, Depends, HTTPException, Header
import os

app = FastAPI()
CRON_SECRET = os.getenv("CRON_SECRET") # 自己設定一組超長亂碼

# 驗證 Secret 的警衛
def verify_cron_secret(authorization: str = Header(None)):
    if not authorization or authorization != f"Bearer {CRON_SECRET}":
        raise HTTPException(status_code=401, detail="Unauthorized Cron Trigger")

# 把排程任務變成一個隱藏的 API 端點,並加上警衛保護
@app.post("/api/cron/daily-report", dependencies=[Depends(verify_cron_secret)])
async def trigger_daily_report():
    print("⏰ [API 觸發] 開始結算每日遲到報表...")
    
    # ... 在這裡執行撈資料庫與 Line 推播的邏輯 ...
    
    return {"message": "Daily report triggered successfully."}

☁️ 第二步:設定雲端鬧鐘 (Vercel Cron / Render Cron)

現在你的 API 準備好了,你只要告訴雲端平台:「每天晚上六點,幫我打這支 API,記得帶上 Secret 鑰匙」。

情境 A:如果你部署在 Vercel

Vercel 內建了非常強大的 Cron 服務。你只要在專案根目錄建立一個 vercel.json 檔案。

🔥【Vibe Prompt 實戰咒語】 我要在 Vercel 設定 Cronjob 去打我剛剛寫好的 /api/cron/daily-report。 請給我一份 vercel.json 的設定檔,設定為每天台灣時間晚上 18:00 觸發 (注意時區轉換為 UTC)。

AI 會產出以下設定檔:

{
  "crons": [
    {
      "path": "/api/cron/daily-report",
      "schedule": "0 10 * * *" 
    }
  ]
}
// 註:Cron 語法 "0 10 * * *" 代表 UTC 時間早上 10 點,等同於台灣時間 (UTC+8) 的晚上 18 點。

部署上去後,Vercel 就會準時在背景發送請求喚醒你的伺服器!

情境 B:免費的第三方定時器 (Cron-job.org)

如果你不想依賴特定平台,你可以去註冊一個極度佛心且免費的老牌服務 cron-job.org

  1. 在後台點擊 Create Cronjob。
  2. 網址填寫你正式上線的 API:https://你的網域.com/api/cron/daily-report
  3. 執行時間選擇:每天的 18:00 (選擇 Asia/Taipei 時區)。
  4. 在進階設定 (Advanced) 的 HTTP Headers 中,加上 Authorization: Bearer <你的CRON_SECRET>
  5. 存檔!這家德國公司就會成為你最忠實的鬧鐘員工。

🎉 line-punch-system 後端實戰結業!

太神了!你現在已經擁有了一個完整、具備高度防禦力與自動化能力的後端大腦。

它能透過 Webhook 接收 LINE 訊息、能透過 Haversine 公式計算 GPS 防作弊距離,能阻擋惡意的偽造 Token,現在還能每天半夜自動幫老闆結算報表!這套前後端分離的 LINE 打卡系統架構,其價值遠遠超過市面上幾萬塊的接案專案。你可以盡情地修改它、包裝它,賣給身邊開餐廳、開咖啡廳的朋友!

接下來的最後一個系列,我們將踏入 2026 年最前沿、最具爆發力的領域:多智能體協作 (CrewAI Multi-Agents)。帶你體驗當「虛擬 AI 公司大老闆」的快感!準備好我們就出發吧!

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!