

# バックエンド Lambda 関数の非同期呼び出しをセットアップする
<a name="set-up-lambda-integration-async"></a>

Lambda 非プロキシ (カスタム) 統合では、デフォルトでバックエンド Lambda 関数が同期的に呼び出されます。これは、ほとんどの REST API 操作に必要な動作です。ただし、一部のアプリケーションでは非同期で作業を実行する必要があります (バッチオペレーションまたは長時間レイテンシーオペレーションとして実行)。通常、これは別々のバックエンドコンポーネントで実行されます。この場合は、バックエンド Lambda 関数は非同期に呼び出され、フロントエンドの REST API メソッドは結果を返しません。

`'Event'` を [Lambda 呼び出しタイプ](https://docs.aws.amazon.com/lambda/latest/dg/lambda-invocation.html)として指定することで、Lambda 非プロキシ統合用の Lambda 関数を非同期的に呼び出すように設定できます。これは次のように行います。

## 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 Path Item オブジェクト](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` を含めることができます。

## CloudFormation を使用して Lambda 非同期呼び出しを設定する
<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` を含めることができます。