使用 AWS Step Functions 编排 Lambda 函数 - AWS Lambda
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 AWS Step Functions 编排 Lambda 函数

您可以使用 AWS Step Functions 创建状态机来编排 Lambda 函数以创建应用程序。Step Functions 管理应用程序的状态,并提供一个可视化界面,用于定义涉及 Lambda 函数、AWS Batch 作业、Amazon SNS 主题、Amazon SQS 队列和其他常见 AWS 资源的工作流。与在程序中定义应用程序逻辑不同,您将以可视化方式或使用基于 JSON 的结构化语言(称为 Amazon 状态语言)来组装组件。Step Functions 中的 Lambda 函数是独立的、可重用的服务,具有明确定义的界面,您可以与技术较差的用户共享。

Step Functions 使用您定义的事件文档来调用函数。您可以创建一个任务 状态,使用状态机或任何 JSON 文档的输入来调用函数。

event.jsonrandom-error 函数的输入

{ "max-depth": 10, "current-depth": 0, "error-rate": 0.05 }

Step Functions 可以很容易地或根据调用结果重试失败的执行或对应用程序逻辑进行分支。

将状态机配置为事件源

您可以使用 Step Functions 控制台生成调用 Lambda 函数的状态,也可以直接在 JSON 中定义状态。以下示例显示了一个任务状态,该状态调用一个名为 my-function 的函数的版本 1,该函数的事件负载具有 3 个键。当该函数返回成功响应时,状态机将继续执行下一个任务。

例 状态机任务

"Invoke": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "FunctionName": "arn:aws:lambda:us-east-2:123456789012:function:my-function:1", "Payload": { "max-depth": 10, "current-depth": 0, "error-rate": 0.05 } }, "Next": "NEXT_STATE", "TimeoutSeconds": 25 }
权限

状态机需要权限才能调用 Lambda API,进而调用函数。要授予其权限,请将 AWSLambdaRole 托管策略或函数范围限定的内联策略添加到其角色。有关更多信息,请参阅 AWS Step Functions 开发人员指南 中的 AWS Step Functions 如何与 IAM 配合使用

FunctionNamePayload 参数映射到调用 API 操作中的参数。除了这些参数之外,您还可以指定 InvocationTypeClientContext 参数。例如,要异步调用函数并继续执行下一个状态而不等待结果,您可以将 InvocationType 设置为 Event,如下所示:

"InvocationType": "Event"

与在状态机定义中对事件有效负载进行硬编码不同,您可以使用来自状态机执行的输入。以下示例使用运行状态机时指定的输入作为事件有效负载:

"Payload.$": "$"

您还可以异步调用函数并等待函数使用 AWS 开发工具包进行回调。为此,请将状态的资源设置为 arn:aws:states:::lambda:invoke.waitForTaskToken。有关更多信息,请参阅 AWS Step Functions 开发人员指南 中的使用 Step Functions 调用 Lambda

处理函数和服务错误

当函数或 Lambda 服务返回错误时,您可以根据错误类型重试调用或继续执行其他状态。

以下示例显示了一个调用任务,该任务重试 5XX 系列 Lambda API 异常 (ServiceException)、限制 (TooManyRequestsException)、运行时错误 (Lambda.Unknown) 和名为 function.MaxDepthError 的函数定义错误。它还捕获一个名为 function.DoublesRolledError 的错误,并在发生该错误时进入 CaughtException 状态。

例 调用任务 – 重试并捕获

"Invoke": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Retry": [ { "ErrorEquals": [ "function.MaxDepthError", "Lambda.TooManyRequestsException", "Lambda.ServiceException", "Lambda.Unknown" ], "MaxAttempts": 5 } ], "Catch": [ { "ErrorEquals": [ "function.DoublesRolledError" ], "Next": "CaughtException" } ], "Parameters": { "FunctionName": "arn:aws:lambda:us-east-2:123456789012:function:my-function:1", ...

要捕获或重试函数错误,请创建自定义错误类型。错误类型的名称必须与引发错误时 Lambda 返回的带格式错误响应 errorType 中的相匹配。有关在每种支持语言中引发错误的详细信息,请参阅以下主题:

有关 Step Functions 中的错误处理的更多信息,请参阅 AWS Step Functions 开发人员指南 中的使用状态机处理错误条件

AWS CloudFormation 和 AWS SAM

您可以使用 AWS 无服务器应用程序模型 (AWS SAM) 创建一个在 AWS CloudFormation 模板中包含 Step Functions 状态机的无服务器应用程序。使用 AWS SAM 时,您可以在模板或单独的文件中内联定义状态机。以下示例显示了一个状态机,该状态机示范如何调用 Lambda 函数和处理错误。它引用同一模板中定义的函数资源(未显示)。

例 template.yml

AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: An AWS Lambda application that uses AWS Step Functions. Resources: statemachine: Type: AWS::Serverless::StateMachine Properties: DefinitionSubstitutions: FunctionArn: !GetAtt function.Arn Payload: | { "max-depth": 5, "current-depth": 0, "error-rate": 0.2 } Definition: StartAt: Invoke States: Invoke: Type: Task Resource: arn:aws:states:::lambda:invoke Parameters: FunctionName: "${FunctionArn}" Payload: "${Payload}" InvocationType: Event Retry: - ErrorEquals: - function.MaxDepthError - function.MaxDepthError - Lambda.TooManyRequestsException - Lambda.ServiceException - Lambda.Unknown IntervalSeconds: 1 MaxAttempts: 5 Catch: - ErrorEquals: - function.DoublesRolledError Next: CaughtException - ErrorEquals: - States.ALL Next: UncaughtException Next: Success CaughtException: Type: Pass Result: The function returned an error. End: true UncaughtException: Type: Pass Result: Invocation failed. End: true Success: Type: Pass Result: Invocation succeeded! End: true Events: scheduled: Type: Schedule Properties: Description: Run every minute Schedule: rate(1 minute) Type: STANDARD Policies: - AWSLambdaRole ...

这将创建具有以下结构的状态机:


        具有分支逻辑的状态机。