Slide 1

Slide 1 text

JAWS-UG横浜 #61 AWS re:Invent 2023 去年のアレどうなった? スペシャル AWS Lambda response streaming 実装前にしりたいやつ 1

Slide 2

Slide 2 text

自己紹介 渡邉 洋平(watany) NTTテクノクロス株式会社 横浜オフィス JAWS-UG東京 Japan AWS Top Engineer 2023 2

Slide 3

Slide 3 text

最近の悩み Bedrock話をする予定だったが、誤っ て2週間前に話してしまう。。。 「Bun & Honoで始める Amazon Bedrock入門 -完全 版-」 [検索] 2日前にも濃いイベントがあった 3

Slide 4

Slide 4 text

予定変更 Amazon Bedrock -> AWS Lambda response streaming 初出Re:Inventじゃなかったらゴメンm(_ _)m Bedrockの番外編ということで…… 4

Slide 5

Slide 5 text

AWS Lambda response streaming 2023/04/07 機能追加。 CDKではこんな感じ(ワイが作った) Responseを段階的にStreaming送信可能に! 6MB越えのresponse(MAX 20GB) Streamingにより、ユーザ体験の向上 ChatGPTやClaude2でよくある「ヌルヌ ル返す」 response streaming の前提 Node.js 14.x 以降のランタイム カスタムランタイム 5

Slide 6

Slide 6 text

実装の基本 Node.jsランタイムでは awslambda.streamifyResponse() でHandlerをラップするだけ カスタムランタイムではResponseに以下のHeaderをつけてPOST Lambda-Runtime-Function-Response-Mode: streaming Transfer-Encoding: chunked 注) カスタムランタイムは試せていません https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html#runtimes- custom-response-streaming 6

Slide 7

Slide 7 text

ここまではリリース時に出た話 7

Slide 8

Slide 8 text

ここからが実装沼の世界 8

Slide 9

Slide 9 text

1. awslambda.streamifyResponse の 型 9

Slide 10

Slide 10 text

Q. 君の型は? 10

Slide 11

Slide 11 text

A. 公式ドキュメントに https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-response- streaming.html event, context -> いつものLambda eventはいい感じで import { Context } from 'aws-lambda'; responseStream -> Nodejs.Writestream Web標準のStreams API で無いことに注意 11

Slide 12

Slide 12 text

2. Header問題 12

Slide 13

Slide 13 text

Q2. Headerが設定できていない アプリで Content-Type: text/event-stream を指定してもダメ 13

Slide 14

Slide 14 text

A2. HttpResponseStream.fromを使う statusCode や headers をJSON(metadata)として定義する responseStreamに awslambda.HttpResponseStream.from(responseStream, metadata) で 付与する。 14

Slide 15

Slide 15 text

Q.2´ このメソッドなんやねん A.2´ …… 公式のSAMテンプレートの中で使っている。(説明は……) 15

Slide 16

Slide 16 text

aws-sampleでも使っている。 metadataのinterfaceマジでわからん(誰か教えて) 16

Slide 17

Slide 17 text

3. 謎の遅延 17

Slide 18

Slide 18 text

Q3. なんか時間にムラが Streamされる最初の送信を2秒待つ? 出典:https://betterdev.blog/lambda-response-streaming-flush-content/ 18

Slide 19

Slide 19 text

A3. 非公開仕様……? AWS Community BuilderのMaciej氏のブログ https://betterdev.blog/lambda-response-streaming-flush-content/ TL;DR Lambda response streamは小さなペイロードをすぐに送信せず、書き込みまで数秒でも 待機する。 flushの閾値は、100 KB 前後と想定。 本番データは大丈夫なのに、単純なPoCだけ動きが変なら、多分コレ。 19

Slide 20

Slide 20 text

4. テストケース 20

Slide 21

Slide 21 text

Q4. 独自のメソッド入りでどうやってテストケースを……? Lambdaにしかない、グローバルメソッドたち awslambda.streamifyResponse awslambda.HttpResponseStream.from(responseStream, metadata) A4. Mock使うしかなさそう 21

Slide 22

Slide 22 text

例1: AWS Lambda RIC RIC = Runtime Interface Client 私はこれを読んでMockを作りました https://github.com/aws/aws-lambda-nodejs-runtime-interface-client 22

Slide 23

Slide 23 text

例2: 3rd Party https://github.com/astuyve/lambda-stream 23

Slide 24

Slide 24 text

いかがでしたか? (とりあえずテスト用のライブラリとメソッドの仕様が欲しい) 24

Slide 25

Slide 25 text

Appendix. よくわからなかったら、Honoのv3.10.0(2023/11/13)を 使おう! https://hono.dev/ Hono エッジでもAWS Lambdaでも動くWebフレー ムワーク 今回話した仕様はすべて streamHandle に実装 しました。 ※バッファサイズ以外 フレームワーク通りに実装して、Adaptorを書けば 動く 25