建立無伺服器工作流程
使用 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 Functions 和 AWS Lambda。這些服務都納入 AWS 免費方案。
步驟 1.建立狀態機器和無伺服器工作流程
第一步是設計工作流程,用於描述您希望如何在客服中心處理支援票證。工作流程將程序描述為可以反覆重複的一系列離散任務。
您可以與客服中心經理一起坐下來討論處理支援案例的最佳實務。將 Step Functions 中的視覺化工作流程用作直覺式參考,您可以一起定義工作流程。
然後,您將在 AWS Step Functions 中設計您的工作流程。您的工作流程將呼叫一個 AWS Lambda 函數來建立支援案例,叫用另一個函數將案例指派給支援代表進行解決等等。也會在 Lambda 函數之間傳遞資料,以追蹤正在處理的支援案例的狀態。
a.開啟 AWS Step Functions 主控台。選取使用程式碼片段編寫。在名稱文字方塊中,輸入 CallCenterStateMachine。
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." }
}
}
步驟 2.建立 AWS Identity and Access Management (IAM) 角色
AWS IAM 是一種 Web 服務,可協助您安全地控制對 AWS 資源的存取。在此步驟中,您將建立允許 Step Functions 存取 Lambda 的 IAM 角色。
a.在另一個瀏覽器視窗中,開啟 AWS 管理主控台。在畫面載入時,在搜尋列中輸入 IAM,然後選取 IAM 以開啟服務主控台。
步驟 3.將 IAM 角色新增至狀態機器
接下來,您將向 AWS Step Functions 中的狀態機器新增建立的 IAM 角色 ARN。
步驟 4.建立 AWS Lambda 函數
現在,您已建立狀態機器,您可以決定要如何執行工作。您可以將狀態機器連接至環境中已存在的 AWS Lambda 函數和其他微型服務,或建立新的微型服務。在本教學中,您將建立一些簡易 Lambda 函數,用於模擬處理支援呼叫的各種步驟,如將案例指派給客戶支援代表。
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);
};
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 函數。
步驟 5.填寫您的工作流程
下一步是使用您剛建立的 Lambda 函數填寫您的 Step Functions 工作流程中的任務狀態。
步驟 6.執行您的工作流程
您的無伺服器工作流程現在已準確好執行。狀態機器執行是您的工作流程的執行個體,每次 Step Functions 狀態機器運作並執行任務時發生。每個 Step Functions 狀態機器都可以同時執行多項作業,您可以透過 Step Functions 主控台 (您將在下一步執行它) 或使用 AWS 開發套件、Step Functions API 動作或 AWS CLI 啟動。執行會接收 JSON 輸入並產生 JSON 輸出。
步驟 7.終止您的資源
在此步驟中,您將終止您的 AWS Step Functions 和 AWS Lambda 相關資源。
重要:終止非使用中的資源可降低成本,這是最佳實務。未終止資源可能產生費用。
恭喜您!
不錯! 您剛使用 AWS Step Functions 建立可觸發多個 AWS Lambda 函數的無伺服器工作流程。您的工作流程已根據您定義的邏輯為您協調您的所有函數,並將資料從一種狀態傳遞至另一種狀態,這意味著您無需將該程式碼寫入每個個別函數。
現在,您已了解如何設計和執行無伺服器工作流程,接著可以進行下一個教學,以了解如何使用 Step Functions 處理 Lambda 函數錯誤。您將建立一個具有「重試」和「快取」欄位的狀態機器,這些欄位根據錯誤訊息類型回應來自模擬 API 的回應程式碼,該方法稱為函數錯誤處理。