教學課程:檢查 Step Functions 數中的狀態機器執行 - AWS Step Functions

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

教學課程:檢查 Step Functions 數中的狀態機器執行

在本教學課程中,您將學習如何檢查 [執行詳細資訊] 頁面上顯示的執行資訊,並檢視執行失敗的原因。然後,您將學習如何訪問Map狀態執行的不同迭代。最後,您將學習如何在 [表格] 檢視上設定資料行,並套用適當的篩選器,以便只檢視您感興趣的資訊。

在本教程中,您將創建一個標準類型狀態機,該狀態機獲得一組水果的價格。為此,狀態機使用三個 AWS Lambda 函數,它們返回四個水果的隨機列表,每種水果的價格以及水果的平均成本。如果水果的價格小於或等於閾值,則 Lambda 函數旨在拋出錯誤。

注意

下列程序包含如何檢查「標準」工作流程執行詳細資訊的指示,但您也可以檢查 Express 工作流程執行的詳細資訊。如需有關「標準」和「快速」工作流程類型執行詳細資訊之間差異的資訊,請參閱檢視 Step Functions 中工作流程執行詳細

步驟 1:建立並測試所需的 Lambda 函數

  1. 開啟 L ambda 主控台,然後執行步驟 1:建立 Lambda 函數本節中的步驟 1 到 4。確保命名 Lambda 函數GetListOfFruits

  2. 建立 Lambda 函數後,複製頁面右上角顯示的函數的 Amazon 資源名稱 (ARN)。若要複製ARN,請按一下複製圖示以複製 Lambda 函數的 Amazon 資源名稱。下面是一個例子ARN,其中 功能名 是 Lambda 函數的名稱 (在本例中為GetListOfFruits):

    arn:aws:lambda:us-east-1:123456789012:function:function-name
  3. 將 Lambda 函數的下列程式碼複製到GetListOfFruits頁面的程式碼原始碼區域。

    function getRandomSubarray(arr, size) { var shuffled = arr.slice(0), i = arr.length, temp, index; while (i--) { index = Math.floor((i + 1) * Math.random()); temp = shuffled[index]; shuffled[index] = shuffled[i]; shuffled[i] = temp; } return shuffled.slice(0, size); } exports.handler = async function(event, context) { const fruits = ['Abiu','Açaí','Acerola','Ackee','African cucumber','Apple','Apricot','Avocado','Banana','Bilberry','Blackberry','Blackcurrant','Jostaberry']; const errorChance = 45; const waitTime = Math.floor( 100 * Math.random() ); await new Promise( r => setTimeout(() => r(), waitTime)); const num = Math.floor( 100 * Math.random() ); // const num = 51; if (num <= errorChance) { throw(new Error('Error')); } return getRandomSubarray(fruits, 4); };
  4. 選擇 [部署],然後選擇 [測試] 以部署變更並查看 Lambda 函數的輸出。

  5. 使用下列步驟建立兩個CalculateAverage分別命名GetFruitPrice和的其他 Lambda 函數:

    1. 將下列程式碼複製到 GetFruitPriceLambda 函數的程式碼原始碼區域中:

      exports.handler = async function(event, context) { const errorChance = 0; const waitTime = Math.floor( 100 * Math.random() ); await new Promise( r => setTimeout(() => r(), waitTime)); const num = Math.floor( 100 * Math.random() ); if (num <= errorChance) { throw(new Error('Error')); } return Math.floor(Math.random()*100)/10; };
    2. 將下列程式碼複製到 CalculateAverageLambda 函數的程式碼原始碼區域中:

      function getRandomSubarray(arr, size) { var shuffled = arr.slice(0), i = arr.length, temp, index; while (i--) { index = Math.floor((i + 1) * Math.random()); temp = shuffled[index]; shuffled[index] = shuffled[i]; shuffled[i] = temp; } return shuffled.slice(0, size); } const average = arr => arr.reduce( ( p, c ) => p + c, 0 ) / arr.length; exports.handler = async function(event, context) { const errors = [ "Error getting data from DynamoDB", "Error connecting to DynamoDB", "Network error", "MemoryError - Low memory" ] const errorChance = 0; const waitTime = Math.floor( 100 * Math.random() ); await new Promise( r => setTimeout(() => r(), waitTime)); const num = Math.floor( 100 * Math.random() ); if (num <= errorChance) { throw(new Error(getRandomSubarray(errors, 1)[0])); } return average(event); };
    3. 請務必複製這兩個 Lambda 函數,然後部署測試它們。ARNs

步驟 2:創建並執行狀態機

使用 Step Functions 主控台建立狀態機器,以叫用您在步驟 1 中建立的 Lambda 函數。在此狀態機中,定義了三種Map狀態。這些MapTask態中的每一個都包含會叫用其中一個 Lambda 函數的狀態。此外,在每個Task狀態中定義一個Retry欄位,其中包含針對每個狀態定義的重試次數。如果Task狀態遇到執行階段錯誤,它會再次執行,直到為此定義的重試嘗試次數為止Task

  1. 開啟 Step Functions 主控台,然後選擇 [以程式碼撰寫工作流程]。

    重要

    確保狀態機與先前建立的 Lambda 函數位於相同的 AWS 帳戶和區域。

  2. 對於「類型」,保留「標準」的預設選項。

  3. 複製下列 Amazon 各州語言定義,並將其貼到「定義」下。請務必將ARNs顯示的項目取代為先前建立的 Lambda 函數。

    { "StartAt": "LoopOverStores", "States": { "LoopOverStores": { "Type": "Map", "Iterator": { "StartAt": "GetListOfFruits", "States": { "GetListOfFruits": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:GetListofFruits:$LATEST", "Payload": { "storeName.$": "$" } }, "Retry": [ { "ErrorEquals": [ "States.ALL" ], "IntervalSeconds": 2, "MaxAttempts": 1, "BackoffRate": 1.3 } ], "Next": "LoopOverFruits" }, "LoopOverFruits": { "Type": "Map", "Iterator": { "StartAt": "GetFruitPrice", "States": { "GetFruitPrice": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:GetFruitPrice:$LATEST", "Payload": { "fruitName.$": "$" } }, "Retry": [ { "ErrorEquals": [ "States.ALL" ], "IntervalSeconds": 2, "MaxAttempts": 3, "BackoffRate": 1.3 } ], "End": true } } }, "ItemsPath": "$", "End": true } } }, "ItemsPath": "$.stores", "Next": "LoopOverStoreFruitsPrice", "ResultPath": "$.storesFruitsPrice" }, "LoopOverStoreFruitsPrice": { "Type": "Map", "End": true, "Iterator": { "StartAt": "CalculateAverage", "States": { "CalculateAverage": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:Calculate-average:$LATEST", "Payload.$": "$" }, "Retry": [ { "ErrorEquals": [ "States.ALL" ], "IntervalSeconds": 2, "MaxAttempts": 2, "BackoffRate": 1.3 } ], "End": true } } }, "ItemsPath": "$.storesFruitsPrice", "ResultPath": "$.storesPriceAverage", "MaxConcurrency": 1 } } }
  4. 輸入狀態機的名稱。保留此頁面上其他選項的預設選項,然後選擇建立狀態機器

  5. 打開標題為您的狀態機名稱的頁面。執行步驟 4:運行狀態機區段中的步驟 1 到 4,但使用下列資料做為執行輸入:

    { "stores": [ "Store A", "Store B", "Store C", "Store D" ] }

步驟 3:檢視狀態機執行詳細資料

在標題為執行 ID 的頁面上,您可以查看執行結果並對任何錯誤進行除錯。

  1. (選擇性) 從「執行詳細資訊」頁面上顯示的標籤中選擇,以查看每個標籤中的資訊。例如,若要檢視狀態機器輸入及其執行輸出,請在 [執摘要] 區段中選擇 [執行輸入和輸出]。

  2. 如果狀態機執行失敗,請在錯誤訊息上選擇「原因」或「顯示步驟詳細資料」。有關錯誤的詳細資訊會顯示在「步驟詳細資訊」區段中。請注意,造成錯誤的步驟 (名為TaskGetListofFruits狀態) 會在「圖形」檢視和「表格」檢視中反白顯示。

    注意

    由於GetListofFruits步驟是在狀Map態內定義的,且步驟無法順利執行,因此狀態步驟的 Map狀態」 步驟會顯示為「失敗」。

步驟 4:探索不同的查看模式

您可以選擇偏好的模式來檢視狀態機工作流程或執行事件歷程記錄。您可以在這些「檢視」模式下執行的一些工作如下:

如果您的 Map 狀態有五個反覆項目,而您想要檢視第三個和第四個反覆項目的執行詳細資訊,請執行下列動作:

  1. 選擇您要檢視其版序資料的Map狀態。

  2. 從「對映版序檢視器」中,選擇您要檢視的版序。迭代從零開始計數。若要從五個版序中選擇第三個版序,請從「地圖」狀態名稱旁邊的下拉式清單中選擇 #2

    注意

    如果您的狀態機器包含巢狀Map狀態,Step Functions 會將父和子Map狀態的反覆項目顯示為兩個單獨的下拉式清單,表示巢狀狀態的反覆運算資料。

  3. (選擇性) 如果一或多個Map狀態版序無法執行或處於中止狀態停止,您可以檢視有關失敗版序的詳細資訊。若要查看這些詳細資訊,請在下拉式清單中的 [失敗] 或 [中] 下選擇受影響的版序編號。

如果您的 Map 狀態有五個版序,而您想要檢視版序號 3 和 4 的執行詳細資訊,請執行下列操作:

  1. 選擇您要檢視其他版序資料的Map狀態。

  2. 在狀態版序的樹Map狀檢視顯示中,針對第三版序選擇名為 #2 的版序列。同樣地,為版序號四選擇名為 #3 的列。

選擇設定圖示。然後,在「偏好設定」對話方塊中,選擇要在「選取可見欄」下顯示的欄

依預設,此模式會顯示 [名稱]、[類型]、[狀態]、[資源] 和 [在下列時間後開始] 欄

根據屬性 (例如「狀態」 或日期和時間範圍) 套用一或多個篩選條件,以限制顯示的資訊量。例如,若要檢視執行失敗的步驟,請套用下列篩選器:

  1. 選擇「依內容篩選」或「依關鍵字搜尋」,然後在「內容」下選擇「狀態

  2. 在「運算子」下選擇「狀態 =」。

  3. 選擇「狀態 = 失敗」。

  4. (選擇性) 選擇「清除篩選」以移除套用的篩選器。

根據屬性 (例如「類型」或日期和時間範圍) 套用一或多個篩選器,以限制顯示的資訊量。例如,若要檢視執行失敗的Task狀態步驟,請套用下列篩選器:

  1. 選擇「依內容篩選」或「依關鍵字搜尋」,然後在「內容」下選擇「類型

  2. 在「運算子」下選擇「類型 =」。

  3. 選擇「類型 =」 TaskFailed。

  4. (選擇性) 選擇「清除篩選」以移除套用的篩選器。

選擇TaskFailed事件 ID 旁邊的箭頭圖示以檢查其詳細資訊,包括出現在下拉式方塊中的輸入、輸出和資源叫用。