本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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.json – random-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
FunctionName
和 Payload
参数映射到调用 API 操作中的参数。除了这些参数之外,您还可以指定 InvocationType
和 ClientContext
参数。例如,要异步调用函数并继续执行下一个状态而不等待结果,您可以将 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。