创建无服务器工作流
利用 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 Functions 和 AWS Lambda。这两种服务都在 AWS 免费套餐范围内。
第 1 步:创建状态机和无服务器工作流
首先需要设计一个工作流,说明您希望如何在呼叫中心处理支持服务单。工作流将流程描述为一系列可以不断重复执行的单独任务。
您可以与呼叫中心经理会面讨论一下处理支持案例的最佳实践。使用 Step Functions 中的可视化工作流作为所定义的整体工作流的直观参考。
接下来,您将在 AWS Step Functions 中设计工作流。您的工作流将调用一个 AWS Lambda 函数来创建支持案例,调用另一个 Lambda 函数将案例分配给支持代表以进行解决,等等。该工作流还将在 Lambda 函数之间传送数据,以跟踪正在处理的支持案例的状态。
a.打开 AWS Step Functions 控制台。选择使用代码段创作。在 名称文本框中,输入 CallCenterStateMachine。
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." }
}
}
第 2 步:创建 AWS Identity and Access Management (IAM) 角色
AWS IAM 是一项 Web 服务,可帮助您安全地控制对 AWS 资源的访问。在此步骤中,您将创建一个 IAM 角色,该角色允许 Step Functions 访问 Lambda。
a.在另一个浏览器窗口中,打开 AWS 管理控制台。在屏幕加载后,在搜索栏中输入 IAM,然后选择 IAM 以打开服务控制台。
第 3 步:将 IAM 角色添加到状态机
接下来,您需要将创建的 IAM 角色 ARN 添加到 AWS Step Functions 状态机。
第 4 步:创建 AWS Lambda 函数
现在状态机已经创建好了,您可以决定状态机如何执行工作。您可以将状态机连接到 AWS Lambda 函数以及您的环境中现有的其他微服务,或者创建新的微服务。在本教程中,您将创建几个简单的 Lambda 函数,用来模拟处理支持电话的各个步骤,例如将案例分配给客户支持代表。
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);
};
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 函数。
第 5 步:填充工作流
接下来,用您刚才创建的 Lambda 函数填充 Step Functions 工作流中的任务状态。
第 6 步:执行工作流
您的无服务器工作流现在已准备就绪,可以执行了。一个状态机执行就是您的工作流的一个实例,并且在每次 Step Functions 状态机运行并执行其任务时都会发生。每个 Step Functions 状态机可以同时执行多个操作,您可以从 Step Functions 控制台中启动这些操作(这也是您接下来要做的事情),或者使用 AWS 开发工具包、Step Functions API 操作或 AWS CLI 启动这些操作。执行将接收 JSON 输入并产生 JSON 输出。
第 7 步:终止资源
在此步骤中,您将终止您的 AWS Step Functions 以及与 AWS Lambda 相关的资源。
重要说明:终止当前未在使用的资源可降低成本,是最佳实践。不终止资源可能会产生费用。
恭喜您!
真棒! 您刚刚使用可以触发多个 AWS Lambda 函数的 AWS Step Functions 创建了一个无服务器工作流。您的工作流会根据您定义的逻辑协调所有函数,并将数据从一个状态传送到另一个状态,因此您无需将代码写入每个单独的函数。
至此,您已经学会了如何设计和运行无服务器工作流,接下来可以进入下一个教程,学习如何使用 Step Functions 来处理 Lambda 函数错误。您将创建一个带有“重试”和“捕获”字段的状态机,这些字段根据错误消息类型(一种称为函数错误处理的方法)响应来自模拟 API 的响应代码。