ストリームレスポンスに Lambda 関数を設定する
Lambda 関数 URL を設定して、レスポンスペイロードをクライアントにストリーミングで返すようにできます。レスポンスストリーミングは、最初のバイトまでの時間 (TTFB) のパフォーマンスを向上させることで、レイテンシーの影響を受けやすいアプリケーションに役立ちます。これは、レスポンスの一部が利用可能になったときにクライアントに返送できるためです。さらに、レスポンスストリーミングを使用して、より大きなペイロードを返す関数を構築できます。レスポンスストリームのペイロードには、バッファされるレスポンスの 6 MB と比較して 20 MB のソフトリミットがあります。応答をストリーミングするということは、関数が応答全体をメモリに収める必要がないことも意味します。応答サイズが非常に大きい場合は、関数に設定する必要のあるメモリ量を減らすことができます。
Lambda が応答をストリーミングする速度は、応答サイズによって異なります。関数の応答では、最初の 6 MB のストリーミングレートには上限がありません。応答が 6 MB を超える場合、残りの応答には帯域幅の上限が適用されます。ストリーミング帯域幅の詳細については、レスポンスストリーミングの帯域幅制限 を参照してください。
ストリーミングレスポンスにはコストが発生します。詳細については、「AWS Lambdaの料金
Lambda は Node.js マネージドランタイムでのレスポンスストリーミングをサポートしています。その他の言語の場合は、カスタムランタイム API 統合を備えたカスタムランタイムを使用してレスポンスをストリーミングするか、Lambda Web Adapter
注記
Lambda コンソールで関数をテストするとき、レスポンスは常にバッファリングされた状態で表示されます。
レスポンスストリーミング対応関数の作成
レスポンスストリーミング関数のハンドラー記述は、一般的なハンドラーパターンとは異なります。ストリーミング関数の作成時は、必ず次の事項を確認してください。
ネイティブ Node.js ランタイムの
awslambda.streamifyResponse()
デコレーターで関数をラップします。確実にすべてのデータ処理を完了させるため、ストリームを正常に終了させます。
ストリームレスポンスにハンドラー関数を設定する
Lambda が関数のレスポンスをストリーミングする必要があることをランタイムに示すには、関数を streamifyResponse()
デコレーターでラップする必要があります。これにより、レスポンスをストリーミングするために適切なロジックパスを使用するようランタイムに指示し、関数がレスポンスをストリーミングできるようにします。
streamifyResponse()
デコレーターは、次のパラメータを受けつける関数を受けつけます。
event
— HTTP メソッド、クエリパラメータ、リクエスト本文など、関数 URL の呼び出しイベントに関する情報を提供します。responseStream
— 書き込み可能なストリームを提供します。context
– 呼び出し、関数、実行環境に関する情報を含むメソッドおよびプロパティを提供します。
responseStream
オブジェクトは「Node.js writableStream
pipeline()
メソッドを使用する必要があります。
例 レスポンスストリーミング対応ハンドラー
const pipeline = require("util").promisify(require("stream").pipeline); const { Readable } = require('stream'); exports.echo = awslambda.streamifyResponse(async (event, responseStream, _context) => { // As an example, convert event to a readable stream. const requestStream = Readable.from(Buffer.from(JSON.stringify(event))); await pipeline(requestStream, responseStream); });
responseStream
にはストリームに書き込む write()
メソッドが用意されていますが、「pipeline()
pipeline()
を使用すると、書き込み可能なストリームが読み取り速度の速いストリームによって抑制されることがなくなります。
ストリームを終了する
ハンドラーが戻る前にストリームが適切に終了することを確認してください。pipeline()
メソッドはこれを自動的に処理します。
他のユースケースでは、responseStream.end()
メソッドを呼び出してストリームを適切に終了させます。このメソッドは、ストリームにこれ以上データを書き込む必要がないことを通知します。pipeline()
または pipe()
でストリームに書き込む場合、このメソッドは不要です。
例 pipeline() でストリームを終了する例
const pipeline = require("util").promisify(require("stream").pipeline); exports.handler = awslambda.streamifyResponse(async (event, responseStream, _context) => { await pipeline(requestStream, responseStream); });
例 pipeline() なしでストリームを終了する例
exports.handler = awslambda.streamifyResponse(async (event, responseStream, _context) => { responseStream.write("Hello "); responseStream.write("world "); responseStream.write("from "); responseStream.write("Lambda!"); responseStream.end(); });
Lambda 関数 URL を使用してレスポンスストリーミング対応関数を呼び出す
注記
レスポンスをストリーミングするには、関数 URL を使用して関数を呼び出す必要があります。
関数 URL の呼び出しモードを変更することで、レスポンスストリーミング対応関数を呼び出すことができます。呼び出しモードは、Lambda が関数を呼び出すために使用する API オペレーションを決定します。利用可能な呼び出しモードは以下のとおりです。
-
BUFFERED
– これはデフォルトのオプションです。Lambda はInvoke
API オペレーションを使用して関数を呼び出します。ペイロードが完了すると、呼び出し結果が表示されます。最大ペイロードサイズは 6 MB です。 -
RESPONSE_STREAM
— ペイロード結果が利用可能になったら、関数がそれをストリーミングできるようにします。Lambda はInvokeWithResponseStream
API オペレーションを使用して関数を呼び出します。レスポンスペイロードの最大サイズは 20 MB です。ただし、「クォータ引き上げをリクエスト」することができます。
Invoke
API オペレーションを直接呼び出すことにより、レスポンスストリーミングなしで関数を呼び出すことができます。ただし、呼び出しモードを BUFFERED
に変更しない限り、Lambda は関数 URL を経由するすべての呼び出しレスポンスペイロードをストリーミングします。
関数 URL の呼び出しモードを設定するには (コンソール)
-
Lambda コンソールの [関数]
ページを開きます。 -
呼び出しモードを設定する関数の名前を選択します。
-
[設定] タブを開き、次に [関数 URL] をクリックします。
-
[編集] を選択し、次に [追加設定] を選択します。
-
[呼び出しモード] で目的の呼び出しモードを選択します。
-
[保存] をクリックします。
関数 URL (AWS CLI) の呼び出しモードを設定するには
aws lambda update-function-url-config --function-name
my-function
--invoke-mode RESPONSE_STREAM
関数 URL (AWS CloudFormation) の呼び出しモードを設定するには
MyFunctionUrl: Type: AWS::Lambda::Url Properties: AuthType: AWS_IAM InvokeMode: RESPONSE_STREAM
関数 URL の設定の詳細については、「Lambda 関数 URL」を参照してください。
レスポンスストリーミングの帯域幅制限
関数のレスポンスペイロードの最初の 6 MB の帯域幅には上限がありません。この最初のバースト後、Lambda はレスポンスを最大 2 Mbps のレートでストリーミングします。関数のレスポンスが 6 MB を超えない場合、この帯域幅制限は適用されません。
注記
帯域幅制限は関数のレスポンスペイロードにのみ適用され、関数によるネットワークアクセスには適用されません。
上限のない帯域幅は、関数の処理速度を含む多くの要素によって異なります。通常、関数のレスポンスでは、最初の 6 MB で 2 Mbps を超えるレートが期待できます。関数が AWS 外部の宛先にレスポンスをストリーミングする場合、ストリーミングレートは外部インターネット接続の速度にも依存します。