Upgrade to Pro — share decks privately, control downloads, hide ads and more …

サーバーレスJavaの今 ~SnapStartとWeb Adapterを寄せて~

x-blood
June 04, 2023

サーバーレスJavaの今 ~SnapStartとWeb Adapterを寄せて~

x-blood

June 04, 2023
Tweet

More Decks by x-blood

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. 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

    View Slide

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

    View Slide

  9. コールドスタート
    従来の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
    外部コードの起動

    View Slide

  10. 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
    フェーズが
    実⾏される

    View Slide

  11. 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 フェーズ
    スナップショットの復元

    View Slide

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

    View Slide

  13. 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)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  25. 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

    View Slide

  26. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  30. 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

    View Slide

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

    View Slide

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

    View Slide

  33. コールドスタート時間の⽐較
    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秒... ?

    View Slide

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

    View Slide

  35. コールドスタート時間の⽐較
    (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です)

    View Slide

  36. 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

    View Slide

  37. 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}

    View Slide

  38. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  49. コールドスタート
    (再掲)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
    外部コードの起動

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  66. 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

    View Slide

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

    View Slide