创建无服务器工作流

利用 AWS Step Functions 和 AWS Lambda

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

在我们的示例中,您是一名开发人员,需要按照要求创建一个无服务器应用程序,以自动处理呼叫中心的支持服务单。虽然您可以让一个 Lambda 函数调用另一个 Lambda 函数,但您担心,随着呼叫中心应用程序变得越来越复杂,管理所有这些连接将变得越发具有挑战性。此外,应用程序流程如果发生任何更改,都需要在多个位置进行相应的更改,因此最终您可能需要不断重复编写相同的代码。

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

在接下来的 10 分钟时间里,您将创建一个 Step Functions 状态机以说明当前的呼叫中心流程,创建几个简单的 Lambda 函数来模拟支持团队的任务,并在各个 Lambda 函数之间传送数据以跟踪支持案例的进展情况。然后,您将对该工作流进行几次测试,观察它如何响应不同的输入。最后,删除本教程中使用的 AWS 资源。

在本教程中,您将使用 AWS Step FunctionsAWS Lambda。这两种服务都在 AWS 免费套餐范围内。

学习本教程需要用到 AWS 账户

Step Functions 或 Lambda 不收取任何额外费用。您在本教程中创建的资源符合免费套餐条件。 

详细了解免费套餐 >>


第 1 步:创建状态机和无服务器工作流

首先需要设计一个工作流,说明您希望如何在呼叫中心处理支持服务单。工作流将流程描述为一系列可以不断重复执行的单独任务。

您可以与呼叫中心经理会面讨论一下处理支持案例的最佳实践。使用 Step Functions 中的可视化工作流作为所定义的整体工作流的直观参考。

接下来,您将在 AWS Step Functions 中设计工作流。您的工作流将调用一个 AWS Lambda 函数来创建支持案例,调用另一个 Lambda 函数将案例分配给支持代表以进行解决,等等。该工作流还将在 Lambda 函数之间传送数据,以跟踪正在处理的支持案例的状态。


a.打开 AWS Step Functions 控制台。选择使用代码段创作。在 名称文本框中,输入 CallCenterStateMachine

01c
01c

(单击可放大)


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

此状态机使用一系列“任务”状态来打开、分配和处理支持案例。然后,使用“选择”状态来确定是否可以关闭案例。接下来使用另外两个“任务”状态,根据情况关闭或升级支持案例。

 

{
  "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."    }   
  }
}
03b
03b

(单击可放大)


c.单击刷新按钮,以可视化工作流的形式显示 ASL 状态机定义。在该场景中,您可以与呼叫中心经理一起查看可视化工作流,轻松验证是否正确描述了流程。

d.单击下一步

03c
03c

(单击可放大)


第 2 步:创建 AWS Identity and Access Management (IAM) 角色

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


a.在另一个浏览器窗口中,打开 AWS 管理控制台。在屏幕加载后,在搜索栏中输入 IAM,然后选择 IAM 以打开服务控制台。

02a
02a

(单击可放大)


b.单击角色,然后单击创建角色

02b
02b

(单击可放大)


c.在创建角色屏幕上,将 AWS 服务保留为选中状态,然后依次选择 Step Functions下一步:权限。在下一个屏幕中,单击下一步:查看

02c
02c

(单击可放大)


d.在角色名称处输入 step_functions_basic_execution,然后选择创建角色。在下一个屏幕中,单击下一步:查看

02d
02d

(单击可放大)


e.您的角色已创建并显示在列表中。选择角色名称进行查看。 

02e
02e

(单击可放大)


f.在下一个屏幕中,复制角色 ARN

02f
02f

(单击可放大)


第 3 步:将 IAM 角色添加到状态机

接下来,您需要将创建的 IAM 角色 ARN 添加到 AWS Step Functions 状态机。


a.使用 Step Functions 控制台选择浏览器选项卡。

b.将您刚才复制的 ARN 粘贴到 IAM 角色 ARN 文本框中。

c.单击创建状态机

03a
03a

(单击可放大)


第 4 步:创建 AWS Lambda 函数

现在状态机已经创建好了,您可以决定状态机如何执行工作。您可以将状态机连接到 AWS Lambda 函数以及您的环境中现有的其他微服务,或者创建新的微服务。在本教程中,您将创建几个简单的 Lambda 函数,用来模拟处理支持电话的各个步骤,例如将案例分配给客户支持代表。


a.单击服务,在搜索文本框中输入 Lambda,然后选择 Lambda 以打开服务控制台。

04a
04a

(单击可放大)


b.单击创建函数

04b
04b

(单击可放大)


c.选择从头开始创作

d.采用以下设置配置第一个 Lambda 函数:

名称OpenCaseFunction
运行时Node.js 4.3
角色创建自定义角色

此时将出现新的 IAM 窗口。

e.将角色名称保留为 lambda_basic_execution,然后单击允许
此时将自动返回到 Lambda 控制台。

f.单击创建函数

04c
04c

(单击可放大)


g.用以下代码替换函数代码窗口的内容,然后单击保存

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);    
};
04d
04d

(单击可放大)


h.单击页面顶部的函数

04e
04e

(单击可放大)


i.重复步骤 4b-4d,使用您在步骤 4c 中创建的 IAM 角色 lambda_basic_execution,再创建 4 个 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);
};

