建立無伺服器工作流程

使用 AWS Step Functions 和 AWS Lambda

在本教學中,您將學習如何使用 AWS Step Functions 設計和執行協調多個 AWS Lambda 函數的無伺服器工作流程。AWS Lambda 是一種運算服務,可讓您執行程式碼,而無需佈建或管理伺服器。

在我們的範例中,您是一名開發人員,已要求您建立無伺服器應用程式來自動處理客服中心中的支援票證。雖然您可以讓一個 Lambda 函數呼叫另一個函數,但您擔心在客服中心應用程式變得更複雜時,管理所有這些連線會成為一種挑戰。此外,應用程式流程中的任何變更都需要在多個裝置中進行變更,且您最終可以反覆編寫相同的程式碼。

若要解決此挑戰,您可以決定使用 AWS Step Functions。Step Functions 是一種無伺服器協調服務,可讓您輕鬆地將多個 Lambda 函數協調為易於偵錯和變更的彈性工作流程。Step Functions 將透過為您觸發和追蹤您的應用程式的每個步驟,來使 Lambda 函數不受其他邏輯的影響。

在接下來的 10 分鐘內,您將建立 Step Functions 狀態機器來描述目前呼叫中心流程,建立一些簡易 Lambda 函數來模擬支持團隊的任務,並在每個 Lambda 函數之間傳遞資料以追蹤支援案例的進度。然後,您將對工作流程執行幾次測試,以觀察工作流程如何回應不同的輸入。最後,您將刪除教學中使用的 AWS 資源。

在本教學中,您將使用 AWS Step FunctionsAWS Lambda。這些服務都納入 AWS 免費方案。

本教學需要 AWS 帳戶

Step Functions 或 Lambda 無須額外付費。您在本教學建立的資源符合免費方案資格。 

進一步了解免費方案 >>


步驟 1.建立狀態機器和無伺服器工作流程

第一步是設計工作流程,用於描述您希望如何在客服中心處理支援票證。工作流程將程序描述為可以反覆重複的一系列離散任務。

您可以與客服中心經理一起坐下來討論處理支援案例的最佳實務。將 Step Functions 中的視覺化工作流程用作直覺式參考,您可以一起定義工作流程。

然後,您將在 AWS Step Functions 中設計您的工作流程。您的工作流程將呼叫一個 AWS Lambda 函數來建立支援案例,叫用另一個函數將案例指派給支援代表進行解決等等。也會在 Lambda 函數之間傳遞資料,以追蹤正在處理的支援案例的狀態。


a.開啟 AWS Step Functions 主控台。選取使用程式碼片段編寫。在名稱文字方塊中,輸入 CallCenterStateMachine

01c

(按一下以放大)


b. 將狀態機器定義視窗的內容取代為下面的 Amazon States Language (ASL) 狀態機器定義。Amazon States Language 是用於定義您的狀態機器的 JSON 型結構化語言。

此狀態機器使用一系列任務狀態來開啟、指派和處理支援案例。然後,「選擇」狀態用於判斷是否可以關閉案例。然後,又有兩個任務狀態根據需要關閉或升級支援案例。

 

{
  "Comment": "A simple AWS Step Functions state machine that automates a call center support session.",
  "StartAt": "Open Case",
  "States": {
    "Open Case": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next": "Assign Case"
    }, 
    "Assign Case": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next": "Work on Case"
    },
    "Work on Case": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next": "Is Case Resolved"
    },
    "Is Case Resolved": {
        "Type" : "Choice",
        "Choices": [ 
          {
            "Variable": "$.Status",
            "NumericEquals": 1,
            "Next": "Close Case"
          },
          {
            "Variable": "$.Status",
            "NumericEquals": 0,
            "Next": "Escalate Case"
          }
      ]
    },
     "Close Case": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "End": true
    },
    "Escalate Case": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next": "Fail"
    },
    "Fail": {
      "Type": "Fail",
      "Cause": "Engage Tier 2 Support."    }   
  }
}
03b

(按一下以放大)


c.按一下「重新整理」按鈕以將 ASL 狀態機器定義顯示為視覺化工作流程。在我們的案例中,您可以透過與客服中心經理一起檢閱視覺化工作流程,來輕鬆驗證是否正確描述程序。

d.按一下下一步

03c

(按一下以放大)


步驟 2.建立 AWS Identity and Access Management (IAM) 角色

AWS IAM 是一種 Web 服務,可協助您安全地控制對 AWS 資源的存取。在此步驟中,您將建立允許 Step Functions 存取 Lambda 的 IAM 角色。


a.在另一個瀏覽器視窗中,開啟 AWS 管理主控台。在畫面載入時,在搜尋列中輸入 IAM,然後選取 IAM 以開啟服務主控台。

02a

(按一下以放大)


b.按一下角色,然後按一下建立角色

02b

(按一下以放大)


