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

教程

概览

在本教程中,您将学习如何使用 AWS Step Functions 设计和运行无服务器工作流,以协调多个 AWS Lambda 函数。AWS Lambda 是一项计算服务,让您无需预置或管理服务器即可运行代码。
 
在我们的示例中,您是一名开发人员,需要按照要求创建一个无服务器应用程序,以自动处理呼叫中心的支持服务单。虽然您可以让一个 Lambda 函数调用另一个 Lambda 函数,但您担心,随着呼叫中心应用程序变得越来越复杂,管理所有这些连接将变得越发具有挑战性。此外,应用程序流程如果发生任何更改,都需要在多个位置进行相应的更改,因此最终您可能需要不断重复编写相同的代码。
 
为了应对这项挑战,您决定使用 AWS Step Functions。Step Functions 是一种无服务器编排服务,可助您轻松地将多个 Lambda 函数协调到易于调试和更改的灵活工作流中。Step Functions 能够触发和跟踪应用程序的每个步骤,使您的 Lambda 函数不受其他逻辑的影响。

您将学到的内容

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

先决条件

您需要 AWS 账户才能完成本教程的学习。如果您还没有账户,请参阅 设置 AWS 环境入门指南。

在本教程中,您将使用 AWS Step FunctionsAWS Lambda。这两种服务都包括在 AWS Free Tier 内。

 AWS 使用经验

新手

 完成时间

10 分钟

 所需费用

Free Tier 资格。

 需要

AWS 账户

**过去 24 小时内创建的账户可能尚不具有访问此项目所需资源的权限。

 使用的服务

 上次更新日期

2024 年 6 月 11 日

实施

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

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

a.打开 IAM 管理控制台。 从左侧导航窗格中选择角色,然后选择创建角色

b.在创建角色界面上,在可信实体类型下,保留 AWS 服务的选中状态。在使用案例下的下拉列表中搜索 Step Functions,然后选择 Step Functions。选择下一步

c.在添加权限中,选择下一步

d.在名称、查看和创建部分的角色名称中,输入 step_functions_basic_execution。 选择创建角色

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

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

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

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

a.打开 AWS Step Functions 控制台。在左侧菜单上选择状态机,然后选择创建状态机

接下来,选择一个空白模板。

b.单击状态机临时名称旁边的编辑图标

状态机名称中,输入 CallCenterStateMachine

权限下的下拉列表中选择在第 1 步中创建的 step_fuctions_basic_execution

c.在窗口顶部选择代码。将状态机定义窗口的内容替换为下面的 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." }
  }
}

d.单击创建按钮。系统将弹出警报,说明存在错误。选择仍然尝试保存

第 3 步:创建 Lambda 函数

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

a.打开 AWS Lambda 控制台。从左侧菜单中选择函数。选择创建函数

b.选择从头开始创作

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

名称OpenCaseFunction

运行时:Node.js 20.x.

执行角色:创建具有基本 Lambda 权限的新角色

d.选择创建函数

e.用以下代码替换函数代码窗口的内容,然后选择部署

注意:确保文件名是 index.js。如有必要,请重命名。

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.在页面顶部,选择函数

g.重复步骤 3b-3d,使用您在步骤 3c 中创建的 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 函数。

第 4 步:填充工作流

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

a.打开 AWS Step Functions 控制台。在状态机中,选择 CallCenterStateMachine然后选择编辑

b.在 CallCenterStateMachine 的编辑界面上选择代码

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

将 REGION 替换为您正在使用的区域。

将 ACCOUNT_ID 替换为您的 AWS 账户 ID(无空格或连字符)

将 ARN 替换为您的 OpenCaseFunction 的 ARN。

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

第 5 步:执行工作流

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

a.选择执行。 此操作将打开新窗口。

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

{
  "inputCaseID": "001"
}

c.随着工作流程的执行,每个步骤都会在可视化工作流窗格中改变颜色。等待几秒钟,待执行完成。然后,在执行详情窗格中,选择执行输入执行输出,查看工作流的输入和结果。

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

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

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

第 6 步:清理资源

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

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

a.返回 AWS Step Functions 主页,选择状态机

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

c.在 AWS Lambda 控制台中的函数界面上,单击您为本教程创建的各个函数,然后依次选择操作删除。再次单击删除以确认删除。

最后,删除您的 IAM 角色。在 IAM 控制台角色部分中,在搜索中输入步骤,选择 step_functions_basic_execution,然后选择删除

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

结论

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

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

后续步骤

您已经学会了设计和运行无服务器工作流,可以尝试另一个教程,即创建带有 Catch 字段的 AWS Step Functions 状态机。Catch 字段使用 AWS Lambda 函数,根据错误消息类型使用条件逻辑做出响应。这是一种称为函数错误处理的技术。