完成后,您现在应该共有 5 个 Lambda 函数。

04f
04f

(单击可放大)


第 5 步:填充工作流

接下来,用您刚才创建的 Lambda 函数填充 Step Functions 工作流中的任务状态。


a.单击服务,在搜索文本框中输入 Step,然后选择 Step Functions 以打开服务控制台。

05a
05a

(单击可放大)


b.在状态机屏幕中,选择 CallCenterStateMachine,然后单击编辑

05b
05b

(单击可放大)


c.在状态机定义部分中,找到打开案例状态下以 Resource 开头的行。

将 ARN 替换为您的 OpenCaseFunction 的 ARN。

如果单击示例 ARN,系统将显示您账户中的 AWS Lambda 函数列表,您可以从列表中进行选择。

05c
05c

(单击可放大)


d.重复上一步,更新状态机中分配案例处理案例关闭案例上报案例任务状态的 Lambda 函数 ARN,然后单击保存

05d
05d

(单击可放大)


第 6 步:执行工作流

您的无服务器工作流现在已准备就绪,可以执行了。一个状态机执行就是您的工作流的一个实例,并且在每次 Step Functions 状态机运行并执行其任务时都会发生。每个 Step Functions 状态机可以同时执行多个操作,您可以从 Step Functions 控制台中启动这些操作(这也是您接下来要做的事情),或者使用 AWS 开发工具包、Step Functions API 操作或 AWS CLI 启动这些操作。执行将接收 JSON 输入并产生 JSON 输出。


a.单击开始执行

06a
06a

(单击可放大)


b.这时将出现“新执行”对话框。要为支持案例提供一个 ID,请在“新执行”对话框的输入窗口中输入以下内容,然后单击开始执行

{
"inputCaseID": "001"
}
06b
06b

(单击可放大)


c.在您的工作流执行时,可视化工作流窗格中对应的每个步骤会更改颜色。等待几秒钟,待执行完成。然后,在执行详情窗格中,单击输出,查看工作流的输入和结果。

06c
06c

(单击可放大)


d.Step Functions 允许您检查工作流执行的每个步骤,包括每个状态的输入和输出。单击工作流中的各个任务,展开“步骤详情”下的输入输出字段。您可以看到,状态机中输入的案例 ID 会从各步骤传递到下一步骤,并且消息在每个 Lambda 函数完成其任务时都会更新。

06d
06d

(单击可放大)


e.向下滚动到执行事件历史记录部分。单击执行的每个步骤,以查看 Step Functions 如何调用您的 Lambda 函数并在函数之间传送数据。

06e
06e

(单击可放大)


f.根据 WorkOnCaseFunction 的输出,您的工作流可能解决了支持案例并关闭了服务单,或将服务单上报给了更高级的支持人员,并且就此结束。您可以反复运行几次,以观察这种不同的行为。此图显示了在升级支持案例的情况下工作流的执行情况,导致工作流以“失败”状态退出。

在现实场景中,您可能决定继续处理该案例直到解决为止,而不是因失败而被迫退出工作流。为此,您可以删除“失败”状态,并在状态机中编辑 上报案例任务,以循环回到处理案例状态。无需更改 Lambda 函数。我们为本教程构建的函数仅为示例,因此我们将继续进行本教程的下一步。

06f
06f

(单击可放大)


第 7 步:终止资源

在此步骤中,您将终止您的 AWS Step Functions 以及与 AWS Lambda 相关的资源。

重要说明:终止当前未在使用的资源可降低成本,是最佳实践。不终止资源可能会产生费用。


a.在 AWS Step Functions 控制台窗口顶部,单击状态机

07a
07a

(单击可放大)


b.在状态机窗口中,选择 CallCenterStateMachine,然后单击删除。要确认删除状态机,请在出现的对话框中单击删除状态机。Step Functions 确认所有正在进行的执行均已完成后,您的状态机将在一两分钟内被删除。

07b
07b

(单击可放大)


c.接下来,您将删除 Lambda 函数。单击 AWS 管理控制台菜单中的服务,然后选择 Lambda

07c
07c

(单击可放大)


d.在函数屏幕中,单击您为本教程创建的各个函数,然后依次选择操作删除。再次单击删除确认删除。

07d
07d

(单击可放大)


e.最后,您将删除 IAM 角色。单击 AWS 管理控制台菜单中的服务,然后选择 IAM

07e
07e

(单击可放大)


f.选择您为本教程创建的两个 IAM 角色,然后单击删除角色。在对话框中单击是,删除以确认删除。


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

07f
07f

(单击可放大)


恭喜您!

真棒! 您刚刚使用可以触发多个 AWS Lambda 函数的 AWS Step Functions 创建了一个无服务器工作流。您的工作流会根据您定义的逻辑协调所有函数,并将数据从一个状态传送到另一个状态,因此您无需将代码写入每个单独的函数。

至此,您已经学会了如何设计和运行无服务器工作流,接下来可以进入下一个教程,学习如何使用 Step Functions 来处理 Lambda 函数错误。您将创建一个带有“重试”和“捕获”字段的状态机,这些字段根据错误消息类型(一种称为函数错误处理的方法)响应来自模拟 API 的响应代码。


本教程对您是否有帮助?