本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
了解如何使用 Step Functions 同步或非同步叫用 Lambda 函數,做為事件驅動型無伺服器應用程式的一部分。
若要了解如何在 Step Functions 中整合 AWS 服務,請參閱 整合 服務和 在 Step Functions 中將參數傳遞至服務 API。
Optimized 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]]
"
]
}
]
}