Slide 1

Slide 1 text

サーバーレスJavaの今 ~SnapStartとWeb Adapterを寄せて~ 佐藤 靖幸 JJUG CCC 2023 Spring 2023/06/04 JJUG CCC 2023 Spring 1

Slide 2

Slide 2 text

⾃⼰紹介 2023/06/04 JJUG CCC 2023 Spring 2 佐藤 靖幸 @yasai_ls 得意領域 バックエンド開発 クラウドインフラ(AWS) 好きなプログラミング⾔語 Java GO PARTNER NETWORK 2022 APN AWS Top Engineers © 佐藤靖幸 2023

Slide 3

Slide 3 text

本セッションについて 本セッションではサーバーレスJavaを取り巻く最新トレンドを ご紹介し、それぞれの優位性やトレードオフ、開発における TIPSなどを取り上げます。 本セッションで利⽤するアプリケーションフレームワークは Spring Boot と Quarkus を利⽤しています。 2023/06/04 JJUG CCC 2023 Spring 3

Slide 4

Slide 4 text

アジェンダ 2023/06/04 JJUG CCC 2023 Spring 4 そもそもサーバーレスって何だっけ︖ サーバーレスJava最前線︕ Lambda SnapStart AWS Lambda Web Adapter サーバーレスJavaにおける技術スタック選定 なぜイベント駆動アーキテクチャなのか サーバーレスJavaにおける開発TIPS 適応度関数の計測 便利なツールセット まとめ

Slide 5

Slide 5 text

そもそもサーバーレスって何だっけ︖ 2023/06/04 JJUG CCC 2023 Spring 5 いまいちど、サーバーレスに ついて簡単におさらい

Slide 6

Slide 6 text

サーバーレスとは インフラのプロビジョニング・管理が不要 ⾃動スケーリング 利⽤した分だけの⽀払い ⾼い可⽤性と安全性 2023/06/04 JJUG CCC 2023 Spring 6 AWS Lambda AWS Fargate

Slide 7

Slide 7 text

AWS Lambda 実⾏環境のレイヤー サーバーレスの代表機能 AWS Lambda AWS LambdaはEvent Drivenな Function as a service (FAAS) 本セッションでは LambdaのLayer Code層に デプロイされるJavaについて お話します。 2023/06/04 JJUG CCC 2023 Spring 7 Function, Layer Code Lambda Runtime Execution Environment Firecracker MicroVM Firecracker Virtual Machine Monitor Lambda Worker

Slide 8

Slide 8 text

Lambda SnapStart 2023/06/04 JJUG CCC 2023 Spring 8 Lambda SnapStartは サーバーレスJavaに どのような変化を もたらすのか

Slide 9

Slide 9 text

コールドスタート 従来のLambdaのライフサイクル サーバーレスJavaでは 「1. Initフェーズ」において MicorVM環境(JVM実⾏環境)の初期化 およびJarファイルのロードを実⾏ これをコールドスタートと呼ぶ サーバーレスJavaは肥⼤化した Jarファイルの読み込みで コールドスタートにかかる時間が増える 2023/06/04 JJUG CCC 2023 Spring 9 1. Init フェーズ Micro VM環境の初期化 2. Invoke フェーズ 関数の起動 3. Shutdown フェーズ Micro VM環境の終了 Extension init 拡張機能の起動 Runtime init ランタイムの起動 Function init 外部コードの起動

Slide 10

Slide 10 text

Lambda SnapStartによる ライフサイクルの変化 SnapStartを有効化してLambdaバージョンを発⾏すると、 関数を⼿動で呼び出すまでもなく⾃動的にInitフェーズが 実⾏されてLambdaのスナップショットが取得される 2023/06/04 JJUG CCC 2023 Spring 10 スナップショットの取得 1. Init フェーズ Micro VM環境の初期化 2. Create Snapshot フェーズ スナップショットの取得 Extension init 拡張機能の起動 Runtime init ランタイムの起動 Function init 外部コードの起動 SnapStartを 有効化して デプロイ バージョン 発⾏をトリ ガーにInit フェーズが 実⾏される

Slide 11

Slide 11 text

Lambda SnapStartによる ライフサイクルの変化 SnapStartを有効化すると、 コールドスタートフェーズが スナップショットの 復元フェーズに変わる コールドスタートと⽐較して 起動速度が速くなる 2023/06/04 JJUG CCC 2023 Spring 11 スナップショットの取得 スナップショットの復元 1. Init フェーズ Micro VM環境の初期化 3. Invoke フェーズ 関数の起動 4. Shutdown フェーズ Micro VM環境の終了 Extension init 拡張機能の起動 Runtime init ランタイムの起動 Function init 外部コードの起動 2. Restore Snapshot フェーズ スナップショットの復元

