API Gateway で Lambda プロキシとペイロードレスポンスストリーミングを設定する
レスポンスペイロードストリーミングを設定するときは、リソースの統合リクエストで転送モードを指定します。これらの設定は、統合リクエストで設定して、統合レスポンスの前と最中に API Gateway がどのように動作するかを制御します。
レスポンスストリーミングの Lambda 関数の例
Lambda 関数は レスポンスストリーミング用の Lambda プロキシ統合形式 に準拠している必要があります。レスポンスストリーミングをテストするには、3 つのサンプル Lambda 関数のいずれかを使用することをお勧めします。Lambda 関数を作成するときは、必ず以下を実行してください。
-
関数に適切なタイムアウトを指定します。レスポンスストリーミングについて学習するには、少なくとも 1 分のタイムアウトを設定することをお勧めします。本番稼働用リソースを作成するときは、Lambda 関数のタイムアウトがリクエストサイクル全体をカバーしていることを確認してください。詳細については、「Lambda 関数のタイムアウトを設定する」を参照してください。
-
最新の Node.js ランタイムを使用します。
Lambda レスポンスストリーミングが利用可能なリージョンを使用します。
- Using HttpResponseStream.from
-
次のコード例では、パイプラインメソッドを使用せずに、
awslambda.HttpResponseStream()メソッドを使用して JSON メタデータオブジェクトとペイロードをクライアントにストリーミングします。区切り記号を作成する必要はありません。詳細については、「レスポンスストリーミング対応 Lambda 関数の記述」を参照してください。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 関数の記述」を参照してください。次のコード例では、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 プロキシ統合を作成する
次の手順は、ペイロードレスポンスストリーミングで Lambda プロキシ統合を作成する方法を示しています。Lambda 関数の例を使用するか、独自の関数を作成します。
- AWS マネジメントコンソール
-
ペイロードレスポンスストリーミングで Lambda プロキシ統合を作成するには
-
https://console.aws.amazon.com/apigateway
で API Gateway コンソールにサインインします。 REST API を選択します。
[リソースの作成] を選択します。
[リソース名] に
streamingと入力します。[リソースの作成] を選択します。
[/streaming] リソースを選択した状態で、[メソッドを作成] を選択します。
[メソッドタイプ] で、[任意] を選択します。
[統合タイプ] で、[Lambda] を選択します。
[Lambda プロキシ統合] を選択します。
[レスポンス転送モード] で、[ストリーム] を選択します。
[Lambda 関数] で、Lambda 関数の名前を選択します。
API Gateway コンソールは、InvokeWithResponseStream API を自動的に使用して Lambda 関数を呼び出します。お客様は、レスポンスのストリーミングが有効な Lambda 関数を記述する責任があります。例については、レスポンスストリーミングの Lambda 関数の例を参照してください。
[メソッドの作成] を選択します。
メソッドを作成したら、API をデプロイします。
API をデプロイするには
[API のデプロイ] を選択します。
[ステージ] で [新規ステージ] を選択します。
[Stage name (ステージ名)] に
prodと入力します。(オプション) [説明] に説明を入力します。
[デプロイ] をクリックします。
-
- AWS CLI
-
次の手順では、
responseTransferModeをSTREAMに設定して新しい API をインポートする方法を示します。既存の統合 API があり、responseTransferModeを変更する場合は、「Lambda プロキシ統合のレスポンス転送モードを更新する」を参照してください。ペイロードレスポンスストリーミングを使用して新しい API を作成するには
-
以下の 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コマンドを使用してリソースベースのアクセス許可を追加できます。 次の
import-rest-apiコマンドを使用して、OpenAPI 定義をインポートします。aws apigateway import-rest-api \ --body 'fileb://~/ResponseStreamDemoSwagger.yaml' \ --parameters endpointConfigurationTypes=REGIONAL \ --region us-west-1次の
create-deploymentコマンドを使用して、新しい API をステージにデプロイします。aws apigateway create-deployment \ --rest-api-ida1b2c2\ --stage-name prod \ --region us-west-1
-
Lambda プロキシ統合のレスポンス転送モードを更新する
次の手順は、Lambda プロキシ統合のレスポンス転送モードを更新する方法を示しています。レスポンス転送モードをストリーミングに変更する場合は、レスポンスストリーミングの要件に準拠するように Lambda 関数を更新します。Lambda 関数の例を使用するか、独自の関数を作成します。
- AWS マネジメントコンソール
-
Lambda プロキシ統合のレスポンス転送モードを更新するには
-
https://console.aws.amazon.com/apigateway
で API Gateway コンソールにサインインします。 REST API を選択します。
メソッドを選択します。
[統合リクエスト] タブの [統合リクエストの設定] で、[編集] を選択します。
[レスポンス転送モード] で、[ストリーム] を選択します。
[Lambda 関数] で、Lambda 関数の名前を選択します。
[保存] を選択します。
メソッドを更新したら、API をデプロイします。
API をデプロイするには
[API のデプロイ] を選択します。
[ステージ] で [新規ステージ] を選択します。
[Stage name (ステージ名)] に
prodと入力します。(オプション) [説明] に説明を入力します。
[デプロイ] をクリックします。
-
- AWS CLI
-
Lambda 関数を更新してストリーミングを有効にします。
次の AWS CLI コマンドを使用して、統合 URI と統合のレスポンス転送モードを更新します。
aws apigateway update-integration \ --rest-api-ida1b2c3\ --resource-idaaa111\ --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-
変更を有効にするには、API を再デプロイします。