使用 AWS Step Functions 和 AWS Lambda 创建无服务器工作流
教程
概览
您将学到的内容
- 创建 Step Functions 状态机来描述当前的呼叫中心流程
- 创建一些简单的 Lambda 函数来模拟支持团队的任务
- 在每个 Lambda 函数之间传递数据以跟踪支持案例的进度
- 对工作流进行几次测试,观察它如何响应不同的输入
- 删除本教程中使用的 AWS 资源
先决条件
在本教程中,您将使用 AWS Step Functions 和 AWS 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 管理控制台。 从左侧导航窗格中选择角色,然后选择创建角色。
第 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." }
}
}
第 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);
};
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,然后选择编辑。
c.在状态机定义中,找到打开案例状态下以Resource 开头的行。
将 REGION 替换为您正在使用的区域。
将 ACCOUNT_ID 替换为您的 AWS 账户 ID(无空格或连字符)
将 ARN 替换为您的 OpenCaseFunction 的 ARN。
第 5 步:执行工作流
您的无服务器工作流现在已准备就绪,可以执行了。状态机执行是工作流的一个实例,每次 Step Functions 状态机运行并执行其任务时都会发生。每个 Step Functions 状态机可以同时执行多个操作,您可以从 Step Functions 控制台中启动这些操作(这也是您接下来要做的事情),或者使用 AWS 开发工具包、Step Functions API 操作或 AWS CLI 启动这些操作。执行将接收 JSON 输入并产生 JSON 输出。
第 6 步:清理资源
在此步骤中,您将终止 AWS Step Functions 以及 AWS Lambda 资源。
重要提示:为避免产生意外费用,最佳做法是终止不再需要的活动资源。
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 函数,根据错误消息类型使用条件逻辑做出响应。这是一种称为函数错误处理的技术。