Amazonは先日、AWS Lambda関数がレスポンスペイロードを段階的にクライアントにストリームバックできることを発表した。この新機能は、Webおよびモバイルアプリケーションのパフォーマンスを向上させるもので、現在、Node.js 14.xおよびそれ以降のランタイム、およびカスタムランタイムで利用できる。
レスポンスストリーミングは、開発者がレスポンス全体の終了を必ずしも待つことなく、関数からユーザーへのレスポンスをストリームすることを支援する。この待望の機能は、Lambda関数のURLとSDKを使用してサポートされているが、現在API GatewayやApplication Load Balancer(ALB)を使用してレスポンスペイロードをストリームすることはできない。そのメリットについて、プリンシパル・デベロッパー・アドボケイトのJulian Wood氏は次のように説明している。
従来のリクエスト・レスポンス型では、レスポンスを完全に生成し、クライアントに返す前にバッファリングする必要がありました。このため、クライアントがレスポンスの生成を待つ間、TTFB(Time to First Byte)のパフォーマンスが遅れることがあります。ウェブアプリケーションは、TTFBとページロードパフォーマンスに特に敏感です。
画像、動画、大きなドキュメント、またはデータベースの結果のような大きなペイロードのために設計されたレスポンスストリーミングでは、 例えば、Lambda関数ハンドラーをstreamifyResponse()デコレーターでラップする必要がある。
exports.handler = awslambda.streamifyResponse(
async (event, responseStream, context) => {
responseStream.setContentType("text/plain");
responseStream.write("Hello, world!");
responseStream.end();
}
);
ここで、新しい レスポンスストリーム オブジェクトは、関数がデータを書き込んですぐにクライアントに送信できるストリームオブジェクトを提供する。開発者は、オプションでレスポンスのContent-Typeヘッダを設定し、ストリームに関する追加情報を渡すことが可能だ。Datadogのエンジニアリング・チーム・リードであるAJ Stuyvenberg氏は、この新機能をテストし、コメントを寄せている。
今回の発表では、いくつかの重要なユースケース、特にサーバーサイドレンダリングを活用しながら最初のバイトにかかる時間を短縮したいNext.jsやReactの開発者向けのユースケースが開放されたように思われます。
この新機能は、現在、最大20MBのレスポンスサイズ(ソフトリミット)をサポートしており、ストリーミング機能の最大帯域幅スループット制限は16Mbps(2MB/秒)である。現在、レスポンスストリーミングはNode.js SDKでのみネイティブに利用可能だが、他のプログラミング言語をサポートするカスタムLambdaランタイムで実装できる。
制限に注目する開発者もいるが、AmptのCEO兼共同創業者であるJeremy Daly氏は自身のニュースレターで次のように書いている。
Lambda関数がレスポンスを徐々にクライアントに戻してTTFBを削減できるだけでなく、標準の6MBのペイロード制限を超えることが可能になる。
クラウドコンサルタントでAWS Serverless HeroのYan Cui氏は、S3に結果を保存する必要性を回避して、新しいストリーミングレスポンスで大きなオブジェクトを返す方法を記事にしている。
Lambdaでのレスポンスストリーミングは、クラウド空間での最初の選択肢ではない。Vercelは最近、Node.js(Lambda)とEdgeの両方のランタイムでHTTPレスポンスストリーミングのサポートを提供している。
AWSは、Serverless Patterns CollectionでLambdaストリーミングアプリケーションの例を公開しており、これらはリソースの構築とデプロイにAWS SAMをサポートするアプリケーションとなっている。レスポンスのストリーミングは、ネットワーク転送のためにLambdaのコストが増加するが、現在AWSの無料枠にはリクエストごとに最初の6MBを超えると、月あたり100GiBのHTTPレスポンスストリーミングが含まれている。