

# API Gateway でプロキシ統合の統合レスポンスをストリーミングする
<a name="response-transfer-mode"></a>

API Gateway が統合レスポンスを返す方法を制御するようにプロキシ統合を設定できます。デフォルトでは、API Gateway は送信を開始する前に完全なレスポンスを受信するのを待ちます。ただし、統合のレスポンス転送モードを `STREAM` に設定した場合、API Gateway はレスポンスが完全に計算されてからクライアントに送信されるまで待機しません。レスポンスストリーミングは、すべての REST API エンドポイントタイプで機能します。

以下のユースケースでレスポンスストリーミングを使用します。
+ チャットボットなどの生成 AI の最初のバイトまでの時間 (TTFB) を短縮します。
+ S3 の署名付き URL を使用せずに、大きなイメージ、ビデオ、または音楽ファイルをストリーミングします。
+ サーバー送信イベント (SSE) などの段階的な進行状況をレポートしながら、長時間実行されるオペレーションを実行します。
+ API Gateway の 10 MB のレスポンスペイロード制限を超えました。
+ 統合タイムアウト制限の引き上げをリクエストせずに、API Gateway の 29 秒のタイムアウト制限を超えました。
+ バイナリメディアタイプを設定せずにバイナリペイロードを受け取ります。

## レスポンスペイロードストリーミングに関する考慮事項
<a name="response-transfer-mode-considerations"></a>

