使用 AWS Step Functions 和 AWS Lambda 创建无服务器工作流

概述

在本教程中,您将学习如何使用 AWS Step Functions 设计和运行可协调多个 AWS Lambda 函数的无服务器工作流。AWS Lambda 是一项计算服务,让您无需预配或管理服务器即可运行代码。

在我们的示例中,您是一名开发人员,需要创建一个无服务器应用程序,用于自动处理呼叫中心收到的支持工单。尽管您可以让一个 Lambda 函数调用另一个函数,但您担心随着呼叫中心应用程序变复杂,管理所有这类连接将变得越来越具有挑战性。另外,对应用程序流程进行任何更改都需要在多个位置进行更改,并且您最终可能会反复编写相同的代码。

为了应对这一挑战,您决定使用 AWS Step Functions。Step Functions 是一项无服务器编排服务,可助您将多个 Lambda 函数轻松协调到易于调试和更改的灵活工作流中。Step Functions 将为您触发和跟踪应用程序的每个步骤,从而使您的 Lambda 函数不受其他逻辑的影响。

要完成的目标

在本教程中,您将:

  • 创建一个 Step Functions 状态机来描述当前的呼叫中心流程
  • 创建几个简单的 Lambda 函数来模拟支持团队的任务
  • 在每个 Lambda 函数之间传递数据以跟踪支持案例的进度
  • 对您的工作流执行多项测试以观察该工作流如何对不同的输入进行响应
  • 删除本教程中使用的 AWS 资源

前提条件

若要完成本教程,您需要一个 AWS 账户。如果您还没有账户,请参阅 设置 AWS 环境入门指南。

在本教程中,您将使用 AWS Step Functions 和 AWS Lambda。这些服务均可通过 AWS Free Tier 免费试用。

 AWS 使用经验

新手

 完成时间

10 分钟

  所需费用

可通过 Free Tier 免费试用。

 前提条件

AWS 账户

*过去 24 小时内创建的账户可能无法使用此项目所需的资源。

 使用的服务

 上次更新时间

2022 年 11 月 11 日

操作步骤

步骤 1:创建 AWS Identity and Access Management (IAM) 角色

AWS IAM 是一项 Web 服务,可帮助您安全管控对 AWS 资源的访问权限。在此步骤中,您将创建一个允许 Step Functions 访问 Lambda 的 IAM 角色。

a. 打开 IAM 管理控制台。在左侧导航窗格中选择 Roles(角色),然后点击 Create role(创建角色)。

b. 在 Create role(创建角色)页面的 Trusted entity type(受信任实体类型)下面,使 AWS service(AWS 服务)保持选中状态。在 Use case(使用场景)下面的下拉菜单中搜索 Step Functions,然后选择 Step Functions。点击 Next(下一步)。

c. 在 Add permissions(添加权限)部分中,点击 Next(下一步)。

d. 在 Name, review, and create(命名、查看和创建)部分的 Role name(角色名称)中,输入 step_functions_basic_execution。点击 Create role(创建角色)。

步骤 2:创建状态机和无服务器工作流

第一步是设计一个工作流来描述您想要如何处理呼叫中心收到的支持工单。工作流将流程描述为一系列可以重复执行的离散任务。

您可以与呼叫中心主管坐下来讨论一下处理支持案例的最佳做法。使用 Step Functions 中的可视化工作流,在直观的界面上一起定义工作流。

然后,您将在 AWS Step Functions 中设计工作流。您的工作流将执行一系列任务,例如,调用一个 AWS Lambda 函数来创建支持案例,并调用另一个函数将该案例分配给支持代表进行解决。您的工作流还将在 Lambda 函数之间传递数据,以跟踪正在处理的支持案例的状态。

a. 打开 AWS Step Functions 控制台。选择 Write your workflow in code(使用代码编写工作流)。

b. 将状态机定义窗口的内容替换为下面的 Amazon States Language (ASL) 状态机定义。Amazon States Language 是基于 JSON 的结构化语言,用于定义状态机。

此状态机使用一系列 Task(任务)状态来打开、分配和处理支持案例。然后,使用一个 Choice(选项)状态来确定该案例能否关闭。接着,再使用两个 Task(任务)状态,可根据需要关闭或上报支持案例。

