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

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

使用 Step F Amazon Lambda unctions 调用函数

了解如何使用 Step Functions 以同步或异步方式调用 Lambda 函数,来作为事件驱动型无服务器应用程序的一部分。

要了解如何在 Step Functions 中与 Amazon 服务集成,请参阅集成 服务在 Step Functions 中将参数传递给服务 API

经优化的 Lambda 集成的主要功能

优化的 Lambda APIs

工作流示例

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

{ "StartAt":"CallLambda", "States":{ "CallLambda":{ "Type":"Task", "Resource":"arn:aws:states:::lambda:invoke", "Arguments":{ "FunctionName":"arn:aws:lambda:region:account-id:function:MyFunction" }, "End":true } } }

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

{ "StartAt":"GetManualReview", "States":{ "GetManualReview":{ "Type":"Task", "Resource":"arn:aws:states:::lambda:invoke.waitForTaskToken", "Arguments":{ "FunctionName":"arn:aws:lambda:region:account-id:function:get-model-review-decision", "Payload":{ "model":"{% $states.input.my-model %}", "TaskToken": "{% $states.context.Task.Token %}" }, "Qualifier":"prod-v1" }, "End":true } } }

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

您也可以使用 InvocationType 参数异步调用 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", "Arguments": { "FunctionName": "arn:aws:lambda:region:account-id:function:echo", "InvocationType": "Event" }, "End": true } } }
注意

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

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:region:account-id:function:HelloFunction", "End": true } } }

通过这种形式的集成,该函数可以成功发送包含FunctionError字段的响应。在这种情况下,工作流任务将失败。

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

用于呼叫的 IAM 政策 Amazon Lambda

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

在以下示例中,一台状态机具有两个 Amazon Lambda 任务状态,分别调用function1function2,自动生成的策略包括对这两个函数的lambda:Invoke权限。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "arn:aws:lambda:us-east-1:123456789012:function:myFn1", "arn:aws:lambda:us-east-1:123456789012:function:myFn2" ] } ] }