

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

# 使用 Step AWS LambdaFunctions 叫用 函數
<a name="connect-lambda"></a>

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

若要了解如何在 Step Functions 中整合 AWS服務，請參閱 [整合 服務](integrate-services.md)和 [在 Step Functions 中將參數傳遞至服務 API](connect-parameters.md)。

**Optimized Lambda 整合的主要功能**  
回應`Payload`的欄位會從逸出的 Json 剖析到 Json。
如果在 Lambda 函數中引發例外狀況，任務將會失敗。如需實際範例，請參閱 [在 Step Functions 狀態機器中處理錯誤條件](tutorial-handling-error-conditions.md)。

## 最佳化 Lambda APIs
<a name="connect-lambda-api"></a>
+ [https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html)

## 工作流程範例
<a name="connect-lambda-api-examples"></a>

下列包含叫用 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` 狀態，此狀態會實作[回呼](connect-to-resource.md#connect-wait-token)服務整合模式。

```
{  
   "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
}
```

## 直接指定的函數資源
<a name="w2aac33c40c13"></a>

或者，您也可以直接在「資源」欄位中指定函數 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 文件中的下列內容：
+ [AWS Lambda版本控制](https://docs.aws.amazon.com/lambda/latest/dg/versioning-intro.html)
+ [AWS Lambda別名](https://docs.aws.amazon.com/lambda/latest/dg/aliases-intro.html)

## 用於呼叫 的 IAM 政策AWS Lambda
<a name="lambda-iam"></a>

下列範例範本顯示 如何根據狀態機器定義中的資源AWS Step Functions產生 IAM 政策。如需詳細資訊，請參閱[Step Functions 如何為整合服務產生 IAM 政策](service-integration-iam-templates.md)及[探索 Step Functions 中的服務整合模式](connect-to-resource.md)。

在下列範例中，具有兩個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"
            ]
        }
    ]
}
```