以下の考慮事項は、レスポンスペイロードストリーミングの使用に影響する可能性があります。
+ レスポンスペイロードストリーミングは、`HTTP_PROXY` または `AWS_PROXY` 統合タイプでのみ使用できます。これには、Lambda プロキシ統合と、`HTTP_PROXY` 統合を使用するプライベート統合が含まれます。
+ デフォルトの転送モード設定は `BUFFERED` です。レスポンスストリーミングを使用するには、レスポンス転送モードを `STREAM` に変更する必要があります。
+ レスポンスストリーミングは REST API でのみサポートされます。
+ リクエストストリーミングはサポートされていません。
+ レスポンスは最大 15 分間ストリーミングできます。
+ ストリームはアイドルタイムアウトの対象となります。リージョンエンドポイントまたはプライベートエンドポイントの場合、タイムアウトは 5 分です。エッジ最適化エンドポイントの場合、タイムアウトは 30 秒です。
+ 独自の CloudFront ディストリビューションでリージョン REST API のレスポンスストリーミングを使用する場合、CloudFront ディストリビューションのレスポンスタイムアウトを増やすことで、30 秒を超えるアイドルタイムアウトを実現できます。詳細については、「[応答タイムアウト](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DownloadDistValuesOrigin.html#DownloadDistValuesOriginResponseTimeout)」を参照してください。
+ レスポンス転送モードが `STREAM` に設定されている場合、API Gateway は統合レスポンス全体をバッファする必要がある機能をサポートできません。このため、以下の機能はレスポンスストリーミングではサポートされていません。
  + エンドポイントキャッシュ
  + コンテンツのエンコーディング。統合レスポンスを圧縮する場合は、統合でこれを行います。
  + VTL によるレスポンス変換
+ 各ストリーミングレスポンス内では、レスポンスペイロードの最初の 10MB は帯域幅制限の対象になりません。10MB を超えるレスポンスペイロードデータは 2MB/秒に制限されています。
+ クライアントと API Gateway 間、または API Gateway と Lambda 間の接続がタイムアウトにより閉じられた場合、Lambda 関数は引き続き実行される可能性があります。詳細については、「[Lambda 関数のタイムアウトを設定する](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html)」を参照してください。
+ レスポンスストリーミングにはコストがかかります。詳細については、「[API Gateway の料金](https://aws.amazon.com/api-gateway/pricing/)」を参照してください。

# API Gateway でペイロードレスポンスストリーミングと HTTP プロキシ統合を設定する
<a name="response-streaming-http"></a>

レスポンスペイロードストリーミングを設定するときは、メソッドの統合リクエストでレスポンス転送モードを指定します。これらの設定は、統合リクエストで設定して、統合レスポンスの前と最中に API Gateway がどのように動作するかを制御します。レスポンスストリーミングを使用すると、統合タイムアウトを最大 15 分まで設定できます。

`HTTP_PROXY` 統合でペイロードレスポンスストリーミングを使用する場合、API Gateway はすべてのヘッダーを完全に受信するまで、HTTP レスポンスステータスコードまたは HTTP レスポンスヘッダーを送信しません。

## ペイロードレスポンスストリーミングとの HTTP プロキシ統合を作成する
<a name="response-streaming-http-create"></a>

次の手順では、`responseTransferMode` を `STREAM` に設定して新しい API をインポートする方法を示します。既存の統合 API があり、`responseTransferMode` を変更する場合は、「[HTTP プロキシ統合のレスポンス転送モードを更新する](#response-streaming-http-update)」を参照してください。

------
#### [ AWS マネジメントコンソール ]

**ペイロードレスポンスストリーミングとの HTTP プロキシ統合を作成するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. **[リソースの作成]** を選択します。

1. **[リソース名]** に **streaming** と入力します。

1. **[リソースの作成]** を選択します。

1. **[/streaming]** リソースを選択した状態で、**[メソッドを作成]** を選択します。

1. **[メソッドタイプ]** で、**[任意]** を選択します。

1. **[統合タイプ]** で､ **[HTTP]** を選択します｡

1. **[HTTP プロキシ統合]** を選択します。

1. **[レスポンス転送モード]** で、**[ストリーム]** を選択します。

1. **[HTTP メソッド]** の場合は、メソッドを選択します。

1. **[エンドポイント URL]** には、統合エンドポイントを入力します。ストリーミングで返される大きなペイロードを生成するエンドポイントを必ず選択してください。

1. **[メソッドの作成]** を選択します。

メソッドを作成したら、API をデプロイします。

**API をデプロイするには**

1. [**API のデプロイ**] を選択します。

1. **[ステージ]** で **[新規ステージ]** を選択します。

1. [**Stage name (ステージ名)**] に **prod** と入力します。

1. (オプション) **[説明]** に説明を入力します。

1. **[デプロイ]** をクリックします。

------
#### [ AWS CLI ]

**ペイロードレスポンスストリーミングを使用して新しい API を作成するには**

1. 以下の Open API ファイルをコピーし、`ResponseStreamDemoSwagger.yaml` として保存します。このファイルでは、`responseTransferMode` は `STREAM` に設定されます。統合エンドポイントは `https://example.com` に設定されていますが、大きなペイロードを生成するエンドポイントに変更して再ストリーミングすることをお勧めします。

   ```
   openapi: "3.0.1"
   info:
     title: "ResponseStreamingDemo"
     version: "2025-04-28T17:28:25Z"
   servers:
   - url: "{basePath}"
     variables:
       basePath:
         default: "prod"
   paths:
     /streaming:
       get:
         x-amazon-apigateway-integration:
           httpMethod: "GET"
           uri: "https://example.com"
           type: "http_proxy"
           timeoutInMillis: 900000
           responseTransferMode: "STREAM"
   ```

1. 次の `import-rest-api` コマンドを使用して、OpenAPI 定義をインポートします。

   ```
   aws apigateway import-rest-api \
     --body 'fileb://~/ResponseStreamDemoSwagger.yaml' \
     --parameters endpointConfigurationTypes=REGIONAL \
     --region us-west-1
   ```

1. 次の `create-deployment` コマンドを使用して、新しい API をステージにデプロイします。

   ```
   aws apigateway create-deployment \
     --rest-api-id a1b2c3 \
     --stage-name prod \
     --region us-west-1
   ```

------

## HTTP プロキシ統合のレスポンス転送モードを更新する
<a name="response-streaming-http-update"></a>

次の手順は、HTTP プロキシ統合のレスポンス転送モードを更新する方法を示しています。

------
#### [ AWS マネジメントコンソール ]

**HTTP プロキシ統合のレスポンス転送モードを更新するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. メソッドを選択します。

1. **[統合リクエスト]** タブの **[統合リクエストの設定]** で、**[編集]** を選択します。

1. **[レスポンス転送モード]** で、**[ストリーム]** を選択します。

1. **[保存]** を選択します。

メソッドを更新したら、API をデプロイします。

**API をデプロイするには**

1. [**API のデプロイ**] を選択します。

1. **[ステージ]** で **[新規ステージ]** を選択します。

1. [**Stage name (ステージ名)**] に **prod** と入力します。

1. (オプション) **[説明]** に説明を入力します。

1. **[デプロイ]** をクリックします。

------
#### [ AWS CLI ]

次の `update-integration` コマンドは、統合の転送モードを `BUFFERED` から `STREAM` に更新します。既存の API の場合、すべての統合のレスポンス転送モードは `BUFFERED` に設定されます。

```
aws apigateway update-integration \
 --rest-api-id a1b2c3 \
 --resource-id aaa111 \
 --http-method GET \
 --patch-operations "op='replace',path='/responseTransferMode',value=STREAM" \
 --region us-west-1
```

変更を有効にするには、API を再デプロイする必要があります。統合タイムアウトをカスタマイズした場合、API Gateway がレスポンスを最大 5 分間ストリーミングするため、このタイムアウト値は削除されます。

次の `update-integration` コマンドは、統合の転送モードを `STREAM` から `BUFFERED` に更新します。

```
aws apigateway update-integration \
 --rest-api-id a1b2c3 \
 --resource-id aaa111 \
 --http-method GET \
 --patch-operations "op='replace',path='/responseTransferMode',value=BUFFERED" \
 --region us-west-1
```

変更を有効にするには、API を再デプロイする必要があります。

------

# API Gateway でペイロードレスポンスストリーミングと Lambda プロキシ統合を設定する
<a name="response-transfer-mode-lambda"></a>

Lambda 関数のレスポンスをストリーミングして、最初のバイトまでの時間 (TTFB) のパフォーマンスを向上させ、利用可能になると部分的なレスポンスをクライアントに送信し直すことができます。API Gateway では、[InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) Lambda API を使用して Lambda 関数を呼び出す必要があります。API Gateway はイベントオブジェクトを Lambda 関数に渡します。バックエンド Lambda 関数では、受信リクエストデータを解析して、返すレスポンスを決定します。API Gateway が Lambda 出力をストリーミングするには、Lambda 関数が API Gateway に必要な[形式](#response-transfer-mode-lambda-format)を出力する必要があります。

## ストリームとバッファレスポンス転送モードの Lambda プロキシ統合の違い
<a name="response-transfer-mode-lambda-comparison"></a>

次のリストでは、レスポンスストリーミングの Lambda プロキシ統合と Lambda プロキシ統合の違いについて説明します。
+ API Gateway は、[InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) API を使用して、レスポンスストリーミング用の Lambda プロキシ統合を呼び出します。これにより、次の異なる URI になります。

  ```
  arn:aws:apigateway:us-west-1:lambda:path/2021-11-15/functions/arn:aws:lambda:us-west-1:111122223333:function:my-function-name/response-streaming-invocations
  ```

  この ARN は、Lambda プロキシ統合とは異なる API バージョンと異なるサービスアクションを使用します。

  レスポンスストリーミングに API Gateway コンソールを使用する場合、コンソールは正しい URI を使用します。
+ Lambda プロキシ統合では、API Gateway は Lambda から完全なレスポンスを受け取った後にのみクライアントにレスポンスを送信します。レスポンスストリーミング用の Lambda プロキシ統合では、API Gateway は Lambda から有効なメタデータと区切り記号を受け取った後にペイロードストリームを開始します。
+ レスポンスストリーミング用の Lambda プロキシ統合は、プロキシ統合と同じ入力形式を使用しますが、異なる出力形式が必要です。

## レスポンスストリーミング用の Lambda プロキシ統合形式
<a name="response-transfer-mode-lambda-format"></a>

API Gateway がレスポンスストリーミングで Lambda 関数を呼び出す場合、入力形式はプロキシ統合用の Lambda 関数の入力形式と同じです。詳細については、「[プロキシ統合のための Lambda 関数の入力形式](set-up-lambda-proxy-integrations.md#api-gateway-simple-proxy-for-lambda-input-format)」を参照してください。

Lambda が API Gateway にレスポンスをストリーミングする場合、レスポンスは次の形式に従う必要があります。この形式では、区切り記号を使用してメタデータ JSON と raw ペイロードを区切ります。この場合、ペイロードデータはストリーミング Lambda 関数によって送信されるときにストリーミングされます。

```
{
  "headers": {"headerName": "headerValue", ...},
  "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
  "cookies" : ["cookie1", "cookie2"],
  "statusCode": httpStatusCode
}<DELIMITER>PAYLOAD1 | PAYLOAD2 | PAYLOAD3
```

出力では、次のようになります。
+ 余分なレスポンスヘッダーが返されない場合、`headers`、`multiValueHeaders`、`cookies`、および `statusCode` キーは指定されません。
+ `headers` キーには、単一値のヘッダーのみを含めることができます。
+ 出力では、ヘッダーに `Transfer-Encoding: chunked` または `Content-length: number` が含まれていることが想定されます。関数がこれらのヘッダーのいずれかを返さない場合、API Gateway はレスポンスヘッダーに `Transfer-Encoding: chunked` を追加します。
+ `multiValueHeaders` キーには、複数値のヘッダーや単一値のヘッダーを含めることができます。`multiValueHeaders` キーを使用して、単一値のヘッダーを含めて、すべてのヘッダーを指定することができます。
+ `headers` と `multiValueHeaders` の両方の値を指定した場合、API Gateway はそれらを単一のリストにマージします。同じキーと値のペアが両方で指定された場合にのみ、`multiValueHeaders` の値が、マージされたリストに表示されます。
+ メタデータは有効な JSON である必要があります。`headers`、`multiValueHeaders`、`cookies`、および `statusCode` キーのみがサポートされます。
+ メタデータ JSON の後に区切り記号を指定する必要があります。区切り記号は 8 null バイトで、ストリームデータの最初の 16KB 以内に出現する必要があります。
+ API Gateway では、メソッドレスポンスペイロードに特定の形式は必要ありません。

関数 URL を使用して Lambda 関数をストリーミングする場合は、これらの要件を満たすように Lambda 関数の入力と出力を変更する必要があります。

Lambda 関数の出力がこの形式の要件に準拠していない場合でも、API Gateway は Lambda 関数を呼び出す可能性があります。次の表は、API Gateway でサポートされている API 統合リクエスト設定と Lambda 関数コードの組み合わせを示しています。これには、バッファリングされたレスポンス転送モードでサポートされている組み合わせが含まれます。


| レスポンス転送モード | 関数コードが必要な形式に準拠している | Lambda 呼び出し API | API Gateway でサポートされている | 
| --- | --- | --- | --- | 
|  ストリーム  |  あり  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  はい。API Gateway はレスポンスをストリーミングします。  | 
|  ストリーム  |  不可  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  いいえ。API Gateway は Lambda 関数を呼び出し、500 のエラーレスポンスを返します。  | 
|  ストリーム  |  あり  |   [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  いいえ。API Gateway はこの統合設定をサポートしていません。  | 
|  ストリーム  |  不可  |   [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  いいえ。API Gateway はこの統合設定をサポートしていません。  | 
|  バッファ済み  |  あり  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  いいえ。API Gateway はこの統合設定をサポートしていません。  | 
|  バッファ済み  |  不可  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  いいえ。API Gateway はこの統合設定をサポートしていません。  | 
|  バッファ済み  |  あり  |   [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  API Gateway は HTTP ヘッダーとステータスコードを返しますが、レスポンス本文は返しません。  | 
|  バッファ済み  |  不可  |   [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  はい。これは Lambda プロキシ統合です。詳細については、「[Lambda プロキシ統合](set-up-lambda-proxy-integrations.md)」を参照してください。  | 

# API Gateway で Lambda プロキシとペイロードレスポンスストリーミングを設定する
<a name="response-streaming-lambda-configure"></a>

レスポンスペイロードストリーミングを設定するときは、リソースの統合リクエストで転送モードを指定します。これらの設定は、統合リクエストで設定して、統合レスポンスの前と最中に API Gateway がどのように動作するかを制御します。

## レスポンスストリーミングの Lambda 関数の例
<a name="response-streaming-lambda-example"></a>

Lambda 関数は [レスポンスストリーミング用の Lambda プロキシ統合形式](response-transfer-mode-lambda.md#response-transfer-mode-lambda-format) に準拠している必要があります。レスポンスストリーミングをテストするには、3 つのサンプル Lambda 関数のいずれかを使用することをお勧めします。Lambda 関数を作成するときは、必ず以下を実行してください。
+ 関数に適切なタイムアウトを指定します。レスポンスストリーミングについて学習するには、少なくとも 1 分のタイムアウトを設定することをお勧めします。本番稼働用リソースを作成するときは、Lambda 関数のタイムアウトがリクエストサイクル全体をカバーしていることを確認してください。詳細については、「[Lambda 関数のタイムアウトを設定する](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html)」を参照してください。
+ 最新の Node.js ランタイムを使用します。
+ Lambda レスポンスストリーミングが利用可能なリージョンを使用します。

------
#### [ Using HttpResponseStream.from ]

次のコード例では、パイプラインメソッドを使用せずに、`awslambda.HttpResponseStream()` メソッドを使用して JSON メタデータオブジェクトとペイロードをクライアントにストリーミングします。区切り記号を作成する必要はありません。詳細については、「[レスポンスストリーミング対応 Lambda 関数の記述](https://docs.aws.amazon.com/lambda/latest/dg/config-rs-write-functions.html)」を参照してください。

```
export const handler = awslambda.streamifyResponse(
  async (event, responseStream, context) => {
    const httpResponseMetadata = {
      "statusCode": 200,
      "headers": {
        "x-foo": "bar"
      },
      "multiValueHeaders": {
        "x-mv1": ["hello", "world"],
        "Set-Cookie": ["c1=blue", "c2=red"]
      }
    };

    responseStream = awslambda.HttpResponseStream.from(responseStream, httpResponseMetadata);
    await new Promise(r => setTimeout(r, 1000)); // synthetic delay

    responseStream.write("First payload ");
    await new Promise(r => setTimeout(r, 1000)); // synthetic delay

    responseStream.write("Final payload");
    responseStream.end();
});
```

------
#### [ Using the pipeline method ]

Lambda では、レスポンスストリーミングが有効な関数を記述するときに、ネイティブ Node.js ランタイムが提供する `awslambda.streamifyResponse()` デコレータと `pipeline()` メソッドを使用することをお勧めします。パイプラインメソッドを使用する場合、区切り記号を作成する必要はありません。Lambda がこれを行います。詳細については、「[レスポンスストリーミング対応 Lambda 関数の記述](https://docs.aws.amazon.com/lambda/latest/dg/config-rs-write-functions.html)」を参照してください。

次のコード例では、JSON メタデータオブジェクトと 3 つのペイロードをクライアントにストリーミングします。

```
import { pipeline } from 'node:stream/promises';
import { Readable } from 'node:stream';

export const handler = awslambda.streamifyResponse(
  async (event, responseStream, context) => {
    const httpResponseMetadata = {
      statusCode: 200,
      headers: {
        "Content-Type": "text/plain",
        "X-Custom-Header": "Example-Custom-Header"
      }
    };

    responseStream = awslambda.HttpResponseStream.from(responseStream, httpResponseMetadata);

    const dataStream = Readable.from(async function* () {
      yield "FIRST payload\n";
      await new Promise(r => setTimeout(r, 1000));
      yield "SECOND payload\n";
      await new Promise(r => setTimeout(r, 1000));
      yield "THIRD payload\n";
      await new Promise(r => setTimeout(r, 1000));
    }());

    await pipeline(dataStream, responseStream);
  }
);
```

------
#### [ Without using the pipeline method ]

次のコード例では、`awslambda.HttpResponseStream()` メソッドを使用せずに、JSON メタデータオブジェクトと 3 つのペイロードをクライアントにストリーミングします。`awslambda.HttpResponseStream()` メソッドを使用しない場合は、メタデータとペイロードの間に 8 null バイトの区切り記号を含める必要があります。

```
export const handler = awslambda.streamifyResponse(async (event, response, ctx) => {
  response.write('{"statusCode": 200, "headers": {"hdr-x": "val-x"}}');
  response.write("\x00".repeat(8)); // DELIMITER
  await new Promise(r => setTimeout(r, 1000));

  response.write("FIRST payload");
  await new Promise(r => setTimeout(r, 1000));

  response.write("SECOND payload");
  await new Promise(r => setTimeout(r, 1000));

  response.write("FINAL payload");
  response.end();
});
```

------

## ペイロードレスポンスストリーミングとの Lambda プロキシ統合を作成する
<a name="response-streaming-lambda-create"></a>

次の手順は、ペイロードレスポンスストリーミングで Lambda プロキシ統合を作成する方法を示しています。Lambda 関数の例を使用するか、独自の関数を作成します。

------
#### [ AWS マネジメントコンソール ]

**ペイロードレスポンスストリーミングで Lambda プロキシ統合を作成するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. **[リソースの作成]** を選択します。

1. **[リソース名]** に **streaming** と入力します。

1. **[リソースの作成]** を選択します。

1. **[/streaming]** リソースを選択した状態で、**[メソッドを作成]** を選択します。

1. **[メソッドタイプ]** で、**[任意]** を選択します。

1. **[統合タイプ]** で、**[Lambda]** を選択します。

1. **[Lambda プロキシ統合]** を選択します。

1. **[レスポンス転送モード]** で、**[ストリーム]** を選択します。

1. **[Lambda 関数]** で、Lambda 関数の名前を選択します。

   API Gateway コンソールは、[InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) API を自動的に使用して Lambda 関数を呼び出します。お客様は、レスポンスのストリーミングが有効な Lambda 関数を記述する責任があります。例については、[レスポンスストリーミングの Lambda 関数の例](#response-streaming-lambda-example)を参照してください。

1. **[メソッドの作成]** を選択します。

メソッドを作成したら、API をデプロイします。

**API をデプロイするには**

1. [**API のデプロイ**] を選択します。

1. **[ステージ]** で **[新規ステージ]** を選択します。

1. [**Stage name (ステージ名)**] に **prod** と入力します。

1. (オプション) **[説明]** に説明を入力します。

1. **[デプロイ]** をクリックします。

------
#### [ AWS CLI ]

次の手順では、`responseTransferMode` を `STREAM` に設定して新しい API をインポートする方法を示します。既存の統合 API があり、`responseTransferMode` を変更する場合は、「[Lambda プロキシ統合のレスポンス転送モードを更新する](#response-streaming-lambda-update)」を参照してください。

**ペイロードレスポンスストリーミングを使用して新しい API を作成するには**

1. 以下の Open API ファイルをコピーし、`ResponseStreamDemoSwagger.yaml` として保存します。このファイルでは、`responseTransferMode` は `STREAM` に設定され、統合 URI は `arn:aws:apigateway:us-west-1:lambda:path/2021-11-15/functions/arn:aws:lambda:us-west-1:111122223333:function:my-function-name/response-streaming-invocations` に設定されます。

   `my-function` の関数名をストリーミング対応関数に置き換え、認証情報を、`apigateway` サービスが Lambda 関数を呼び出すことを許可するポリシーを持つ IAM ロールに置き換えます。

   ```
   openapi: "3.0.1"
   info:
     title: "ResponseStreamingDemo"
     version: "2025-04-28T17:28:25Z"
   servers:
   - url: "{basePath}"
     variables:
       basePath:
         default: "prod"
   paths:
     /lambda:
       get:
         x-amazon-apigateway-integration:
           httpMethod: "POST"
           uri: "arn:aws:apigateway:us-west-1:lambda:path/2021-11-15/functions/arn:aws:lambda:us-west-1:111122223333:function:my-function-name/response-streaming-invocations"
           type: "aws_proxy"
           timeoutInMillis: 90000
           responseTransferMode: "STREAM"
           credentials: "arn:aws:iam::111122223333:role/apigateway-lambda-role"
   ```

   認証情報の IAM ロールを指定する代わりに、Lambda の `add-permission` コマンドを使用してリソースベースのアクセス許可を追加できます。

1. 次の `import-rest-api` コマンドを使用して、OpenAPI 定義をインポートします。

   ```
   aws apigateway import-rest-api \
     --body 'fileb://~/ResponseStreamDemoSwagger.yaml' \
     --parameters endpointConfigurationTypes=REGIONAL \
     --region us-west-1
   ```

1. 次の `create-deployment` コマンドを使用して、新しい API をステージにデプロイします。

   ```
   aws apigateway create-deployment \
     --rest-api-id a1b2c2 \
     --stage-name prod \
     --region us-west-1
   ```

------

### Lambda プロキシ統合のレスポンス転送モードを更新する
<a name="response-streaming-lambda-update"></a>

次の手順は、Lambda プロキシ統合のレスポンス転送モードを更新する方法を示しています。レスポンス転送モードをストリーミングに変更する場合は、レスポンスストリーミングの要件に準拠するように Lambda 関数を更新します。Lambda 関数の例を使用するか、独自の関数を作成します。

------
#### [ AWS マネジメントコンソール ]

**Lambda プロキシ統合のレスポンス転送モードを更新するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. メソッドを選択します。

1. **[統合リクエスト]** タブの **[統合リクエストの設定]** で、**[編集]** を選択します。

1. **[レスポンス転送モード]** で、**[ストリーム]** を選択します。

1. **[Lambda 関数]** で、Lambda 関数の名前を選択します。

1. **[保存]** を選択します。

メソッドを更新したら、API をデプロイします。

**API をデプロイするには**

1. [**API のデプロイ**] を選択します。

1. **[ステージ]** で **[新規ステージ]** を選択します。

1. [**Stage name (ステージ名)**] に **prod** と入力します。

1. (オプション) **[説明]** に説明を入力します。

1. **[デプロイ]** をクリックします。

------
#### [ AWS CLI ]

1. Lambda 関数を更新してストリーミングを有効にします。

1. 次の AWS CLI コマンドを使用して、統合 URI と統合のレスポンス転送モードを更新します。

   ```
   aws apigateway update-integration \
    --rest-api-id a1b2c3 \
    --resource-id aaa111 \
    --http-method ANY \
    --patch-operations "[{\"op\":\"replace\",\"path\":\"/uri\",\"value\":\"arn:aws:apigateway:us-west-1:lambda:path/2021-11-15/functions/arn:aws:lambda:us-west-1:111122223333:function:my-function-name/response-streaming-invocations\"}, {\"op\":\"replace\",\"path\":\"/responseTransferMode\",\"value\":\"STREAM\"}]" \
    --region us-west-1
   ```

1. 変更を有効にするには、API を再デプロイします。

------

# API Gateway でのレスポンスストリーミングに関する問題のトラブルシューティング
<a name="response-streaming-troubleshoot"></a>

次のトラブルシューティングガイダンスは、レスポンスストリーミングを試用する API の問題を解決するのに役立ちます。

## 一般的なトラブルシューティング
<a name="response-streaming-general-troubleshooting"></a>

[TestInvokeMethod](https://docs.aws.amazon.com/apigateway/latest/api/API_TestInvokeMethod.html) またはコンソールのテストタブを使用して、ストリームレスポンスをテストできます。以下の考慮事項は、レスポンスストリーミングでのテスト呼び出しの使用に影響する可能性があります。
+ メソッドをテストすると、API Gateway はストリーミングされたレスポンスペイロードをバッファリングします。次のいずれかの条件が満たされると、API Gateway はバッファリングされたペイロードを含む 1 回限りのレスポンスを返します。
  + リクエストが完了しました
  + 35 秒経過
  + 1 MB を超えるレスポンスペイロードがバッファされています
+ メソッドが HTTP レスポンスステータスとすべてのヘッダーを返すまでに 35 秒以上経過した場合、TestInvokeMethod で返されるレスポンスステータスは 0 になります。
+ API Gateway は実行ログを生成しません。

API をデプロイしたら、curl コマンドを使用してストリームレスポンスをテストできます。出力にプロトコルレスポンスヘッダーを含めるには、`-i` オプションを使用することをお勧めします。到着時にレスポンスデータを表示するには、curl オプション `--no-buffer` を使用します。

## cURL エラーのトラブルシューティング
<a name="response-streaming-troubleshoot-curl-error"></a>

統合をテストしていて、`curl: (18) transfer closed with outstanding read data remaining` エラーが表示される場合は、統合のタイムアウトが十分に長いことを確認してください。Lambda 関数を使用している場合は、Lambda 関数のレスポンスタイムアウトを更新する必要があります。詳細については、「[Lambda 関数のタイムアウトを設定する](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html)」を参照してください。

## アクセスログ記録を使用したトラブルシューティング
<a name="response-streaming-troubleshoot-access-logging"></a>

REST API ステージのアクセスログを使用して、レスポンスストリームのログ記録とトラブルシューティングを行うことができます。既存の変数に加えて、次のアクセスログ変数を使用できます。

`$context.integration.responseTransferMode`  
統合のレスポンス転送モード。`BUFFERED` または `STREAMED` のいずれかとなります。

`$context.integration.timeToAllHeaders`  
API Gateway が統合接続を確立してから、クライアントからすべての統合レスポンスヘッダーを受信するまでの時間。

`$context.integration.timeToFirstContent`  
API Gateway が統合接続を確立してから、最初のコンテンツバイトを受信するまでの時間。

`$context.integration.latency`-または-`$context.integrationLatency`  
API Gateway が統合接続を確立してから統合レスポンスストリームが完了するまでの時間。

次の図は、これらのアクセスログ変数がレスポンスストリームのさまざまなコンポーネントをどのように表しているかを示しています。

![\[API Gateway でのレスポンスストリーミングのアクセスログ変数\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/response-streaming-figure.png)


アクセスログの詳細については、「[API Gateway で REST API の CloudWatch ログ記録を設定する](set-up-logging.md)」を参照してください。X-Ray を使用してレスポンスストリームをモニタリングすることもできます。詳細については、「[API Gateway で X-Ray を使用して REST API へのユーザーリクエストをトレースする](apigateway-xray.md)」を参照してください。