c.在建立角色畫面上,將 AWS 服務保持選取的狀態,選取 Step Functions,然後按一下下一步:許可。在下一個畫面上,按一下下一步:檢閱

02c

(按一下以放大)


d.在角色名稱中輸入 step_functions_basic_execution,然後選擇建立角色。在下一個畫面上,按一下下一步:檢閱

02d

(按一下以放大)


e.您的角色即已建立並顯示在清單中。選取您的角色名稱以檢視它。 

02e

(按一下以放大)


f.複製下一個畫面上的角色 ARN

02f

(按一下以放大)


步驟 3.將 IAM 角色新增至狀態機器

接下來,您將向 AWS Step Functions 中的狀態機器新增建立的 IAM 角色 ARN。


a.使用 Step Functions 主控台選取瀏覽器標籤。

b.將您複製的 ARN 貼在 IAM 角色 ARN 文字方塊中。

c.按一下建立狀態機器

03a

(按一下以放大)


步驟 4.建立 AWS Lambda 函數

現在,您已建立狀態機器,您可以決定要如何執行工作。您可以將狀態機器連接至環境中已存在的 AWS Lambda 函數和其他微型服務,或建立新的微型服務。在本教學中,您將建立一些簡易 Lambda 函數,用於模擬處理支援呼叫的各種步驟,如將案例指派給客戶支援代表。


a.按一下服務,在搜尋文字方塊中輸入 Lambda,然後選取 Lambda 以開啟服務主控台。

04a

(按一下以放大)


b.按一下建立函數

04b

(按一下以放大)


c.選取從頭編寫

d.使用以下設定來設定您的第一個 Lambda 函數:

名稱OpenCaseFunction
執行時間Node.js 4.3
角色 - 建立自訂角色

此時會顯示新的 IAM 視窗。

e.對於角色名稱,請保留 lambda_basic_execution,然後按一下允許
系統會自動將您返回 Lambda 主控台。

f.按一下建立函數

04c

(按一下以放大)


g.將 函數程式碼視窗的內容取代為以下程式碼,然後按一下儲存

exports.handler = (event, context, callback) => {
    // Create a support case using the input as the case ID, then return a confirmation message   
   var myCaseID = event.inputCaseID;
   var myMessage = "Case " + myCaseID + ": opened...";   
   var result = {Case: myCaseID, Message: myMessage};
   callback(null, result);    
};
04d

(按一下以放大)


h.在頁面頂部,按一下函數

04e

(按一下以放大)


i.使用您在步驟 4c 中建立的 lambda_basic_execution IAM 角色重複步驟 4b-4d 以再建立 4 個 Lambda 函數。

AssignCaseFunction 定義為:

exports.handler = (event, context, callback) => {    
    // Assign the support case and update the status message    
    var myCaseID = event.Case;    
    var myMessage = event.Message + "assigned...";    
    var result = {Case: myCaseID, Message: myMessage};
    callback(null, result);        
};

WorkOnCaseFunction 定義為:

exports.handler = (event, context, callback) => {    
    // Generate a random number to determine whether the support case has been resolved, then return that value along with the updated message.
    var min = 0;
    var max = 1;    
    var myCaseStatus = Math.floor(Math.random() * (max - min + 1)) + min;
    var myCaseID = event.Case;
    var myMessage = event.Message;
    if (myCaseStatus == 1) {
        // Support case has been resolved    
        myMessage = myMessage + "resolved...";
    } else if (myCaseStatus == 0) {
        // Support case is still open
        myMessage = myMessage + "unresolved...";
    } 
    var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
    callback(null, result); 
};

CloseCaseFunction 定義為:

exports.handler = (event, context, callback) => { 
    // Close the support case    
    var myCaseStatus = event.Status;    
    var myCaseID = event.Case;    
    var myMessage = event.Message + "closed.";    
    var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
    callback(null, result);
};

EscalateCaseFunction 定義為:

exports.handler = (event, context, callback) => {    
    // Escalate the support case 
    var myCaseID = event.Case;    
    var myCaseStatus = event.Status;    
    var myMessage = event.Message + "escalating.";    
    var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
    callback(null, result);
};

在完成後,您應具有 5 個 Lambda 函數。

04f

(按一下以放大)


步驟 5.填寫您的工作流程

下一步是使用您剛建立的 Lambda 函數填寫您的 Step Functions 工作流程中的任務狀態。


a.按一下服務,在搜尋文字方塊中輸入 Step,然後選取 Step Functions 以開啟服務主控台。

05a

(按一下以放大)


b.在狀態機器畫面上,選取您的 CallCenterStateMachine,然後按一下編輯

05b

(按一下以放大)


c.在狀態機器定義區段中,在開啟案例狀態下面尋找以 Resource 開頭的行。

將 ARN 取代為您的 OpenCaseFunction 的 ARN。

