教程:使用 Step Functions 控制台检查状态机执行情况 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

教程:使用 Step Functions 控制台检查状态机执行情况

在本教程中,您将学习如何检查 “执行详情” 页面上显示的执行信息,并查看执行失败的原因。然后,您将学习如何访问Map状态执行的不同迭版本。最后,您将学习如何配置表格视图上的列以及如何应用合适的过滤器以仅查看您感兴趣的信息。

在本教程中,您将创建一个标准类型的状态机,它获取一组水果的价格。为此,状态机使用三个Amazon Lambda函数,随机返回四个水果的列表、每种水果的价格和水果的平均成本。Lambda 函数旨在在水果价格小于或等于阈值时引发错误。

注意

虽然以下过程包含有关如何检查标准工作流执行细节的说明,但您也可以检查 Express 工作流执行的详细信息。有关标准工作流类型和 Express 工作流类型的执行详细信息之间差异的信息,请参阅在控制台中执行标准和快速工作流程

步骤 1:创建并测试所需的 Lambda 函数

  1. 打开 Lambda 控制台,然后执行该步骤 1:创建 Lambda 函数部分中的步骤 1 到 4。确保为 Lambda 函数命名GetListOfFruits

  2. 创您的 Lambda 函数后,复制页面右上角显示的该函数的亚马逊资源名称 (ARN)。要复制 ARN,请单击 
                            icon to copy the Lambda function's Amazon Resource Name
                        。以下是 ARN 示例,其中 function-nameLambda 函数的名称(在本例中为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. 选择 D eploy,然后选择 Test,部署更改并查看 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 函数的 ARN,然后部署测试它们。

步骤 2:创建并执行状态机

使用 Step Functions 控制台创建调用您在步骤 1 中创建的 Lambda 函数的状态机。在此状态机中,定义了三种Map状态。每种MapTask状态都包含一个调用您的 Lambda 函数的状态。此外,在每个状态中定义了一个Retry字段,并为每个Task状态定义了多次重试尝试。如果某个Task状态遇到运行时错误,则会再次执行该状态,直到为该状态定义的重试次数为止Task

  1. 打开 Ste p Functions 控制台并选择 “用代码编写工作流程”。

    重要

    确保您的状态机与您之前创建的 Lambda 函数位于同一个Amazon账户和区域。

  2. 对于 “类型”,保留 “标准” 的默认选择。

  3. 复制以下 Amazon States 语言定义并将其粘贴到 “定义” 下。确保将显示的 ARN 替换为您之前创建的 Lambda 函数的 ARN。

    { "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. 输入状态机的名称。保留此页面上其他选项的默认选择,然后选择 Create state machin e。

  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状态迭代显示为两个单独的下拉列表:

    
                                        图表视图模式组件的 Map 迭代查看器,显示一系列下拉列表,这些下拉列表表示嵌套Map状态的迭代数据。
  3. (可选)如果一次或多次Map状态迭代未能执行或在中止状态下停止,则可以查看有关失败迭代的详细信息。要查看这些详细信息,请在下拉列表中的 “失败” 或 “已中止” 下选择受影响的迭代次数。

如果您的 Map 状态有五次迭代,并且您想要查看第三和第四次迭代的执行详细信息,请执行以下操作:

  1. 选择要查看其不同迭数据的Map状态。

  2. Map状态迭代的树视图显示中,为第三次迭代选择名为 #2 的迭代行。同样,为第四次迭代选择名为 #3 的行。

选择 
                                    Icon to configure columns to display in the
                                            Table view.
                                。然后,在 “首选项” 对话框中,在 “选择可见列” 下选择要显示的列

默认情况下,此模式显示 “名称”、“类型”、“状态”、“资源” 和 “启动时间” 列。

通过基于属性(例如状态)或日期和时间范围应用一个或多个筛选器来限制显示的信息量。例如,要查看执行失败的步骤,请应用以下过滤器:

  1. 选择 “按属性筛选” 或 “按关键字搜索”,然后选择 “属性” 下的 “状态”。

  2. 在 “操作员” 下,选择 “状态 =”。

  3. 选择状态 = 失败

  4. (可选)选择 “清除过滤器” 以移除已应用的过滤器。

通过基于属性(例如类型)或日期和时间范围应用一个或多个筛选器来限制显示的信息量。例如,要查看执行失败的Task状态步骤,请应用以下过滤器:

  1. 选择 “按属性筛选” 或 “按关键字搜索”,然后选择 “属性” 下的 “类型”。

  2. 在 “运算符” 下,选择 “类型 =”。

  3. 选择类型 = TaskFailed

  4. (可选)选择 “清除过滤器” 以移除已应用的过滤器。

选择TaskFailed事件 ID 
                            icon to show input and output details about a specific event
                                step that appears in a dropdown box
                        旁边的按钮以检查其详细信息,包括下拉框中显示的输入、输出和资源调用。