本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在Step Functions 中查看 X-Ray 跟踪
在本教程中,您将学习如何使用 X-Ray 跟踪运行状态机时发生的错误。您可以使用Amazon X-Ray来可视化状态机的组件、确定性能瓶颈以及对导致错误的请求进行故障排除。在本教程中,您将创建多个随机产生错误的 Lambda 函数,然后可以使用 X-Ray 对其进行跟踪和分析。
本创建使用 Lambda 的 Step Functions 状态机教程将引导您创建调用 Lambda 函数的状态机。如果您已完成该教程,请跳到步骤 2 并使用您之前创建的Amazon Identity and Access Management (IAM) 角色。
第 1 步:为 Lambda 创建一个 IAM 角色
Amazon Lambda 和 Amazon Step Functions 均可执行代码和访问 Amazon 资源 (例如,存储在 Amazon S3 存储桶中的数据)。为了保持安全性,您必须为 Lambda 和 Step Functions 授予对这些资源的访问权限。
Lambda 要求您在创建 Lambda 函数时分配Amazon Identity and Access Management (IAM) 角色,就像 Step Functions 要求您在创建状态机时分配 IAM 角色一样。
您可以使用 IAM 控制台创建服务相关角色。
创建角色(控制台)
登录 Amazon Web Services Management Console,打开 IAM 控制台:https://console.aws.amazon.com/iam/
。 -
在 IAM 控制台的导航窗格中,选择角色。然后选择 Create role (创建角色)。
-
选择Amazon服务角色类型,然后选择 Lambda。
-
选择 L ambda 用例。使用案例由服务定义以包含服务所需的信任策略。然后选择 Next: Permissions (下一步:权限)。
-
选择一个或多个要附加到角色的权限策略(例如
AWSLambdaBasicExecutionRole
)。请参阅 Amazon Lambda 权限模型。选中用于分配您希望角色拥有的权限的策略旁的框,然后选择 Next: Review。
-
输入 Role name。
-
(可选) 对于 Role description,编辑新服务相关角色的描述。
-
检查该角色,然后选择创建角色。
第 2 步:创建 Lambda 函数
您的 Lambda 函数将随机抛出错误或超时,生成要在 X-Ray 中查看的示例数据。
确保您的 Lambda 函数与状态机位于同一个Amazon账户和Amazon区域。
-
打开 Lambda 控制台
并选择创建函数。 -
在创建函数部分中,选择从头开始创作。
-
在基本信息部分中,配置您的 Lambda 函数:
-
对于 Function name(函数名称),请输入
TestFunction1
。 -
对于 “运行时”,选择 Node.js 12.x。
-
对于 Role (角色),选择 Choose an existing role (选择现有角色)。
-
对于现有角色,选择您之前创建的 Lambda 角色。
注意 如果您创建的 IAM 角色未出现在列表中,则该角色可能仍需要几分钟才能传播到 Lambda。
-
选择 Create function(创建函数)。
创建您的 Lambda 函数时,请注意页面右上角的亚马逊资源名称 (ARN)。例如:
arn:aws:lambda:us-east-1:123456789012:function:TestFunction1
-
-
将 Lambda 函数的以下代码复制到第
TestFunction1
页的函数代码部分。function getRandomSeconds(max) { return Math.floor(Math.random() * Math.floor(max)) * 1000; } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } exports.handler = async (event, context) => { if(getRandomSeconds(4) === 0) { throw new Error("Something went wrong!"); } let wait_time = getRandomSeconds(5); await sleep(wait_time); return { 'response': true } };
此代码会创建随机定时故障,这些故障将用于在状态机中生成示例错误,可以使用 X-Ray 跟踪进行查看和分析。
-
选择 Save(保存)。
第 3 步:再创建两个 Lambda 函数
再创建两个 Lambda 函数。
-
重复步骤 2,再创建两个 Lambda 函数。对于下一个函数,在函数名称中输入
TestFunction2
。对于最后一个函数,在函数名称中输入TestFunction3
。 -
在 Lambda 控制台中,检查您现在是否有三个 Lambda 函数
TestFunction1
TestFunction2
、和TestFunction3
。
第 4 步:创建状态机
使用 Ste p Functions 控制台Task
状态的状态机。每个Task
状态都将引用您的三个 Lambda 函数中的一个。
-
打开 Ste p Functions 控制台
并选择 “创建状态机”。 -
在 Define state machine (定义状态机) 页面上,选择 Author with code snippets (使用代码段创作)。对于 Type(类型),选择 Standard(标准)。
注意 状态机、执行和活动名称的长度必须为 1—80 个字符,对于您的账户和Amazon区域必须是唯一的,并且不得包含以下任何内容:
-
空格
-
通配符 (
? *
) -
方括号字符 (
< > { } [ ]
) -
特殊字符 (
: ; , \ | ^ ~ $ # % & ` "
) -
控制字符(
\\u0000
-\\u001f
或\\u007f
-\\u009f
)。
如果您的状态机是 Express 类型,则可以为状态机的多次执行提供相同的名称。Step Functions 会为每次 Express 状态机执行生成唯一的执行 ARN,即使多个执行具有相同的名称。
Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于亚马逊 CloudWatch。为确保您可以跟踪 CloudWatch 指标,请选择仅使用 ASCII 字符的名称。
-
-
在状态机定义窗格中,将示例替换为以下状态机定义。对于每个
Task
任务状态,请使用您之前创建的相应 Lambda 函数的 ARN,如以下示例所示。{ "StartAt": "CallTestFunction1", "States": { "CallTestFunction1": { "Type": "Task", "Resource": "
arn:aws:lambda:us-east-1:123456789012:function:test-function1
", "Catch": [ { "ErrorEquals": [ "States.TaskFailed" ], "Next": "AfterTaskFailed" } ], "Next": "CallTestFunction2" }, "CallTestFunction2": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:test-function2
", "Catch": [ { "ErrorEquals": [ "States.TaskFailed" ], "Next": "AfterTaskFailed" } ], "Next": "CallTestFunction3" }, "CallTestFunction3": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:test-function3
", "TimeoutSeconds": 5, "Catch": [ { "ErrorEquals": [ "States.Timeout" ], "Next": "AfterTimeout" }, { "ErrorEquals": [ "States.TaskFailed" ], "Next": "AfterTaskFailed" } ], "Next": "Succeed" }, "Succeed": { "Type": "Succeed" }, "AfterTimeout": { "Type": "Fail" }, "AfterTaskFailed": { "Type": "Fail" } } }这是使用亚马逊状态语言对您的状态机的描述。它定义了三个名为
CallTestFunction1
、CallTestFunction2
和的Task
状态CallTestFunction3
。每个函数都会调用您的三个 Lambda 函数中的一个。有关更多信息,请参阅状态机结构。选择 Next(下一步)。
-
输入 Name (名称),例如
。TraceFunctions
-
创建或输入 IAM 角色:
-
要为 Step Functions 创建 IAM 角色,请选择为我创建 IAM 角色,然后为您的角色输入名称。
-
如果您之前为状态机创建了具有正确权限的 IAM 角色,请选择选择现有 IAM 角色。从列表中选择一个角色,或为该角色提供 ARN。
注意 如果您删除 Step Functions 创建的 IAM 角色,Step Functions 以后将无法重新创建该角色。同样,如果您修改角色(例如,通过从 IAM 策略中的委托人中删除 Step Functions),Step Functions 以后将无法恢复其原始设置。
-
-
在 “跟踪” 窗格中,确保选中 “启用 X-Ray 追踪”。这将允许您查看状态机的 X-Ray 轨迹。
-
选择 Create state machine (创建状态机)。
步骤 5:启动新的执行
创建状态机后,开始执行。
-
在
TraceFunctions
页面上,选择 “开始执行”。此时将显示 New execution 页面。
(可选)要识别您的执行,可以在 “名称” 框中为其指定名称。默认情况下,Step Functions 会自动生成一个唯一的执行名称。
注意 Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于亚马逊 CloudWatch。为确保您可以跟踪 CloudWatch 指标,请选择仅使用 ASCII 字符的名称。
-
选择 Start Execution (开始执行)。
此时将启动新的状态机执行,并显示一个说明正在运行的执行的新页面。运行多次(至少三次)执行。
-
执行完成后,点击 X-Ray 追踪图链接。您可以在执行仍在运行时查看跟踪,但您可能希望在查看 X-Ray 跟踪图之前查看执行结果。
-
查看服务图以确定错误发生的位置、高延迟的连接或失败请求的追踪。在此示例中,您可以看到每个函数接收了多少流量。
TestFunction2
被调用的频率超过TestFunction3
,TestFunction1
被调用的频率是的两倍多TestFunction2
。服务地图根据成功调用与错误和故障的比率为每个节点显示颜色,从而指示节点的运行状况:
-
绿色表示成功调用
-
红色表示服务器故障 (500 系列错误)
-
黄色表示客户端错误 (400 系列错误)
-
紫色表示限制错误 (429 请求过多)
您也可以选择一个服务节点来查看对该节点的请求,或者选择两个节点之间的边缘来查看通过该连接传输的请求。
-
-
查看 X-Ray 追踪图,查看每次执行时发生了什么。Timeline (时间线) 视图显示分段和子分段的层次结构。列表中的第一个条目为分段,表示服务为单个请求记录的所有数据。分段的下一级是子分段。此示例显示了 Lambda 函数记录的子分段。
有关理解 X-Ray 轨迹和使用带Step Functions 的 X-Ray 的更多信息,请参阅Amazon X-Ray和 Step Functions