使用 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 服务。有关使用 Amazon Step Functions 及其集成的更多信息,请参阅以下内容:

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

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

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

支持的 Amazon Lambda API:

注意

Step Functions 中的参数以 PascalCase 表示,即使原生服务 API 使用 camelCase 也是如此。例如,您可以使用 Step Functions API 操作 startSyncExecution 并将其参数指定为 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 文档中的以下内容:

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