Cloudflare Workflows 2026 計費怎麼算?用四個維度盤點 steps、state 與 instance 清理
Cloudflare Workflows 的成本不能只用「有幾個 instance」估算。官方 pricing 將 requests、CPU time、steps 與 storage 分成四個維度;而 2026 年 9 月的更新又補上了 delete() 與 deleteBatch(),讓你能主動清理不再需要的 instance state。
先講結論:steps、CPU 與 requests 是執行量,storage 是 instance state 的保留量;delete()/deleteBatch() 是清理 state 和停止執行的管理操作,不會把已經產生的 steps 或其他用量倒沖回去。刪除前要先分清楚 delete、terminate、pause 與 restart 的語意。
先分清楚四個計費維度
Cloudflare Workflows 的 pricing 頁面列出四個維度:CPU time、requests、storage 與 steps。這些指標回答的問題不同,不能只看 Workflow instance 數量推估成本。
| 維度 | 代表什麼 | 盤點方式 |
|---|---|---|
| Requests | 建立新的 Workflow instance 等 invocation | 看建立入口與每日/每月 instance 數 |
| CPU time | Workflow 實際執行的 CPU 毫秒數 | 看 CPU 使用量與高 CPU step |
| Steps | 執行的 step 數,包含等待操作 | 搜尋 step.do()、step.sleep()、step.waitForEvent() |
| Storage | 所有 instance 持久化的 state | 看 instance 數、state 大小與保留時間 |
官方特別說明,step count 不包含 rollback handlers 或 retries;但每個 Workflow 的步驟設計仍會影響執行路徑與 state。要做預估,不能只把程式碼裡出現的 step.do() 乘上 instance 數,還要把條件分支與等待流程列入。
Free 與 Paid 的額度
目前官方 Workflows pricing 列出的額度如下:
| 項目 | Workers Free | Workers Paid |
|---|---|---|
| Steps | 每日 3,000 | 每月含 500,000,超過後每 100,000 $0.80 |
| Storage | 含 1 GB-month | 每月含 1 GB,超過後每 GB-month $0.20 |
| Requests | 每日 100,000(與 Workers requests 共用) | 每月含 10,000,000,超過後每 1,000,000 $0.30 |
| CPU time | 每次 invocation 10 ms | 每月含 30,000,000 ms,超過每 1,000,000 ms $0.02 |
Paid plan 的 requests 與 CPU time 也有自己的月度包含額度;不能因為 steps 或 storage 有額度,就把整個 Workflow 視為零成本。正式帳單仍以 dashboard 與 pricing 頁面為準,因為方案額度與計費說明可能會更新。
Storage 怎麼算,為什麼 retention 很重要
Cloudflare 以 GB-month 計算 Workflow storage,並用 30 天計費期間內每日的 storage peak 取平均。running、errored、sleeping 與 completed instances 都可能計入;因此「流程已完成」不等於 state 立刻不佔 storage。
官方目前的預設 state retention 是 Free plan 3 天、Paid plan 30 天。若任務完成後不需要長期保留完整 state,可以評估更短的 retention,但要先確認事故排查、重試與稽核需求。刪除 instance 可以釋放它的 state,卻不是把過去已計入的 storage 用量或其他 SKU 費用回溯抹除。
我會為每種 Workflow 寫下這三個問題:
- 失敗的 instance 要保留多久,才足夠重現問題?
- 完成的 instance 是否需要保存完整輸出,還是只留外部資料的識別碼?
- state 裡是否放入不應長期保存的 token、個資或第三方回應?
不要為了少一點 storage 直接刪掉所有錯誤紀錄。先把敏感資料與可重建資料分開,再決定 retention,成本與可觀測性才不會互相犧牲。
delete() 與 deleteBatch() 解決什麼問題
2026 年 9 月的 Workflows 文件新增了兩種 instance 清理方式:
// 單一 instance:刪除 state,並停止正在執行的 instanceawait env.MY_WORKFLOW.delete(instanceId);
// 批次清理:一次最多 100 個 instance IDconst result = await env.MY_WORKFLOW.deleteBatch(instanceIds);// result: { deleted, errors }它們的共同語意是:刪除 instance 的持久化 state;如果 instance 正在執行,也會停止目前執行。刪除是破壞性操作,不會替你執行 rollback handlers,也不會讓程式在 self-delete 的 await 後繼續跑。若你只是想暫停、終止後保留狀態,或從頭重跑,應使用對應的 pause、terminate 或 restart API,而不是直接 delete。
deleteBatch() 一次接受 1 到 100 個 ID,回傳已刪除與錯誤項目的結果。批次清理前要先:
- 把要清理的 ID 寫入可追蹤的清單,避免把仍需稽核的 instance 混進去。
- 先排除重複 ID,並以最多 100 個分批。
- 保存
deleted與errors,對失敗項目做人工檢查或重新排程。 - 清理後回到 dashboard 檢查 state 用量,不要把 API 成功回應直接當成帳單已即時下降。
Wrangler 4.125.0 以上也能用 npx wrangler workflows instances delete 清理 instance,支援指定 ID、JSON 檔案中的 ID、latest 與 --local。實際執行前先用同版本的 --help 確認參數,並在 production 把 command、操作者與輸入清單留下紀錄。
Delete、terminate、pause、restart 怎麼選
| 操作 | 會不會刪 state | 會不會停止目前執行 | 適用情境 |
|---|---|---|---|
delete() | 會 | 會 | state 已不需要,或要做受控清理 |
deleteBatch() | 會 | 會 | 清理一批已確認不需保留的 instance |
terminate() | 不會立即刪掉 | 會 | 要停止流程,但仍需保留 instance 狀態 |
pause() | 不會 | 會暫停 | 暫時停止,之後要 resume() |
restart() | 依 API 語意重新執行 | 不是單純清理 | 要從既定流程重新開始 |
這張表的重點是成本和生命週期是兩個問題。若目標是減少未來 storage,delete 才是清理動作;若目標是暫停事故中的流程,先用 terminate 或 pause,避免因為刪除 state 而失去除錯證據。
先用四個數字做月度試算
可以把每個月超過包含額度的部分分開計算。以目前官方 pricing 的單位表示,概念公式如下:
steps = max(0, 月 steps - 500,000) / 100,000 × 0.80storage = max(0, GB-month - 1) × 0.20requests = max(0, 月 requests - 10,000,000) / 1,000,000 × 0.30cpu = max(0, CPU ms - 30,000,000) / 1,000,000 × 0.02例如一個月有 650,000 steps、1.5 GB-month、12,000,000 requests 和 35,000,000 CPU ms,四項超額的示意加總是 $1.20 + $0.10 + $0.60 + $0.10 = $2.00。這只是 Workflows 四個維度的估算,不包含其他 Workers 或帳號產品費用,正式帳單仍以 dashboard 與 pricing 頁面為準。
如果需要用量趨勢而不只看單次部署結果,請固定時間區間、Workflow 名稱與成功/失敗路徑,再比較調整 retention、步驟或清理策略前後的數據。不要只用刪除 API 的呼叫次數判斷成本是否下降。
先找出最容易放大用量的 Workflow
在 repository 根目錄做一次靜態盤點:
rg -n \ 'step\.(do|sleep|waitForEvent)|WorkflowInstanceCreateOptions|retention|deleteBatch' \ src test tests . \ --glob '!node_modules/**' \ --glob '!dist/**'接著把每個命中點放入三類:
- 高頻短任務:例如 webhook、排程或每次使用者操作都建立 instance。這類任務先看每日/每月 instance 數與固定 steps。
- 長時間等待:使用
step.sleep()或step.waitForEvent(),等待本身不會持續消耗 CPU,但可能讓 state 保留更久。 - 大 state 或長 retention:每個 instance 儲存大量輸出,或保留 errored、completed instance 的時間很長。這一類優先檢查 state 是否真的需要完整保存,再設計可審計的清理流程。
這個盤點的目的不是把所有步驟壓成一個函式。拆成 steps 能提供 retry、durable execution 與觀察性;要縮減的是沒有帶來可驗證邊界、卻反覆執行或保存過多資料的部分。
啟用前的驗證清單
- 在 Cloudflare dashboard 查看 Workflows usage,記下目前的 instance、steps、requests、CPU 與 state 趨勢。
- 為每個高頻 Workflow 計算一個完整成功流程的 steps,另外標示分支、重試與等待。
- 檢查 state 的平均大小與 retention;不要只看 instance 數量。
- 將 requests、CPU time、steps、storage 分成四欄,避免把不同 SKU 混成單一「每次執行成本」。
- 若要調整步驟、retention 或刪除策略,先在非正式環境驗證失敗恢復、人工等待與 dashboard 資料是否仍足夠。
- production 清理前先 dry-run 產生 ID 清單,核准後才呼叫
deleteBatch(),並保存錯誤結果。
真正要完成的不是把所有 Workflow 重寫,而是知道哪幾個流程會讓 steps 或 state 失去控制,並能用實際 dashboard 數字驗證調整結果。清理 API 是生命週期工具,不是成本回溯工具。
常見問題
Q: 刪除 instance 會把之前的 steps 或 requests 費用退回來嗎?
A: 不會。delete() 與 deleteBatch() 會刪除 state、停止目前執行並釋放後續 storage 佔用;已經發生的 steps、requests 或 CPU 使用量仍以帳單與 pricing 規則計算。
Q: step.sleep() 等待很久會一直增加 CPU time 嗎?
A: 不會。Cloudflare Workflows pricing 說明,等待 API 回應、step.sleep() 暫停或其他 idle 狀態不會產生 CPU time;但等待期間的 Workflow state 仍可能影響 storage,因此仍要看 retention 與 state 大小。
Q: deleteBatch() 一次可以刪多少個 instance?
A: 官方文件目前限制一次 1 到 100 個 ID。超過就要自行分批;每批都要保存 deleted 和 errors,不要只記錄整個 HTTP request 成功。
Q: 我只是想暫停流程,也可以直接用 delete() 嗎?
A: 不建議。delete 會移除 state,適合已確認不需要保留的 instance。若要保留狀態以便之後恢復或調查,先使用 pause、terminate 或其他生命週期 API。
參考資料: