本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:在 Step Functions 中检查状态机的执行情况
在本教程中,您将学习如何检查执行详细信息 页面上显示的执行信息并查看执行失败的原因。然后,您将学习如何访问 Map
状态执行的不同迭代。最后,您将学习如何在表格视图上配置列,以及如何应用合适的筛选条件来仅查看您感兴趣的信息。
在本教程中,您将创建一个标准类型的状态机,用于获取一组水果的价格。为此,状态机使用三个 AWS Lambda 函数,分别返回四个水果的随机列表、每种水果的价格以及水果的平均成本。如果水果的价格小于或等于阈值,Lambda 函数就会出错。
注意
虽然以下过程包含有关如何检查标准工作流执行详细信息的说明,但您也可以检查快速工作流执行的详细信息。有关标准工作流和快速工作流类型执行详细信息的差异,请参阅在 Step Functions 中查看工作流程执行细节。
第 1 步:创建并测试所需的 Lambda 函数
-
打开 Lambda 控制台
,然后执行第 1 步:创建 Lambda 函数部分中的第 1 步至第 4 步。确保将 Lambda 函数命名为 GetListOfFruits
。 -
创建 Lambda 函数后,复制页面右上角显示的函数的 Amazon 资源名称 (ARN)。要复制ARN,请单击复制图标复制 Lambda 函数的亚马逊资源名称。以下是一个示例ARN,其中
是 Lambda 函数的名称(在本例中为):函数名
GetListOfFruits
arn:aws:lambda:us-east-1:123456789012:function:
function-name
-
将以下 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); };
-
选择部署,然后选择测试,部署更改并查看 Lambda 函数的输出。
-
按照以下步骤创建另外两个 Lambda 函数,分别命名为
GetFruitPrice
和CalculateAverage
:-
将以下代码复制到 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; };
-
将以下代码复制到 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); };
-
请务必复制这两个 Lambda 函数中的,然后对其进行部署和测试。ARNs
-
第 2 步:创建并执行状态机
使用 Step Functions 控制台Map
状态。每个 Map
状态都包含一个调用 Lambda 函数的 Task
状态。此外,每个 Task
状态都定义了一个 Retry
字段,并为每个状态定义了重试次数。如果一个 Task
状态遇到运行时错误,则会再次执行该状态,但不得超过为此 Task
定义的重试次数。
-
打开 Step Functions 控制台
,然后选择用代码编写工作流。 重要
确保您的状态机与您之前创建的 Lambda 函数位于相同的 AWS 账户和区域下。
-
对于类型,保留默认的标准选择。
-
复制以下 Amazon States Language 定义并将其粘贴到定义下。请务必将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 步:运行状态机部分中的第 1 步至第 4 步,但使用以下数据作为执行输入:
{ "stores": [ "Store A", "Store B", "Store C", "Store D" ] }
第 3 步:查看状态机执行详细信息
在标题为执行 ID 的页面上,您可以查看执行结果并调试任何错误。
第 4 步:探索不同的视图模式
您可以选择首选模式来查看状态机工作流或执行事件历史记录。在这些视图模式 下可以执行的部分任务如下:
如果您的 Map 状态有五次迭代,并且您想要查看第三次和第四次迭代的执行详细信息,请执行以下操作:
-
选择要查看其迭代数据的
Map
状态。 -
在 Map 迭代查看器中,选择要查看的迭代。迭代从零开始计数。要从五次迭代中选择第三次迭代,请从 Map 状态名称旁边的下拉列表中选择 #2。
注意
如果您的状态机包含嵌套
Map
状态,Step Functions 会将父Map
状态和子状态迭代显示为两个单独的下拉列表,分别代表嵌套状态的迭代数据。 -
(可选)如果一次或多次
Map
状态迭代未能执行或停止在中止状态,则可以查看有关失败迭代的详细信息。要查看这些详细信息,请在下拉列表的失败或已中止下选择受影响的迭代编号。
如果您的 Map 状态有五次迭代,并且您想要查看第三次和第四次迭代的执行详细信息,请执行以下操作:
-
选择要查看其不同迭代数据的
Map
状态。 -
在
Map
状态迭代的树视图显示中,选择名为 #2 的迭代行,打开第三次迭代。同样,选择名为 #3 的行,打开第四次迭代。
选择设置图标。然后,在首选项对话框中,在选择可见列下选择要显示的列。
默认情况下,此模式显示名称、类型、状态、资源和之后开始列。
通过应用一个或多个基于属性(如状态)或日期和时间范围的筛选条件,来限制显示的信息量。例如,要查看执行失败的步骤,请应用以下筛选条件:
-
选择按属性筛选或按关键词搜索,然后在属性下选择状态。
-
在运算符下,选择状态 =。
-
选择状态 = Failed。
-
(可选)选择清除筛选条件,移除已应用的筛选条件。
通过应用一个或多个基于属性(如类型)或日期和时间范围的筛选条件,来限制显示的信息量。例如,要查看执行失败的 Task
状态步骤,请应用以下筛选条件:
-
选择按属性筛选或按关键词搜索,然后在属性下选择类型。
-
在运算符下,选择类型 =。
-
选择类型 = TaskFailed。
-
(可选)选择清除筛选条件,移除已应用的筛选条件。
选择TaskFailed事件 ID 旁边的箭头图标可查看其详细信息,包括出现在下拉框中的输入、输出和资源调用。