如果按一下範例 ARN,您的帳戶中的 AWS Lambda 函數清單會出現,且您可以從清單中選取函數。

05c

(按一下以放大)


d.重複上一步以在您的狀態機器中對指派案例處理案例關閉案例升級案例任務狀態更新 Lambda 函數 ARN,然後按一下儲存

05d

(按一下以放大)


步驟 6.執行您的工作流程

您的無伺服器工作流程現在已準確好執行。狀態機器執行是您的工作流程的執行個體,每次 Step Functions 狀態機器運作並執行任務時發生。每個 Step Functions 狀態機器都可以同時執行多項作業,您可以透過 Step Functions 主控台 (您將在下一步執行它) 或使用 AWS 開發套件、Step Functions API 動作或 AWS CLI 啟動。執行會接收 JSON 輸入並產生 JSON 輸出。


a.按一下開始執行

06a

(按一下以放大)


b.此時會顯示「新執行」對話方塊。若要為您的支援案例提供 ID,請在輸入視窗中輸入「新執行」對話方塊下面的內容,然後按一下開始執行

{
"inputCaseID": "001"
}
06b

(按一下以放大)


c.在您的工作流程執行時,每個步驟都會變更視覺化工作流程窗格中的色彩。等待幾秒鐘讓執行完成。然後,在執行詳細資訊窗格中,按一下輸入輸出以檢視您的工作流程的輸入和結果。

06c

(按一下以放大)


d.Step Functions 可讓您檢查您的工作流程執行的每個步驟,包括每種狀態的輸入和輸出。按一下您的工作流程中的每個任務,然後展開「步驟詳細資訊」下的輸入輸出欄位。您可以看到系統會將您在狀態機器中輸入的案例 ID 從每個步驟傳遞至下一步,並且在每個 Lambda 函數完成工作時會更新此訊息。

06d

(按一下以放大)


e.向下捲動至執行事件歷史記錄區段。按一下執行的每個步驟,以查看 Step Functions 如何呼叫 Lambda 函數以及在函數之間傳遞資料。

06e

(按一下以放大)


f.視 WorkOnCaseFunction 的輸出而定,您的工作流程可能已透過解決支援案例並關閉票證,或將票證呈報給下一級支援而結束。您可以再進行幾次此執行,以觀察這種不同的行為。此影像顯示已呈報支援案例的工作流程的執行,此案例導致工作流程結束且狀態為「失敗」。

在現實案例中,您可以決定繼續處理該案例直至解決為止,而不是因失敗而結束工作流程。因此,您可以移除「失敗」狀態,然後在您的狀態機器中編輯升級案例任務以回到處理案例狀態。無需變更您的 Lambda 函數。我們為本教學建置的函數只是範例,因此我們將繼續進行本教學的下一步。

06f

(按一下以放大)


步驟 7.終止您的資源

在此步驟中,您將終止您的 AWS Step Functions 和 AWS Lambda 相關資源。

重要:終止非使用中的資源可降低成本,這是最佳實務。未終止資源可能產生費用。


a.在 AWS Step Functions 主控台視窗頂部,按一下狀態機器

07a

(按一下以放大)


b.在狀態機器視窗中,選取 CallCenterStateMachine,然後按一下刪除。若要確認您要刪除狀態機器,請在顯示的對話方塊中按一下刪除狀態機器。在 Step Functions 確認所有處理中的執行都已完成後,您的狀態機器將在一兩分鐘內刪除。

07b

(按一下以放大)


c.接下來,您將刪除您的 Lambda 函數。在 AWS 管理主控台功能表中按一下服務,然後選取 Lambda

07c

(按一下以放大)


d.在函數畫面中,按一下您為此教學建立的每個函數,然後依序選取動作刪除。透過再次按一下刪除來確認刪除。

07d

(按一下以放大)


e.最後,您將刪除您的 IAM 角色。在 AWS 管理主控台功能表中按一下服務,然後選取 IAM

07e

(按一下以放大)


f.選取您為此教學建立的兩個 IAM 角色,然後按一下刪除角色。透過按一下對話方塊中的是,刪除以確認刪除。


您現在可以登出 AWS 管理主控台。

07f

(按一下以放大)


恭喜您!

不錯! 您剛使用 AWS Step Functions 建立可觸發多個 AWS Lambda 函數的無伺服器工作流程。您的工作流程已根據您定義的邏輯為您協調您的所有函數,並將資料從一種狀態傳遞至另一種狀態,這意味著您無需將該程式碼寫入每個個別函數。

現在,您已了解如何設計和執行無伺服器工作流程,接著可以進行下一個教學,以了解如何使用 Step Functions 處理 Lambda 函數錯誤。您將建立一個具有「重試」和「快取」欄位的狀態機器,這些欄位根據錯誤訊息類型回應來自模擬 API 的回應程式碼,該方法稱為函數錯誤處理。