Step Functions 编排示例 - AWS Lambda

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Step Functions 编排示例

您的 Step Functions 状态机中的所有工作均由 Tasks 完成。Task 通过使用活动、Lambda 函数或将参数传递给 Step Functions 的其他受支持的 AWS 服务集成的 API 操作来执行工作

将 Lambda 函数配置为任务

Step Functions 可以直接从 Amazon 状态语言定义中的 Task 状态调用 Lambda 函数。

... "MyStateName":{ "Type":"Task", "Resource":"arn:aws:lambda:us-west-2:01234567890:function:my_lambda_function", "End":true ...

您可以创建使用状态机或任何 JSON 文档的输入来调用 Lambda 函数的 Task 状态。

event.jsonrandom-error 函数的输入
{ "max-depth": 10, "current-depth": 0, "error-rate": 0.05 }

将状态机配置为事件源

您可以创建调用 Lambda 函数的 Step Functions 状态机。以下示例显示了一个 Task 状态,该状态使用具有 3 个键的事件负载调用名为 1 的函数的版本 my-function。当该函数返回成功响应时,状态机将继续执行下一个任务。

例 示例状态机
... "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,进而调用函数。要向其授予权限,请将AWS托管策略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 开发人员指南中的使用 Step Functions 状态机处理错误条件

AWS CloudFormation 和 AWS SAM

您可以结合使用 AWS CloudFormation 模板和 AWS Serverless Application Model (AWS SAM) 来定义状态机。使用 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 ...

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


        具有分支逻辑的状态机。

有关更多信息,请参阅 AWS Serverless Application Model 开发人员指南中的 AWS::Serverless::StateMachine