Slide 12

Slide 12 text

Lambda SnapStartの有効化 AWS SAMで簡単に有効化 2023/06/04 JJUG CCC 2023 Spring 12

Slide 13

Slide 13 text

Lambda SnapStartによる 起動時間の変化 起動時間が ¼ まで短縮 2023/06/04 JJUG CCC 2023 Spring 13 7027.66 1779.53 4055.57 932.17 0 1000 2000 3000 4000 5000 6000 7000 8000 Spring Boot Spring Boot with SnapStart Quarkus Quarkus with SnapStart Lambda SnapStartによる起動時間の変化 起動時間(ms)

Slide 14

Slide 14 text

Lambda SnapStartのトレードオフ (2023年5⽉30⽇時点) 未対応 Provisioned Concurrency(SnapStartとの併⽤不可) Arm64アーキテクチャ Amazon EFS 512MBを超えるエフェメラルストレージ トレードオフ Lambdaが14⽇間呼び出されないと関数がInactiveに移⾏ 2023/06/04 JJUG CCC 2023 Spring 14

Slide 15

Slide 15 text

Lambda SnapStartの考慮点 ⼀意性の確保とネットワーク確⽴ ⼀意性の確保 UUID⽣成など⼀意となる情報をスナップショットに 含めると⼀意性を確保できない → 初期化フェーズでは⼀意情報を⽣成しない ネットワーク確⽴ スナップショット復元後のネットワーク確⽴の担保が必要 外部API データベース接続 etc 2023/06/04 JJUG CCC 2023 Spring 15

Slide 16

Slide 16 text

Lambda SnapStartの考慮点 ランタイムフックの活⽤ LambdaがSnapStartのスナップショットを作成する前、 またはスナップショットから復元した後でフックを 挟むことができる beforeCheckpoint() ... スナップショットを作成する前 afterRestore() ... スナップショットから復元した後 2023/06/04 JJUG CCC 2023 Spring 16

Slide 17

Slide 17 text

ランタイムフックの例 2023/06/04 JJUG CCC 2023 Spring 17

Slide 18

Slide 18 text

スナップショット作成時に 多くのクラスを初期化する 起動時のレイテンシーとなる原因となるクラスは、 前述のbeforeCheckpoint()実⾏時に事前ロードしておくことで、 スナップショットに含めておく または、ダミー呼び出しを使⽤してクラスを事前ロードする 2023/06/04 JJUG CCC 2023 Spring 18

Slide 19

Slide 19 text

ダミー呼び出しロードの例 2023/06/04 JJUG CCC 2023 Spring 19

Slide 20

Slide 20 text

AWS Lambda Web Adapter 2023/06/04 JJUG CCC 2023 Spring 20 Spring Bootを Lambdaで起動︕︖ AWS Lambda Web Adapterの 魅⼒とは

Slide 21

Slide 21 text

Javaと⾔えば .... 様々なフレームワークと歩んだ歴史がある ... 2023/06/04 JJUG CCC 2023 Spring 21

Slide 22

Slide 22 text

AWS SAMや Serverless Frameworkがあるのでは︖ AWS SAM や Serverless Framework は Deployment Framework 簡単にサーバーレスアプリケーションを デプロイ出来るOSSという位置付け (現在は様々な拡張機能が追加) 2023/06/04 JJUG CCC 2023 Spring 22

Slide 23

Slide 23 text

サーバーレスJavaで フレームワークを使うメリット 使い慣れたフレームワークの利⽤による開発者体験の向上 → 特にローカル開発における利便性が向上 移植性の向上 サーバーレス ←→ コンテナ オーケストレーション 2023/06/04 JJUG CCC 2023 Spring 23

Slide 24

Slide 24 text

AWS Lambda Web Adapter アプリケーションフレームワークを使ったWebアプリケーションを (ほぼそのまま)AWS Lambdaで動かす 2023/06/04 JJUG CCC 2023 Spring 24

Slide 25

Slide 25 text

AWS Lambda Web Adapterの特徴 • HTTP・HTTPSプロトコルに対応 • Micro Vmで動作するWeb Adapterがプロキシのように機能する • Lambda Extensionとして動作 • Dockerイメージ・Zipパッケージの両⽅に対応 • マルチアーキテクチャ(x86_64, arm64) • Rust製(処理速度の速さ・優れたメモリ管理) 2023/06/04 JJUG CCC 2023 Spring 25

