在 Step Functions 中查看 X-Ray 跟踪 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

在 Step Functions 中查看 X-Ray 跟踪

在本教程中,您将学习如何使用 X-Ray 跟踪运行状态机时出现的错误。您可以使用Amazon X-Ray以可视化您的状态机的组件、识别性能瓶颈并对导致错误的请求进行故障排除。在本教程中,您将创建几个随机产生错误的 Lambda 函数,然后您可以使用 X-Ray 跟踪和分析这些函数。

这些区域有:创建 Step Functions 状态机器这使用 Lambda教程将引导您创建一个调用 Lambda 函数的状态机。如果你已经完成了该教程,请跳到步骤 2然后使用Amazon Identity and Access Management(IAM) 角色。

第 1 步:为 Lambda 创建 IAM 角色

Amazon Lambda 和 Amazon Step Functions 均可执行代码和访问 Amazon 资源 (例如,存储在 Amazon S3 存储桶中的数据)。为了保持安全性,您必须授予 Lambda 和 Step Functions 对这些资源的访问权限。

Lambda 要求您分配Amazon Identity and Access Management创建 Lambda 函数时 (IAM) 角色,其方式与您创建状态机时 Step Functions 要求您指定 IAM 角色相同。

您可以使用 IAM 控制台创建服务相关角色。

创建角色(控制台)

  1. 登录 Amazon Web Services Management Console,打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在 IAM 控制台的导航窗格中,选择角色。然后选择 Create role (创建角色)

  3. 选择Amazon服务选择角色类型,然后选择Lambda.

  4. 选择Lambda使用案例。使用案例由服务定义以包含服务所需的信任策略。接下来,选择 Next (下一步)Permissions (下一步:权限)

  5. 选择一个或多个要附加到角色的权限策略(例如,AWSLambdaBasicExecutionRole)。请参阅 Amazon Lambda 权限模型

    选中分配您希望角色拥有的权限的策略旁边的框,然后选择后续:审核

  6. 输入 Role name

  7. (可选) 对于 Role description,编辑新服务相关角色的描述。

  8. 检查该角色,然后选择创建角色

第 2 步:创建 Lambda 函数

您的 Lambda 函数将随机抛出错误或超时,从而生成示例数据以供在 X-Ray 中查看。

重要

确保您的 Lambda 函数处于相同之下Amazon账户和Amazon区域作为您的状态机。

  1. 打开Lambda 控制台然后选择创建函数.

  2. 创建函数部分中,选择从头开始创作

  3. 基本信息部分中,配置您的 Lambda 函数:

    1. 对于 Function name (函数名称),请输入 TestFunction1

    2. 适用于运行时,选择Node.js 12.x.

    3. 对于 Role (角色),选择 Choose an existing role (选择现有角色)

    4. 适用于现有角色,选择您之前创建的 Lambda 角色.

      注意

      如果您创建的 IAM 角色未显示在列表中,该角色可能仍需要几分钟才能传播到 Lambda。

    5. 选择 Create function(创建函数)。

      创建您的 Lambda 函数后,记下页面右上角的亚马逊资源名称 (ARN)。例如:

      arn:aws:lambda:us-east-1:123456789012:function:TestFunction1
  4. 将以下 Lambda 函数的代码复制到函数代码的 部分测试函数 1页.

    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 跟踪查看和分析。

  5. 选择 Save (保存)

第 3 步:再创建两个 Lambda 函数

再创建两个 Lambda 函数。

  1. 重复步骤 2 以再创建两个 Lambda 函数。对于下一个函数,请在函数名称输入TestFunction2. 对于最后一个函数,在函数名称输入TestFunction3.

  2. 在 Lambda 控制台中,检查您现在是否有三个 Lambda 函数,TestFunction1TestFunction2, 和TestFunction3.

第 4 步:创建状态机

