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

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

使用 Step Functions 调用 Lambda

Step Functions 可以直接从 Amazon States Language (ASL) 控制某些 Amazon 服务。要了解更多信息,请参阅使用其他服务将参数传递给服务 API

优化后的 Lambda 集成与 Lambda 软件开发工具包集成有何不同 Amazon
  • 响应的 Payload 字段从转义的 Json 解析为 Json。

  • 如果响应中包含字段 FunctionError,或者在 Lambda 函数中引发了异常,则任务将失败。

有关管理状态输入、输出和结果的更多信息,请参阅Step Functions 中的输入和输出处理

支持 Amazon Lambda 的 API:

中的Step Functions参数表示为 PascalCase

即使原生服务 API 在 camelCase 中(例如 API 操作)startSyncExecution,您也可以在中指定参数 PascalCase,例如:。StateMachineArn

下面是调用 Lambda 函数的 Task 状态。

{ "StartAt":"CallLambda", "States":{ "CallLambda":{ "Type":"Task", "Resource":"arn:aws:states:::lambda:invoke", "Parameters":{ "FunctionName":"arn:aws:lambda:us-east-1:123456789012:function:MyFunction" }, "End":true } } }

以下内容包括实施回调服务集成模式的 Task 状态。

{ "StartAt":"GetManualReview", "States":{ "GetManualReview":{ "Type":"Task", "Resource":"arn:aws:states:::lambda:invoke.waitForTaskToken", "Parameters":{ "FunctionName":"arn:aws:lambda:us-east-1:123456789012:function:get-model-review-decision", "Payload":{ "model.$":"$.new_model", "token.$":"$$.Task.Token" }, "Qualifier":"prod-v1" }, "End":true } } }

当您调用 Lambda 函数时,执行将等待函数完成。如果使用回调任务调用 Lambda 函数,则在 Lambda 函数完成执行并返回结果之后,信号检测超时才会开始计数。只要 Lambda 函数在执行,信号检测超时就不会强制执行。

您也可以使用 InvocationType 参数异步调用 Lambda,如以下示例所示:

注意

对于 Lambda 函数的异步调用,信号检测超时时间会立即开始。

{ "Comment": "A Hello World example of the Amazon States Language using Pass states", "StartAt": "Hello", "States": { "Hello": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:echo", "InvocationType": "Event" }, "End": true } } }

Task 结果返回时,函数输出嵌套在元数据目录中。例如:

{ "ExecutedVersion":"$LATEST", "Payload":"FUNCTION OUTPUT", "SdkHttpMetadata":{ "HttpHeaders":{ "Connection":"keep-alive", "Content-Length":"4", "Content-Type":"application/json", "Date":"Fri, 26 Mar 2021 07:42:02 GMT", "X-Amz-Executed-Version":"$LATEST", "x-amzn-Remapped-Content-Length":"0", "x-amzn-RequestId":"0101aa0101-1111-111a-aa55-1010aaa1010", "X-Amzn-Trace-Id":"root=1-1a1a000a2a2-fe0101aa10ab;sampled=0" }, "HttpStatusCode":200 }, "SdkResponseMetadata":{ "RequestId":"6b3bebdb-9251-453a-ae45-512d9e2bf4d3" }, "StatusCode":200 }

或者,您可以通过直接在“资源”字段中指定函数 ARN 来调用 Lambda 函数。以这种方式调用 Lambda 函数时,您无法指定 .waitForTaskToken,并且任务结果仅包含函数输出。

{ "StartAt":"CallFunction", "States":{ "CallFunction": { "Type":"Task", "Resource":"arn:aws:lambda:us-east-1:123456789012:function:HelloFunction", "End": true } } }

通过在 Resource 字段的 ARN 中指定相应选项,您可以调用特定的 Lambda 函数版本或别名。请参阅 Lambda 文档中的以下内容:

有关在与其他 Amazon 服务Step Functions一起使用时如何配置IAM权限的信息,请参阅集成服务的 IAM 策略