Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
サーバーレスJavaの今 ~SnapStartとWeb Adapterを寄せて~
Search
x-blood
June 04, 2023
Programming
4
3k
サーバーレスJavaの今 ~SnapStartとWeb Adapterを寄せて~
x-blood
June 04, 2023
Tweet
Share
More Decks by x-blood
See All by x-blood
re:Inventで現地参加したコンテナ関連セッションを振り返る
xblood
0
330
Amazon EKS Pod Identityで何が変わるのか
xblood
0
440
Lizさんに届け!AWS Jr. ChampionとTop Engineerが書籍コンテナセキュリティを読んで感じたこと
xblood
0
1.4k
サーバーレスJavaパフォーマンス選手権 at AWS Dev Day 2023 Tokyo
xblood
2
1.3k
Finch OSSコードリーディング
xblood
0
1.3k
ECS Service Connectでマイクロサービスを繋いでみた
xblood
0
2.3k
AWS Glue Git統合のPoCでの活用
xblood
0
160
Spring BootとKubernetesで実現する今どきのDevOps入門
xblood
1
860
Amazon EKSとGitOpsでデプロイを自動化させるDevOps実践セミナー
xblood
0
1.1k
Other Decks in Programming
See All in Programming
初めてDefinitelyTypedにPRを出した話
syumai
0
470
気をつけたい!Desktop対応で陥りやすい罠とその対策
goto_tsl
0
160
[Do iOS '24] Ship your app on a Friday...and enjoy your weekend!
polpielladev
0
200
Micro Frontends Unmasked Opportunities, Challenges, Alternatives
manfredsteyer
PRO
0
180
subpath importsで始めるモック生活
10tera
0
380
「天気予報があなたに届けられるまで」 - NIFTY Tech Talk #22
niftycorp
PRO
0
130
romajip: 日本の住所CSVデータを活用した英語住所変換ライブラリを作った話
sangunkang
0
2.2k
事業成長を爆速で進めてきたプロダクトエンジニアたちの成功談・失敗談
nealle
3
880
Java 23の概要とJava Web Frameworkの現状 / Java 23 and Java web framework
kishida
2
360
Djangoの開発環境で工夫したこと - pre-commit / DevContainer
hiroki_yod
1
530
かんたんデザイン編集やってみた~「完全に理解した」までの道のり~
morit4ryo
1
100
ローコードSaaSのUXを向上させるためのTypeScript
taro28
1
720
Featured
See All Featured
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Thoughts on Productivity
jonyablonski
67
4.3k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Visualization
eitanlees
145
15k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
870
Teambox: Starting and Learning
jrom
133
8.8k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.3k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Building a Scalable Design System with Sketch
lauravandoore
459
33k
A Philosophy of Restraint
colly
203
16k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
Transcript
サーバーレスJavaの今 ~SnapStartとWeb Adapterを寄せて~ 佐藤 靖幸 JJUG CCC 2023 Spring 2023/06/04
JJUG CCC 2023 Spring 1
⾃⼰紹介 2023/06/04 JJUG CCC 2023 Spring 2 佐藤 靖幸 @yasai_ls
得意領域 バックエンド開発 クラウドインフラ(AWS) 好きなプログラミング⾔語 Java GO PARTNER NETWORK 2022 APN AWS Top Engineers © 佐藤靖幸 2023
本セッションについて 本セッションではサーバーレスJavaを取り巻く最新トレンドを ご紹介し、それぞれの優位性やトレードオフ、開発における TIPSなどを取り上げます。 本セッションで利⽤するアプリケーションフレームワークは Spring Boot と Quarkus を利⽤しています。
2023/06/04 JJUG CCC 2023 Spring 3
アジェンダ 2023/06/04 JJUG CCC 2023 Spring 4 そもそもサーバーレスって何だっけ︖ サーバーレスJava最前線︕ Lambda
SnapStart AWS Lambda Web Adapter サーバーレスJavaにおける技術スタック選定 なぜイベント駆動アーキテクチャなのか サーバーレスJavaにおける開発TIPS 適応度関数の計測 便利なツールセット まとめ
そもそもサーバーレスって何だっけ︖ 2023/06/04 JJUG CCC 2023 Spring 5 いまいちど、サーバーレスに ついて簡単におさらい
サーバーレスとは インフラのプロビジョニング・管理が不要 ⾃動スケーリング 利⽤した分だけの⽀払い ⾼い可⽤性と安全性 2023/06/04 JJUG CCC 2023 Spring
6 AWS Lambda AWS Fargate
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
Lambda SnapStart 2023/06/04 JJUG CCC 2023 Spring 8 Lambda SnapStartは
サーバーレスJavaに どのような変化を もたらすのか
コールドスタート 従来の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 外部コードの起動
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 フェーズが 実⾏される
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 フェーズ スナップショットの復元
Lambda SnapStartの有効化 AWS SAMで簡単に有効化 2023/06/04 JJUG CCC 2023 Spring 12
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)
Lambda SnapStartのトレードオフ (2023年5⽉30⽇時点) 未対応 Provisioned Concurrency(SnapStartとの併⽤不可) Arm64アーキテクチャ Amazon EFS 512MBを超えるエフェメラルストレージ
トレードオフ Lambdaが14⽇間呼び出されないと関数がInactiveに移⾏ 2023/06/04 JJUG CCC 2023 Spring 14
Lambda SnapStartの考慮点 ⼀意性の確保とネットワーク確⽴ ⼀意性の確保 UUID⽣成など⼀意となる情報をスナップショットに 含めると⼀意性を確保できない → 初期化フェーズでは⼀意情報を⽣成しない ネットワーク確⽴ スナップショット復元後のネットワーク確⽴の担保が必要
外部API データベース接続 etc 2023/06/04 JJUG CCC 2023 Spring 15
Lambda SnapStartの考慮点 ランタイムフックの活⽤ LambdaがSnapStartのスナップショットを作成する前、 またはスナップショットから復元した後でフックを 挟むことができる beforeCheckpoint() ... スナップショットを作成する前 afterRestore()
... スナップショットから復元した後 2023/06/04 JJUG CCC 2023 Spring 16
ランタイムフックの例 2023/06/04 JJUG CCC 2023 Spring 17
スナップショット作成時に 多くのクラスを初期化する 起動時のレイテンシーとなる原因となるクラスは、 前述のbeforeCheckpoint()実⾏時に事前ロードしておくことで、 スナップショットに含めておく または、ダミー呼び出しを使⽤してクラスを事前ロードする 2023/06/04 JJUG CCC 2023
Spring 18
ダミー呼び出しロードの例 2023/06/04 JJUG CCC 2023 Spring 19
AWS Lambda Web Adapter 2023/06/04 JJUG CCC 2023 Spring 20
Spring Bootを Lambdaで起動︕︖ AWS Lambda Web Adapterの 魅⼒とは
Javaと⾔えば .... 様々なフレームワークと歩んだ歴史がある ... 2023/06/04 JJUG CCC 2023 Spring 21
AWS SAMや Serverless Frameworkがあるのでは︖ AWS SAM や Serverless Framework は
Deployment Framework 簡単にサーバーレスアプリケーションを デプロイ出来るOSSという位置付け (現在は様々な拡張機能が追加) 2023/06/04 JJUG CCC 2023 Spring 22
サーバーレスJavaで フレームワークを使うメリット 使い慣れたフレームワークの利⽤による開発者体験の向上 → 特にローカル開発における利便性が向上 移植性の向上 サーバーレス ←→ コンテナ オーケストレーション
2023/06/04 JJUG CCC 2023 Spring 23
AWS Lambda Web Adapter アプリケーションフレームワークを使ったWebアプリケーションを (ほぼそのまま)AWS Lambdaで動かす 2023/06/04 JJUG CCC
2023 Spring 24
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
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
Spring Boot with Web Adapter デプロイのステップ デプロイはAWS SAM CLIを利⽤することで 僅か3ステップでデプロイ可能
2023/06/04 JJUG CCC 2023 Spring 27
Spring Boot の Dockerfile例 sam build コマンド実⾏時にDockerfileを指定して Dockerイメージをビルド DockerfileにはAWS Lambda
Web Adapterの拡張機能を コピーする⼀⽂を加える(これだけ) 2023/06/04 JJUG CCC 2023 Spring 28
AWS SAM CLIを利⽤して ビルドとデプロイを簡単にする sam build コマンドで Dockerfileからコンテナイメージを作成 sam deploy
コマンドで⾃動的にECRリポジトリへのプッシュと、 AWS Lambdaのデプロイが完了 AWS SAM CLIによって ビルドとデプロイが 簡潔に実現可能︕ 2023/06/04 JJUG CCC 2023 Spring 29
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
Quarkus with Web Adapter デプロイのステップ Spring Bootと同じく デプロイはAWS SAM CLIを利⽤することで
僅か3ステップでデプロイ可能 2023/06/04 JJUG CCC 2023 Spring 31
Quarkus の Dockerfile例 Quarkusの例においても同様 DockerfileにAWS Lambda Web Adapterの拡張機能を コピーする⼀⽂を加える(これだけ) 2023/06/04
JJUG CCC 2023 Spring 32
コールドスタート時間の⽐較 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秒... ?
More More More .... !!! Graal VM Native Image まだまだ(起動速度が)遅いな
... !? よろしい、ならばGraal VM Native Imageだっ︕︕︕ 2023/06/04 JJUG CCC 2023 Spring 34
コールドスタート時間の⽐較 (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です)
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
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}
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
(補⾜) Web Adapter以外の選択肢 フレームワーク共通 Serverless Java Container プロキシクラス利⽤による 各フレームワークとの統合 フレームワーク統合
Spring Cloud Function AWS LambdaをサポートしたSpring Framework 2023/06/04 JJUG CCC 2023 Spring 39
サーバーレスJavaにおける 技術スタック選定 2023/06/04 JJUG CCC 2023 Spring 40 サーバーレスJavaは、 どの技術スタックを
選べばいいのか
サーバーレスJavaは 技術スタックの選択肢が⾼度化 ライブラリ・実装・ビルド・デプロイオプション・デプロイ それぞれで選択肢がある 2023/06/04 JJUG CCC 2023 Spring 41
技術スタック選択肢における排他① Native Image ビルド⽅法にNative Imageを選択した場合は、SnapStartは 未対応。ライフサイクルフックが利⽤できない(2023年5⽉30⽇時点) 2023/06/04 JJUG CCC 2023
Spring 42
技術スタック選択肢における排他② SnapStart デプロイオプションにSnapStartを選択した場合は、 Container Imageは未対応 2023/06/04 JJUG CCC 2023 Spring
43
フレームワーク利⽤における 統合の選択肢 イベントハンドラー クラスを利⽤(基本) → フレームワークを使っているがイベントハンドラーと 密結合している。コンテナ移⾏のコストが⾼い フレームワークによるエンドポイントを利⽤ → コンテナ移⾏が極めて容易
2023/06/04 JJUG CCC 2023 Spring 44
将来的にコンテナに移⾏したい HTTPプロトコルAPIの場合 Framework(Web Adapter or Native Image or BOTH)を選択 2023/06/04
JJUG CCC 2023 Spring 45
将来的にコンテナに移⾏しない シンプルなAPIの場合 Pure Java (SnapStart or Native Image)を選択 2023/06/04 JJUG
CCC 2023 Spring 46
AWS Lambda Web Adapter Non Native Image でも ⾼速起動したい そんな時は、
Provisioned Concurrency と Application Auto Scaling を活⽤ 同時実⾏数が増えると、Provisioned の Lambda関数を ⾃動スケールアウト。実⾏数が減ると⾃動スケールイン 2023/06/04 JJUG CCC 2023 Spring 47
なぜイベント駆動アーキテクチャなのか 2023/06/04 JJUG CCC 2023 Spring 48 なぜサーバーレスは イベント駆動アーキテクチャが もてはやされるのか
コールドスタート (再掲)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 外部コードの起動
サーバーレスにおける 同時実⾏数を振り返る コールドスタートで起動した関数の実⾏環境は再利⽤される → ウォームスタート 起動時間が速ければウォームスタートの回数も増加 2023/06/04 JJUG CCC 2023
Spring 50
スケーリングの仕組み AWSアカウントの デフォルトの 同時実⾏数は1,000 ソフトリミットのため 上限緩和は可能 同時実⾏数は1分毎に 500 スケーリング →
スケールするけど 1分は待たされる 2023/06/04 JJUG CCC 2023 Spring 51
イベント駆動アーキテクチャの選択 AWS Lambdaの同時実⾏数の制約と スケーリングの仕組みを背景にすると AWS Lambdaはなるべく速く起動し、 なるべく速く処理を終了させるのがよい そこで ... イベント駆動アーキテクチャ
2023/06/04 JJUG CCC 2023 Spring 52 Mediator Broker
Broker パターンの例 2023/06/04 JJUG CCC 2023 Spring 53 メッセージ ブローカーを経由による
複数サービスへの イベント発⾏
Mediator パターンの例 2023/06/04 JJUG CCC 2023 Spring 54 ワークフローによる 複数のサービスの実⾏
適応度関数の計測 2023/06/04 JJUG CCC 2023 Spring 55 サーバーレスにおける 適応度関数の計測の 重要性について
結局、僕たちはAWS Lambdaによる HTTPプロトコルAPIで何を死守したいか 2秒以内でレスポンスが返ってくるようにしたい (遅いHTTPプロトコルAPIはいらない) レイテンシが2秒以内に収まっているか 適応度関数を⽤いて計測することが重要 2023/06/04 JJUG CCC
2023 Spring 56
CloudWatch Synthetics E2Eによる定期的な 実⾏による計測 APIからのレスポンスの レイテンシをCloudWatch カスタムメトリクスに メトリクスを監視 2023/06/04 JJUG
CCC 2023 Spring 57
K6 負荷テストツール 負荷テスト結果を CloudWatch, Grafana, New Relic, Datadogなど 様々な可観測性ツールと 連携可能
CI・CDへの組み込みも 2023/06/04 JJUG CCC 2023 Spring 58
便利なツールセット 2023/06/04 JJUG CCC 2023 Spring 59 便利なツールセットのご紹介
AWS Lambda Powertools for Java Powertools は、AWS X-Ray によるトレース、 構造化ログ、カスタムメトリクスの⾮同期作成を
容易にするAWS Lambda Functions のユーティリティスイート 安全なパラメータの取得やSQSバッチ処理、 イベントペイロードの検証機能などもサポート Maven, Gradle対応 2023/06/04 JJUG CCC 2023 Spring 60
Tracing コールド スタートをアノテーションとしてキャプチャし、 メタデータとしてキャプチャ X-Ray サブセグメントを 作成する開発者の エクスペリエンスを 向上させる ヘルパーメソッド
2023/06/04 JJUG CCC 2023 Spring 61
Metrics Amazon CloudWatch Embedded Metric Format (EMF) に 従ってメトリクスを標準出⼒に記録することにより、 カスタムメトリクスを⾮同期的に作成
2023/06/04 JJUG CCC 2023 Spring 62
AWS Lambda Power Tuning AWS Step Functionsを利⽤したソリューション Lambda 関数における最適なメモリサイズを可視化 2023/06/04
JJUG CCC 2023 Spring 63
まとめ 2023/06/04 JJUG CCC 2023 Spring 64 サーバーレスJavaの今 ~SnapStartとWeb Adapterを寄せて~
まとめ
サーバーレスJavaの 実装⽅法を理解し最適な選択を サーバーレスJavaは起動速度が速い(遅かったのは昔話) 技術スタックの選択肢における Pure Java, Framework, Native Imageと SnapStart,
Web Adapter を組み合わせて最適な選択肢を Javaという使い慣れた⾔語とエコシステムで サーバーレスJavaを開発できるメリットは⼤きい 2023/06/04 JJUG CCC 2023 Spring 65
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
2023/06/04 JJUG CCC 2023 Spring 67 © 佐藤靖幸 2023