使用Step Functions 控制台创建一个包含三个状态机Task状态。EACHTask州将引用你的三个 Lambda 函数之一。

  1. 打开Step Functions 控制台然后选择创建状态机.

  2. Define state machine (定义状态机) 页面上,选择 Author with code snippets (使用代码段创作)。对于 Type(类型),选择 Standard(标准)。

    注意

    状态机、执行和活动名称的长度必须为 1-80 个字符,对于您的账户必须是唯一的,Amazon区域,且不得包含以下任何内容:

    • 空格

    • 通配符 (? *

    • 括号字符 (< > { } [ ]

    • 特殊字符 (: ; , \ | ^ ~ $ # % & ` "

    • 控制字符 (\\u0000-\\u001f要么\\u007f-\\u009f)。

    Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于 Amazon CloudWatch。为确保您可以跟踪 CloudWatch 指标,请选择仅使用 ASCII 字符的名称。

  3. 状态机定义窗格中,将示例替换为以下状态机定义。对于每个Task任务状态,使用的 ARN您之前创建的相应 Lambda 函数,如以下示例所示。

    { "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" } } }

    这是使用亚马逊状态机的说明。它定义了三个Task已命名的州CallTestFunction1CallTestFunction2CallTestFunction3. 每个函数都调用你的三个 Lambda 函数之一。有关更多信息,请参阅状态机结构

    选择下一步

  4. 输入 Name (名称),例如 TraceFunctions

  5. 创建或输入 IAM 角色:

    • 要为 Step Functions 创建 IAM 角色,请选择为我创建 IAM 角色,然后输入名称为了您的角色。

    • 如果您之前创建了 IAM 角色选择您的状态机的正确权限后,选择选择现有 IAM 角色. 从列表中选择一个角色,或者为该角色提供 ARN。

    注意

    如果您删除 Step Functions 创建的 IAM 角色,Step Functions 在以后无法重新创建它。同样,如果您修改角色 (例如,通过在 IAM 策略中从委托人删除 Step Functions),Step Functions 在以后无法还原其原始设置。

  6. 跟踪窗格中,请确保启用 X-Ray已选择跟踪。这将让你查看状态机的 X-Ray 痕迹。

  7. 选择 Create state machine (创建状态机)

第 5 步:启动新的执行

在创建您的状态机后,开始执行。

  1. 在存储库的跟踪函数页面上,选择开始执行.

    此时将显示 New execution 页面。

  2. (可选) 为了帮助识别您的执行,您可以在输入执行名称。如果未输入 ID,Step Functions 将自动生成一个唯一 ID。

    注意

    Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于 Amazon CloudWatch。为确保您可以跟踪 CloudWatch 指标,请选择仅使用 ASCII 字符的名称。

  3. 选择 Start Execution (开始执行)

    此时将启动新的状态机执行,并显示一个说明正在运行的执行的新页面。运行几次(至少三次)执行。

  4. 执行结束后,请遵循X-Ray 跟踪地图链接。您可以在执行仍在运行时查看跟踪,但是您可能希望在查看 X-Ray 追踪图之前查看执行结果。

    
                            启用 X-Ray
  5. 查看服务地图以识别错误发生的位置、具有高延迟的连接或针对不成功请求的跟踪。在此示例中,您可以查看每个函数接收的流量。TestFunction2被调用的频率比TestFunction3, 和TestFunction1被称为频率的两倍以上TestFunction2.

    服务地图根据成功调用与错误和故障的比率为每个节点显示颜色,从而指示节点的运行状况:

    • 绿色表示成功调用

    • 红色表示服务器故障 (500 系列错误)

    • 黄色表示客户端错误 (400 系列错误)

    • 紫色表示限制错误 (429 请求过多)

    
                            启用 X-Ray

    您还可以选择服务节点以查看对该节点的请求,或者选择两个节点之间的边缘以查看经历该连接的请求。

  6. 查看 X-Ray 追踪图以查看每次执行的情况。Timeline (时间线) 视图显示分段和子分段的层次结构。列表中的第一个条目为分段,表示服务为单个请求记录的所有数据。分段的下一级是子分段。此示例显示了 Lambda 函数记录的子分段。

    
                            启用 X-Ray

有关了解 X-Ray 和使用具有 Step Functions 的 X-Ray 的更多信息,请参阅Amazon X-Ray和 Step Functions