Slide 26

Slide 26 text

Spring Bootを AWS Lambda Web Adapterで動かす Spring Boot をパッケージ or コンテナイメージとしてデプロイ 拡張機能としてAWS Lambda Web Adapterを指定 2023/06/04 JJUG CCC 2023 Spring 26 Java 17 Spring Boot 3.0.6

Slide 27

Slide 27 text

Spring Boot with Web Adapter デプロイのステップ デプロイはAWS SAM CLIを利⽤することで 僅か3ステップでデプロイ可能 2023/06/04 JJUG CCC 2023 Spring 27

Slide 28

Slide 28 text

Spring Boot の Dockerfile例 sam build コマンド実⾏時にDockerfileを指定して Dockerイメージをビルド DockerfileにはAWS Lambda Web Adapterの拡張機能を コピーする⼀⽂を加える(これだけ) 2023/06/04 JJUG CCC 2023 Spring 28

Slide 29

Slide 29 text

AWS SAM CLIを利⽤して ビルドとデプロイを簡単にする sam build コマンドで Dockerfileからコンテナイメージを作成 sam deploy コマンドで⾃動的にECRリポジトリへのプッシュと、 AWS Lambdaのデプロイが完了 AWS SAM CLIによって ビルドとデプロイが 簡潔に実現可能︕ 2023/06/04 JJUG CCC 2023 Spring 29

Slide 30

Slide 30 text

Quarkusを AWS Lambda Web Adapterで動かす Quarkus をパッケージ or コンテナイメージとしてデプロイ 拡張機能としてAWS Lambda Web Adapterを指定 2023/06/04 JJUG CCC 2023 Spring 30 Java 17 QUARKUS 3.0.2.Final

Slide 31

Slide 31 text

Quarkus with Web Adapter デプロイのステップ Spring Bootと同じく デプロイはAWS SAM CLIを利⽤することで 僅か3ステップでデプロイ可能 2023/06/04 JJUG CCC 2023 Spring 31

Slide 32

Slide 32 text

Quarkus の Dockerfile例 Quarkusの例においても同様 DockerfileにAWS Lambda Web Adapterの拡張機能を コピーする⼀⽂を加える(これだけ) 2023/06/04 JJUG CCC 2023 Spring 32

Slide 33

Slide 33 text

コールドスタート時間の⽐較 6979.62 7289.53 7.65 4.05 6800 6850 6900 6950 7000 7050 7100 7150 7200 7250 7300 7350 Spring Boot Quarkus コールドスタート時間の⽐較 Init Duration(ms) Duration(ms) 2023/06/04 JJUG CCC 2023 Spring 33 Lambdaの起動に6~7秒... ?

Slide 34

Slide 34 text

More More More .... !!! Graal VM Native Image まだまだ(起動速度が)遅いな ... !? よろしい、ならばGraal VM Native Imageだっ︕︕︕ 2023/06/04 JJUG CCC 2023 Spring 34

Slide 35

Slide 35 text

コールドスタート時間の⽐較 (Native Image) 414.42 139.53 3.31 2.82 0 50 100 150 200 250 300 350 400 450 Spring Boot with Native Image Quarkus with Native Image コールドスタート時間の⽐較(NATIVE IMAGE) Init Duration(ms) Duration(ms) 2023/06/04 JJUG CCC 2023 Spring 35 1秒未満の起動時間まで短縮︕︕ 注⽬! (msです)

Slide 36

Slide 36 text

Native Imageの考慮点 ピーク時のスループット Native ImageはJITのように実⾏しながら 最適化を⾏うことができないため、 ピーク時スループットはJITモード実⾏より低い サーバーレスJavaはFaaSであるため JVM実⾏環境はリクエスト毎に 分散することが強み 2023/06/04 JJUG CCC 2023 Spring 36 0 5 10 15 20 25 30 Startup Speed Peak Throughput Max Latency Package Size Memory Footprint AOT JIT

Slide 37

Slide 37 text

Native Imageの考慮点 トレースエージェント Native ImageはJavaのリフレクションの動的要素に対応できない。 トレース・エージェントツールを使⽤して 到達可能性メタデータ(reflect-config.json)を⾃動⽣成 2023/06/04 JJUG CCC 2023 Spring 37 $JAVA_HOME/bin/java -agentlib:native-image- agent=config-output-dir=${OUTPUT_PATH}

Slide 38

Slide 38 text