{
  "Comment": "A simple AWS Step Functions state machine that automates a call center support session.",
  "StartAt": "Open Case",
  "States": {
    "Open Case": {
        "Type": "Task",
        "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
        "Next": "Assign Case"
   },
   "Assign Case": {
        "Type": "Task",
        "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
        "Next": "Work on Case"
   },
   "Work on Case":{
        "Type": "Task",
        "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
        "Next": "Is Case Resolved"
   },
   "Is Case Resolved": {
        "Type" : "Choice",
        "Choices": [
            {
             "Variable": "$.Status",
             "NumericEquals": 1,
             "Next": "Close Case"
            },
            {
             "Variable": "$.Status",
             "NumericEquals": 0,
             "Next": "Escalate Case"
            }
        ]
   },
   "Close Case": {
        "Type": "Task",
        "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
        "End": true
  },
   "Escalate Case": {
        "Type": "Task",
        "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
        "Next": "Fail"
  },
    "Fail": {
        "Type": "Fail",
        "Cause": "Engage Tier 2 Support." }
  }
}

c. 点击刷新按钮以将 ASL 状态机定义显示为可视化工作流。在我们的场景中,您可以与呼叫中心主管一起检查可视化工作流,以便轻松验证流程描述是否正确。点击 Next(下一步)。

d. 在 State machine name(状态机名称)文本框中,输入 CallCenterStateMachine

e. 在 Permissions(权限)下面,选择 Choose an existing role(选择现有角色),然后从下拉菜单中选择 step_functions_basic_execution

f. 在页面底部,点击 Create state machine(创建状态机)。

步骤 3:创建 Lambda 函数

您现已创建状态机,可以决定它如何执行任务了。您可以将状态机连接到环境中已存在的 Lambda 函数和其他微服务,或者创建新的 Lambda 函数和微服务。在本教程中,您将创建一些简单的 Lambda 函数,以模拟用于处理支持案例的各步骤(如将案例分配给客户支持代表)。

a. 打开 AWS Lambda 控制台。点击 Create function(创建函数)。

b. 选择 Author from scratch(从头开始创作)。

c. 使用以下设置来配置第一个 Lambda 函数:

Name(名称)– OpenCaseFunction。

Runtime(运行时)– Node.js 16.x。

Execution role(执行角色)– Create a new role with basic Lambda permissions(创建一个具有基本 Lambda 权限的新角色)

d. 点击 Create function(创建函数)。

e. 将 Function code(函数代码)窗口的内容替换为以下代码,然后点击 Deploy(部署)。

exports.handler = (event, context, callback) => {
    // Create a support case using the input as the case ID, then return a confirmation message   
   var myCaseID = event.inputCaseID;
   var myMessage = "Case " + myCaseID + ": opened...";   
   var result = {Case: myCaseID, Message: myMessage};
   callback(null, result);    
};

f. 在页面顶部,选择 Functions(函数)。

g. 使用在步骤 3c 中创建的 lambda_basic_execution IAM 角色重复步骤 3b 到 3d,以创建另外四个 Lambda 函数。

将 AssignCaseFunction 定义为:

exports.handler = (event, context, callback) => {    
    // Assign the support case and update the status message    
    var myCaseID = event.Case;    
    var myMessage = event.Message + "assigned...";    
    var result = {Case: myCaseID, Message: myMessage};
    callback(null, result);        
};

将 WorkOnCaseFunction 定义为:

exports.handler = (event, context, callback) => {    
    // Generate a random number to determine whether the support case has been resolved, then return that value along with the updated message.
    var min = 0;
    var max = 1;    
    var myCaseStatus = Math.floor(Math.random() * (max - min + 1)) + min;
    var myCaseID = event.Case;
    var myMessage = event.Message;
    if (myCaseStatus == 1) {
        // Support case has been resolved    
        myMessage = myMessage + "resolved...";
    } else if (myCaseStatus == 0) {
        // Support case is still open
        myMessage = myMessage + "unresolved...";
    } 
    var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
    callback(null, result); 
};

将 CloseCaseFunction 定义为:

exports.handler = (event, context, callback) => { 
    // Close the support case    
    var myCaseStatus = event.Status;    
    var myCaseID = event.Case;    
    var myMessage = event.Message + "closed.";    
    var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
    callback(null, result);
};

将 EscalateCaseFunction 定义为:

exports.handler = (event, context, callback) => {    
    // Escalate the support case 
    var myCaseID = event.Case;    
    var myCaseStatus = event.Status;    
    var myMessage = event.Message + "escalating.";    
    var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
    callback(null, result);
};

完成时,您应当拥有五个 Lambda 函数。

步骤 4:填充工作流

下一步是用刚创建的 Lambda 函数填充 Step Functions 工作流中的任务状态。

