Step Functions 编排示例 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Step Functions 编排示例

您的 Step Functions 状态机中的所有工作均由 Tasks 完成。Task 通过使用活动、Lambda 函数或将参数传递给 Step Functions 的其他受支持的 Amazon 服务集成的 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,进而调用函数。要向其授予权限,请将Amazon托管策略AWSLambdaRole或函数范围的内联策略添加到其角色中。有关更多信息,请参阅 Amazon Step Functions 开发人员指南中的 Amazon Step Functions 如何与 IAM 合作

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

"InvocationType": "Event"

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

"Payload.$": "$"

您还可以异步调用函数并等待函数使用 Amazon 开发工具包进行回调。为此,请将状态的资源设置为 arn:aws:states:::lambda:invoke.waitForTaskToken

有关更多信息,请参阅 Amazon 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 中的错误处理的更多信息,请参阅 Amazon Step Functions 开发人员指南中的使用 Step Functions 状态机处理错误条件

Amazon CloudFormation 和 Amazon SAM

您可以结合使用 Amazon CloudFormation 模板和 Amazon Serverless Application Model (Amazon SAM) 来定义状态机。使用 Amazon SAM,您可以在模板或单独的文件中定义内联状态机。以下示例显示了调用处理错误的 Lambda 函数的状态机。它引用同一模板中定义的函数资源(未显示)。

例 template.yml 中的分支模式示例
AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: An Amazon 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 ...

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


        具有分支逻辑的状态机。

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