AWS Lambda Web Adapterの トレードオフ (2023年5⽉11⽇時点) API Gateway、Lambda Functions URL、 Application Load Balancer のみをサポート EventBridge、S3イベント、SQSメッセージなどによる インテグレーションは従来のEventRequestクラスを 利⽤したハンドリングを推奨 2023/06/04 JJUG CCC 2023 Spring 38

Slide 39

Slide 39 text

(補⾜) Web Adapter以外の選択肢 フレームワーク共通 Serverless Java Container プロキシクラス利⽤による 各フレームワークとの統合 フレームワーク統合 Spring Cloud Function AWS LambdaをサポートしたSpring Framework 2023/06/04 JJUG CCC 2023 Spring 39

Slide 40

Slide 40 text

サーバーレスJavaにおける 技術スタック選定 2023/06/04 JJUG CCC 2023 Spring 40 サーバーレスJavaは、 どの技術スタックを 選べばいいのか

Slide 41

Slide 41 text

サーバーレスJavaは 技術スタックの選択肢が⾼度化 ライブラリ・実装・ビルド・デプロイオプション・デプロイ それぞれで選択肢がある 2023/06/04 JJUG CCC 2023 Spring 41

Slide 42

Slide 42 text

技術スタック選択肢における排他① Native Image ビルド⽅法にNative Imageを選択した場合は、SnapStartは 未対応。ライフサイクルフックが利⽤できない(2023年5⽉30⽇時点) 2023/06/04 JJUG CCC 2023 Spring 42

Slide 43

Slide 43 text

技術スタック選択肢における排他② SnapStart デプロイオプションにSnapStartを選択した場合は、 Container Imageは未対応 2023/06/04 JJUG CCC 2023 Spring 43

Slide 44

Slide 44 text

フレームワーク利⽤における 統合の選択肢 イベントハンドラー クラスを利⽤(基本) → フレームワークを使っているがイベントハンドラーと 密結合している。コンテナ移⾏のコストが⾼い フレームワークによるエンドポイントを利⽤ → コンテナ移⾏が極めて容易 2023/06/04 JJUG CCC 2023 Spring 44

Slide 45

Slide 45 text

将来的にコンテナに移⾏したい HTTPプロトコルAPIの場合 Framework(Web Adapter or Native Image or BOTH)を選択 2023/06/04 JJUG CCC 2023 Spring 45

Slide 46

Slide 46 text

将来的にコンテナに移⾏しない シンプルなAPIの場合 Pure Java (SnapStart or Native Image)を選択 2023/06/04 JJUG CCC 2023 Spring 46

Slide 47

Slide 47 text

AWS Lambda Web Adapter Non Native Image でも ⾼速起動したい そんな時は、 Provisioned Concurrency と Application Auto Scaling を活⽤ 同時実⾏数が増えると、Provisioned の Lambda関数を ⾃動スケールアウト。実⾏数が減ると⾃動スケールイン 2023/06/04 JJUG CCC 2023 Spring 47

Slide 48

Slide 48 text

なぜイベント駆動アーキテクチャなのか 2023/06/04 JJUG CCC 2023 Spring 48 なぜサーバーレスは イベント駆動アーキテクチャが もてはやされるのか

Slide 49

Slide 49 text

コールドスタート (再掲)Lambdaのライフサイクル サーバーレスJavaでは 「1. Initフェーズ」において MicorVM環境(JVM実⾏環境)の初期 化 およびJarファイルのロードを実⾏ これをコールドスタートと呼ぶ コールスタートで起動済みの Micro VM環境を再利⽤するのが ウォームスタート 2023/06/04 JJUG CCC 2023 Spring 49 1. Init フェーズ Micro VM環境の初期化 2. Invoke フェーズ 関数の起動 3. Shutdown フェーズ Micro VM環境の終了 Extension init 拡張機能の起動 Runtime init ランタイムの起動 Function init 外部コードの起動

Slide 50

Slide 50 text

サーバーレスにおける 同時実⾏数を振り返る コールドスタートで起動した関数の実⾏環境は再利⽤される → ウォームスタート 起動時間が速ければウォームスタートの回数も増加 2023/06/04 JJUG CCC 2023 Spring 50

Slide 51

Slide 51 text

スケーリングの仕組み AWSアカウントの デフォルトの 同時実⾏数は1,000 ソフトリミットのため 上限緩和は可能 同時実⾏数は1分毎に 500 スケーリング → スケールするけど 1分は待たされる 2023/06/04 JJUG CCC 2023 Spring 51

Slide 52

Slide 52 text

