本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Step F AWS Lambda unctions 调用函数
了解如何使用 Step Functions 以同步或异步方式调用 Lambda 函数,来作为事件驱动型无服务器应用程序的一部分。
要了解如何在 Step Functions 中与 AWS 服务集成,请参阅集成 服务和在 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
}
}
}
通过在 Resource
字段的 ARN 中指定相应选项,您可以调用特定的 Lambda 函数版本或别名。请参阅 Lambda 文档中的以下内容:
用于呼叫的 IAM 政策 AWS Lambda
以下示例模板展示了如何根据状态机定义中的资源 AWS Step Functions 生成 IAM 策略。有关更多信息,请参阅Step Functions 如何为集成服务生成 IAM 策略 和探索 Step Functions 中的服务集成模式。
AWS Step Functions 根据您的状态机定义生成 IAM 策略。对于具有两个调用function1
和的 AWS Lambda 任务状态的状态机function2
,必须使用具有这两个函数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]]
"
]
}
]
}