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

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

调用 Amazon Lambda 带有步进函数的函数

学习如何使用 Step Functions 在事件驱动的无服务器应用程序中同步或异步调用 Lambda 函数。

要了解如何与集成 Amazon Step Functions 中的服务,参见集成 服务和。在 Step Functions API 中向服务传递参数

优化的 Lambda 集成的主要功能
  • 响应的 Payload 字段从转义的 Json 解析为 Json。

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

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

支持的 Lambda APIs

工作流示例

下面是调用 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 } } }

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

IAM通话政策 Amazon Lambda

以下示例模板演示了如何操作 Amazon Step Functions 根据状态机定义中的资源生成IAM策略。有关更多信息,请参阅Step Functions 如何为集成服务生成IAM策略在 Step Functions 中探索服务集成模式

Amazon Step Functions 根据您的状态机定义生成IAM策略。对于有两个的状态机 Amazon Lambda 任务状态调用function1function2,必须使用具有这两个函数lambda:Invoke权限的策略。

如以下示例所示。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "arn:aws:lambda:[[region]]:[[accountId]]:function:[[function1]]", "arn:aws:lambda:[[region]]:[[accountId]]:function:[[function2]]" ] } ] }