Step Functions
🔥 Vibe Prompt
「建立一個 Step Functions 工作流程:訂單處理流程為驗證→付款→出貨→通知。」
{
"Comment": "Order Processing Workflow",
"StartAt": "ValidateOrder",
"States": {
"ValidateOrder": {
"Type": "Task",
"Resource": "arn:aws:lambda:validate-order",
"Next": "ProcessPayment"
},
"ProcessPayment": {
"Type": "Task",
"Resource": "arn:aws:lambda:process-payment",
"Next": "CheckPaymentResult",
"Retry": [{
"ErrorEquals": ["TransactionError"],
"IntervalSeconds": 5,
"MaxAttempts": 3,
"BackoffRate": 2
}]
},
"CheckPaymentResult": {
"Type": "Choice",
"Choices": [{
"Variable": "$.payment.status",
"StringEquals": "SUCCESS",
"Next": "ShipOrder"
}],
"Default": "HandleFailure"
},
"ShipOrder": {
"Type": "Task",
"Resource": "arn:aws:lambda:ship-order",
"Next": "SendNotification",
"Catch": [{
"ErrorEquals": ["States.ALL"],
"Next": "HandleFailure"
}]
},
"SendNotification": {
"Type": "Task",
"Resource": "arn:aws:lambda:send-email",
"End": true
},
"HandleFailure": {
"Type": "Task",
"Resource": "arn:aws:lambda:handle-failure",
"End": true
}
}
}
可視化工作流程
Validate → Payment → [Choice] → Ship → Notify → Done
↓
Handle Failure
Step Functions 功能
| 功能 | 用途 | |------|------| | Retry | 暫時性錯誤(指數退避 3 次) | | Catch | 永久性失敗 → DLQ | | Choice | 條件分支 | | Parallel | 平行處理 | | Wait | 延遲(例如等待 24 小時退貨) | | Map | 處理列表中的項目 |
Terraform 部署
resource "aws_sfn_state_machine" "order_workflow" {
name = "order-processing"
role_arn = aws_iam_role.stepfunctions.arn
definition = file("workflow.json")
}
Step Functions vs Lambda
| Step Functions | Lambda | |---------------|--------| | 長時間執行(最多 1 年) | 短時間(最多 15 分鐘) | | 編排 | 單一任務 | | 圖形化除錯 | 程式碼除錯 | | 內建重試/例外處理 | 自訂重試邏輯 |
Step Functions 最被低估的功能:Callback Pattern
大部分教學只教你 Task、Choice、Parallel,但 Callback with Task Token 才是讓 Step Functions 能處理真實世界流程的關鍵。
{
"StartAt": "ApproveOrder",
"States": {
"ApproveOrder": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke.waitForTaskToken",
"Parameters": {
"FunctionName": "arn:aws:lambda:send-approval-request",
"Payload": {
"token.$$": "$$.Task.Token",
"order_id.$": "$.order_id"
}
},
"Next": "CheckApproval",
"TimeoutSeconds": 86400
},
"CheckApproval": {
"Type": "Choice",
"Choices": [
{"Variable": "$.approved", "BoolEquals": true, "Next": "ProcessPayment"}
],
"Default": "RejectOrder"
}
}
}
這個 Pattern 的威力:等待外部人員手動批准。Lambda 把 Task Token 傳給前端,使用者在 App 上點「核准」或「拒絕」,前端呼叫 send_task_success() 來恢復流程。整個等待期間(最長一年!)Step Functions 不會 timeout。
為什麼要學 Step Functions?
跨服務的商業流程最難處理的就是「失敗時怎麼辦」。Step Functions 用 JSON 定義流程,內建 Retry(指數退避)、Catch(錯誤處理)、Timeout,而且每次執行都有完整的視覺化歷史記錄——哪一步失敗、輸入是什麼、重試了幾次,一目瞭然。
如何應用在真實專案?
| 場景 | 使用 Step Functions 的好處 | |:----|:-------------------------| | 訂單處理 | 驗證→付款→出貨→通知,每一步獨立重試 | | 多步驟註冊 | Email 驗證→填資料→審核→開通 | | 影片轉檔 | 上傳→轉 HLS→產生縮圖→更新資料庫 | | 資料 ETL | 擷取→轉換→載入,中間失敗可從中斷點續傳 | | IoT 裝置管理 | 註冊→設定→測試→啟用,需要長時間等待 |
接下來學什麼
你已經學完了 Lambda、DynamoDB、EventBridge、Step Functions 這四個 Serverless 核心服務。下一章 完整無伺服器應用 將把它們全部整合在一起——從認證、API、資料庫、檔案上傳到非同步處理、監控,打造一個真正可以在 production 上運作的 SaaS 應用。