View a markdown version of this page

使用 Step AWS Lambda Functions 叫用 函數 - AWS Step Functions

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Step AWS Lambda Functions 叫用 函數

了解如何使用 Step Functions 同步或非同步叫用 Lambda 函數,做為事件驅動型無伺服器應用程式的一部分。

若要了解如何在 Step Functions 中整合 AWS 服務,請參閱 整合 服務和 在 Step Functions 中將參數傳遞至服務 API。

Optimized 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欄位的回應。在這種情況下,工作流程任務將會失敗。如需如何將 Lambda 錯誤傳播至 Step Functions 的詳細資訊,請參閱 處理 Step Functions 工作流程中的錯誤。

您可以在 Resource 欄位的 ARN 中指定這些選項,以叫用特定的 Lambda 函數版本或別名。請參閱 Lambda 文件中的下列內容:

用於呼叫 的 IAM 政策 AWS Lambda

下列範例範本顯示 如何根據狀態機器定義中的資源 AWS Step Functions 產生 IAM 政策。如需詳細資訊,請參閱Step Functions 如何為整合服務產生 IAM 政策及探索 Step Functions 中的服務整合模式。

在下列範例中,具有兩個 AWS Lambda 任務狀態的狀態機器會呼叫 function1和 function2,自動產生的政策會包含這兩個函數的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" ] } ] }
注意

如果您使用 Qualifier 參數或在 中指定函數版本或別名FunctionName,您必須在 IAM 政策資源 ARN 中包含 限定詞。使用 允許:*任何版本或別名:

"arn:aws:lambda:us-east-1:123456789012:function:myFn1:*"

不合格的 ARN (沒有:*尾碼) 不會授予叫用特定版本或別名的許可,而且叫用會失敗並出現存取遭拒錯誤。