

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

# 設定後端 Lambda 函數的非同步叫用
<a name="set-up-lambda-integration-async"></a>

在 Lambda 非代理 (自訂) 整合中，系統依預設會同步叫用後端 Lambda 函數。這是大部分 REST API 操作所需的行為。不過，有些應用程式要求系統以非同步方式 (以批次操作方式或長時間延遲操作方式) 來執行工作，通常會由個別後端元件執行。在此情況下，系統會非同步叫用後端 Lambda 函數，且前端 REST API 方法不會傳回結果。

您可以將 Lambda 非代理整合的 Lambda 函數設定為以非同步方式叫用，方法是將 `'Event'` 指定為 [Lambda 叫用類型](https://docs.aws.amazon.com/lambda/latest/dg/lambda-invocation.html)。此作法如下所示：

## 在 API Gateway 主控台中設定 Lambda 非同步叫用
<a name="asynchronous-invocation-console-examples"></a>

對於所有呼叫都是非同步的：
+ 在**整合請求**中，新增具有 `'Event'` 靜態值的 `X-Amz-Invocation-Type` 標頭。

讓客戶決定呼叫是非同步或同步：

1. 在**方法請求**中，新增 `InvocationType` 標頭。

1. 在**整合請求**中，新增包含 `method.request.header.InvocationType` 對應表達式的 `X-Amz-Invocation-Type` 標頭。

1. 用戶端可以在 API 請求中包含 `InvocationType: Event` 標頭以進行非同步呼叫，或包含 `InvocationType: RequestResponse` 以進行同步呼叫。

## 使用 OpenAPI 設定 Lambda 非同步調用
<a name="asynchronous-invocation-OpenAPI-examples"></a>

對於所有呼叫都是非同步的：
+  將 `X-Amz-Invocation-Type` 標頭加到 **x-amazon-apigateway-integration** 區段。

  ```
  "x-amazon-apigateway-integration" : {
            "type" : "aws",
            "httpMethod" : "POST",
            "uri" : "arn:aws:apigateway:us-east-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-2:123456789012:function:my-function/invocations",
            "responses" : {
              "default" : {
                "statusCode" : "200"
              }
            },
            "requestParameters" : {
              "integration.request.header.X-Amz-Invocation-Type" : "'Event'"
            },
            "passthroughBehavior" : "when_no_match",
            "contentHandling" : "CONVERT_TO_TEXT"
          }
  ```

讓客戶決定呼叫是非同步或同步：

1.  在任何 [OpenAPI 路徑項目物件](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#pathItemObject)上新增下列標頭。

   ```
   "parameters" : [ {
   "name" : "InvocationType",
   "in" : "header",
   "schema" : {
     "type" : "string"
   }
   } ]
   ```

1.  將 `X-Amz-Invocation-Type` 標頭加到 **x-amazon-apigateway-integration** 區段。

   ```
   "x-amazon-apigateway-integration" : {
             "type" : "aws",
             "httpMethod" : "POST",
             "uri" : "arn:aws:apigateway:us-east-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-2:123456789012:function:my-function/invocations",
             "responses" : {
               "default" : {
                 "statusCode" : "200"
               }
             },
             "requestParameters" : {
               "integration.request.header.X-Amz-Invocation-Type" : "method.request.header.InvocationType"
             },
             "passthroughBehavior" : "when_no_match",
             "contentHandling" : "CONVERT_TO_TEXT"
           }
   ```

1.  用戶端可以在 API 請求中包含 `InvocationType: Event` 標頭以進行非同步呼叫，或包含 `InvocationType: RequestResponse` 以進行同步呼叫。

## 使用 設定 Lambda 非同步調用 CloudFormation
<a name="asynchronous-invocation-cfn-examples"></a>

下列 CloudFormation 範本示範如何`AWS::ApiGateway::Method`為非同步調用設定 。

對於所有呼叫都是非同步的：

```
AsyncMethodGet:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      RestApiId: !Ref Api
      ResourceId: !Ref AsyncResource
      HttpMethod: GET
      ApiKeyRequired: false
      AuthorizationType: NONE
      Integration:
        Type: AWS
        RequestParameters:
          integration.request.header.X-Amz-Invocation-Type: "'Event'"
        IntegrationResponses:
            - StatusCode: '200'
        IntegrationHttpMethod: POST
        Uri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${myfunction.Arn}$/invocations
      MethodResponses:
        - StatusCode: '200'
```

讓客戶決定呼叫是非同步或同步：

```
AsyncMethodGet:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      RestApiId: !Ref Api
      ResourceId: !Ref AsyncResource
      HttpMethod: GET
      ApiKeyRequired: false
      AuthorizationType: NONE
      RequestParameters:
        method.request.header.InvocationType: false
      Integration:
        Type: AWS
        RequestParameters:
          integration.request.header.X-Amz-Invocation-Type: method.request.header.InvocationType
        IntegrationResponses:
            - StatusCode: '200'
        IntegrationHttpMethod: POST
        Uri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${myfunction.Arn}$/invocations
      MethodResponses:
        - StatusCode: '200'
```

 用戶端可以在 API 請求中包含 `InvocationType: Event` 標頭以進行非同步呼叫，或包含 `InvocationType: RequestResponse` 以進行同步呼叫。