a. 打开 AWS Step Functions 控制台。在 State machines(状态机)页面上,选择 CallCenterStateMachine,然后点击 Edit(编辑)。

b. 在 CallCenterStateMachine 页面上,点击 Edit(编辑)。

c. 在状态机的 Definition(定义)部分中,在 Open Case(打开案例)状态下查找以 Resource 开头的行。

将 ARN 替换为您的 OpenCaseFunction 的 ARN。

如果您选择示例 ARN,则系统会显示您账户中 AWS Lambda 函数的列表,您可以从该列表中选择示例 ARN。

d. 重复上一步,更新状态机中 Assign Case(分配案例)Work on Case(处理案例)Close Case(关闭案例)和 Escalate Case(上报案例)任务状态的 Lambda 函数 ARN,然后点击 Save(保存)。

步骤 5:执行工作流

您的无服务器工作流现已准备好执行任务。状态机执行是工作流的一个实例,每次都在 Step Functions 状态机运行并执行其任务时出现。每个 Step Functions 状态机都可以有多个同步状态机执行,您可以从 Step Functions 控制台启动状态机执行(下一步将这样做),也可以使用 AWS SDK、Step Functions API 操作或 AWS CLI 启动状态机执行。状态机执行接收 JSON 输入并生成 JSON 输出。

a. 点击 Start execution(启动执行)。

b. 系统会出现 New execution(新建执行)对话框。若要为支持案例提供 ID,请在 Input(输入)窗口的 New execution(新建执行)对话框中输入以下内容,然后点击 Start execution(启动执行)。

{
  "inputCaseID": "001"
}

c. 当工作流执行时,Visual workflow(可视化工作流)窗格中每个步骤的颜色都会改变。等几秒钟,待执行完成后,在 Execution details(执行详细信息)窗格中选择 Execution input(执行输入)和 Execution output(执行输出)以查看工作流的输入内容和输出结果。

d. 向下滚动到 Execution event history(执行事件历史记录)部分。点击执行的每个步骤,查看 Step Functions 如何调用 Lambda 函数并在函数之间传递数据。

e. 根据 WorkOnCaseFunction 的输出,您的工作流可以通过两种方式结束:一是解决支持案例并关闭工单,二是将工单上报给上一级支持人员。您可以多次重复运行所执行的工作流,以观察其对应的不同行为。在此图所示的工作流执行中,上报支持案例导致工作流以 Fail(失败)状态退出。

在实际场景中,您可能会决定继续处理案例,直到它得以解决,而不是因失败而退出工作流。为此,您可以删除 Fail(失败)状态并编辑状态机中的 Escalate Case(上报案例)任务,以重新回到 Work On Case(处理案例)状态。您无需对 Lambda 函数进行任何更改。我们在本教程中构建的函数只是示例,因此我们将移至本教程的下一步。

步骤 6:清除资源

在此步骤中,您将终止 AWS Step Functions 和 AWS Lambda 资源。

重要说明:为了避免产生意外费用,最佳做法是终止不再需要的活动资源。 

a. 在 AWS Step Functions 控制台窗口的顶部,选择 State machines(状态机)。

b. 在 State machines(状态机)窗口中,选择 CallCenterStateMachine,然后点击 Delete(删除)。为了确认您想要删除此状态机,请在出现的对话框中点击 Delete state machine(删除状态机)。当 Step Functions 确认任何正在处理的执行已完成后,您的状态机将在一两分钟内被删除。

c. 在 AWS Lambda 控制台的 Functions(函数)页面上,选择您为本教程创建的每个函数,选择 Actions(操作),然后选择 Delete(删除)。再次选择 Delete(删除)以确认删除。

最后,您将删除 IAM 角色。在 IAM 控制台的 Roles(角色)页面中,在搜索框中输入 step,选择 step_functions_basic_execution,然后点击 Delete(删除)。

您现在可以退出 AWS 管理控制台了。

结论

恭喜您!您刚刚借助可调用多个 AWS Lambda 函数的 AWS Step Functions 创建了一个无服务器工作流。您的工作流根据您定义的逻辑协调所有函数,并将数据从一种状态传递到另一种状态,这意味着您无需将该代码分别写入每个函数。

此页内容对您是否有帮助?

后续步骤

您现已了解如何设计和运行无服务器工作流,可以尝试另一个教程,以创建带有 Catch(捕获)字段的 AWS Step Functions 状态机。Catch(捕获)字段使用 AWS Lambda 函数通过基于错误消息类型的条件逻辑进行响应。这是一种称为函数错误处理的技术。