使用 AWS Step Functions 和 AWS Lambda
处理无服务器应用程序中的错误
在本教程中,您将了解如何使用 AWS Step Functions 处理工作流运行时错误。AWS Step Functions 是一种无服务器编排服务,可助您轻松地将多个 Lambda 函数协调到易于调试和更改的灵活工作流中。AWS Lambda 是一项计算服务,让您无需预置或管理服务器即可运行代码。
Lambda 函数有时会运行失败,例如,当出现未处理的异常、其运行时间超过配置的超时时间或内存不足时。在每个 Lambda 函数中编写和维护错误处理逻辑以处理 API 限制或套接字超时等情况可能既耗时又复杂,对于分布式应用程序而言更是如此。在每个 Lambda 函数中嵌入此代码会在它们之间创建依赖关系,而且随着情况的变化,很难维护所有这些连接。
为避免这种情况,并减少您要编写的错误处理代码的数量,您可以使用 AWS Step Functions 创建支持函数错误处理的无服务器工作流。不论是由开发人员造成的函数异常错误(如未找到文件),还是突发错误(如内存不足),您都可以配置 Step Functions 以基于发生的错误类型使用条件逻辑进行响应。通过以这种方式将工作流逻辑与业务逻辑分离,您可以修改工作流对错误的响应方式,而无需更改 Lambda 函数的业务逻辑。
在本教程中,您将使用 AWS Step Functions 设计和运行无服务器工作流,AWS Step Functions 将妥善处理这些错误。您将创建一个 AWS Lambda 函数,该函数将模拟对 RESTful API 的调用,并返回各种响应代码和异常。然后,您将使用 AWS Step Functions 创建一个具有重试和捕获功能的状态机,根据引发的异常以不同逻辑做出响应。
第 1 步:创建 Lambda 函数以模拟 API
在此步骤中,您将创建一个 Lambda 函数来模拟一些基本 API 交互。Lambda 函数根据您在事件参数中输入的错误代码,引发异常以模拟来自虚构 API 的响应。
a. 打开 AWS 管理控制台,您就可以让本分步指南处于打开状态。此屏幕加载后,请输入您的用户名和密码以便开始操作。接下来,在搜索栏中键入 Lambda,选择 Lambda 以打开服务控制台。
d.在 MockAPIFunction 屏幕上,向下滚动到函数代码部分。在本教程中,您将创建一个函数,该函数使用编程模型在 Python 中创作 Lambda 函数。在代码窗口中,将所有代码替换为以下代码,然后选择保存。
class TooManyRequestsException(Exception): pass
class ServerUnavailableException(Exception): pass
class UnknownException(Exception): pass
def lambda_handler(event, context):
statuscode = event["statuscode"]
if statuscode == "429":
raise TooManyRequestsException('429 Too Many Requests')
elif statuscode == "503":
raise ServerUnavailableException('503 Server Unavailable')
elif statuscode == "200":
return '200 OK'
else:
raise UnknownException('Unknown error')
第 2 步:创建 AWS Identity and Access Management (IAM) 角色
AWS Step Functions 可以执行代码并访问其他 AWS 资源(例如,存储在 Amazon S3 存储桶中的数据)。为了维护安全,您必须使用 AWS Identity and Access Management (IAM) 向 Step Functions 授予对这些资源的访问权限。
第 3 步:创建 Step Functions 状态机
现在您已创建可模拟 API 响应的简单 Lambda 函数,接下来您可以创建 Step Functions 状态机以调用 API 并处理异常。
在此步骤中,您将使用 Step Functions 控制台创建一个状态机,该状态机使用带有“重试”和“捕获”字段的任务状态来处理各种 API 响应代码。您将使用任务状态调用模拟 API Lambda 函数,该函数将返回 API 状态代码,供您输入到状态机。
a.打开 AWS Step Functions 控制台。在创建状态机页面上,选择从头开始创作。在详细信息部分中,将您的状态机命名为 MyAPIStateMachine,然后选择我将使用现有角色。
b.接下来,您将设计一个状态机,根据您模拟 API 的响应采取不同的操作。如果无法访问 API,工作流将重试。重试是解决瞬态错误非常有用的方法。该工作流还会捕获模拟 API 抛出的不同异常。
将状态机定义部分的内容替换为以下代码:
{
"Comment": "An example of using retry and catch to handle API responses",
"StartAt": "Call API",
"States": {
"Call API": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"Next" : "OK",
"Comment": "Catch a 429 (Too many requests) API exception, and resubmit the failed request in a rate-limiting fashion.",
"Retry" : [ {
"ErrorEquals": [ "TooManyRequestsException" ],
"IntervalSeconds": 1,
"MaxAttempts": 2
} ],
"Catch": [
{
"ErrorEquals": ["TooManyRequestsException"],
"Next": "Wait and Try Later"
}, {
"ErrorEquals": ["ServerUnavailableException"],
"Next": "Server Unavailable"
}, {
"ErrorEquals": ["States.ALL"],
"Next": "Catch All"
}
]
},
"Wait and Try Later": {
"Type": "Wait",
"Seconds" : 1,
"Next" : "Change to 200"
},
"Server Unavailable": {
"Type": "Fail",
"Error":"ServerUnavailable",
"Cause": "The server is currently unable to handle the request."
},
"Catch All": {
"Type": "Fail",
"Cause": "Unknown error!",
"Error": "An error of unknown type occurred"
},
"Change to 200": {
"Type": "Pass",
"Result": {"statuscode" :"200"} ,
"Next": "Call API"
},
"OK": {
"Type": "Pass",
"Result": "The request has succeeded.",
"End": true
}
}
}
第 4 步:测试错误处理工作流
要测试错误处理工作流,您需要输入错误代码,促使状态机调用模拟 API。
第 5 步:检查状态机的执行情况
第 6 步:终止资源
在此步骤中,您将终止您的 AWS Step Functions 以及与 AWS Lambda 相关的资源。
重要说明:终止当前未在使用的资源可降低成本,是最佳实践。不终止资源可能会产生费用。
恭喜!
您已使用 AWS Step Functions 和 AWS Lambda 为网络 API 创建错误处理工作流。借助 AWS Lambda,您几乎可以为任何类型的应用程序或后端服务运行代码,而且完全无需管理。只需上传您的代码,Lambda 会处理运行和扩展高可用性代码所需的一切工作。
将 AWS Step Functions 与 AWS Lambda 结合使用,可以简化为无服务器应用程序编制 AWS Lambda 函数的流程。Step Functions 允许您使用 Lambda 函数控制复杂的工作流,而无需由底层应用程序管理和编排状态。在使用 Amazon EC2 和 Amazon ECS 等计算资源编排微服务时,您也可以使用 Step Functions。