イベント駆動アーキテクチャの選択 AWS Lambdaの同時実⾏数の制約と スケーリングの仕組みを背景にすると AWS Lambdaはなるべく速く起動し、 なるべく速く処理を終了させるのがよい そこで ... イベント駆動アーキテクチャ 2023/06/04 JJUG CCC 2023 Spring 52 Mediator Broker

Slide 53

Slide 53 text

Broker パターンの例 2023/06/04 JJUG CCC 2023 Spring 53 メッセージ ブローカーを経由による 複数サービスへの イベント発⾏

Slide 54

Slide 54 text

Mediator パターンの例 2023/06/04 JJUG CCC 2023 Spring 54 ワークフローによる 複数のサービスの実⾏

Slide 55

Slide 55 text

適応度関数の計測 2023/06/04 JJUG CCC 2023 Spring 55 サーバーレスにおける 適応度関数の計測の 重要性について

Slide 56

Slide 56 text

結局、僕たちはAWS Lambdaによる HTTPプロトコルAPIで何を死守したいか 2秒以内でレスポンスが返ってくるようにしたい (遅いHTTPプロトコルAPIはいらない) レイテンシが2秒以内に収まっているか 適応度関数を⽤いて計測することが重要 2023/06/04 JJUG CCC 2023 Spring 56

Slide 57

Slide 57 text

CloudWatch Synthetics E2Eによる定期的な 実⾏による計測 APIからのレスポンスの レイテンシをCloudWatch カスタムメトリクスに メトリクスを監視 2023/06/04 JJUG CCC 2023 Spring 57

Slide 58

Slide 58 text

K6 負荷テストツール 負荷テスト結果を CloudWatch, Grafana, New Relic, Datadogなど 様々な可観測性ツールと 連携可能 CI・CDへの組み込みも 2023/06/04 JJUG CCC 2023 Spring 58

Slide 59

Slide 59 text

便利なツールセット 2023/06/04 JJUG CCC 2023 Spring 59 便利なツールセットのご紹介

Slide 60

Slide 60 text

AWS Lambda Powertools for Java Powertools は、AWS X-Ray によるトレース、 構造化ログ、カスタムメトリクスの⾮同期作成を 容易にするAWS Lambda Functions のユーティリティスイート 安全なパラメータの取得やSQSバッチ処理、 イベントペイロードの検証機能などもサポート Maven, Gradle対応 2023/06/04 JJUG CCC 2023 Spring 60

Slide 61

Slide 61 text

Tracing コールド スタートをアノテーションとしてキャプチャし、 メタデータとしてキャプチャ X-Ray サブセグメントを 作成する開発者の エクスペリエンスを 向上させる ヘルパーメソッド 2023/06/04 JJUG CCC 2023 Spring 61

Slide 62

Slide 62 text

Metrics Amazon CloudWatch Embedded Metric Format (EMF) に 従ってメトリクスを標準出⼒に記録することにより、 カスタムメトリクスを⾮同期的に作成 2023/06/04 JJUG CCC 2023 Spring 62

Slide 63

Slide 63 text

AWS Lambda Power Tuning AWS Step Functionsを利⽤したソリューション Lambda 関数における最適なメモリサイズを可視化 2023/06/04 JJUG CCC 2023 Spring 63

Slide 64

Slide 64 text

まとめ 2023/06/04 JJUG CCC 2023 Spring 64 サーバーレスJavaの今 ~SnapStartとWeb Adapterを寄せて~ まとめ

Slide 65

Slide 65 text

サーバーレスJavaの 実装⽅法を理解し最適な選択を サーバーレスJavaは起動速度が速い(遅かったのは昔話) 技術スタックの選択肢における Pure Java, Framework, Native Imageと SnapStart, Web Adapter を組み合わせて最適な選択肢を Javaという使い慣れた⾔語とエコシステムで サーバーレスJavaを開発できるメリットは⼤きい 2023/06/04 JJUG CCC 2023 Spring 65

Slide 66

Slide 66 text

GitHub – AWS公式 https://github.com/awslabs/aws-lambda-web-adapter https://github.com/awslabs/aws-serverless-java-container GitHub – AWS Lambda Web Adapter 検証リポジトリ https://github.com/x-blood?tab=repositories&q=slsjava&type=&language=&sort= Workshop(SnapStart, Graal VM)AWS公式 https://catalog.workshops.aws/java-on-aws-lambda/en-US Appendix 2023/06/04 JJUG CCC 2023 Spring 66

Slide 67

Slide 67 text

2023/06/04 JJUG CCC 2023 Spring 67 © 佐藤靖幸 2023