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 應用。

解鎖完整教學內容

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