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

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

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

x-blood

June 04, 2023
Tweet

More Decks by x-blood

Other Decks in Programming

Transcript

  1. ⾃⼰紹介 2023/06/04 JJUG CCC 2023 Spring 2 佐藤 靖幸 @yasai_ls

    得意領域 バックエンド開発 クラウドインフラ(AWS) 好きなプログラミング⾔語 Java GO PARTNER NETWORK 2022 APN AWS Top Engineers © 佐藤靖幸 2023
  2. アジェンダ 2023/06/04 JJUG CCC 2023 Spring 4 そもそもサーバーレスって何だっけ︖ サーバーレスJava最前線︕ Lambda

    SnapStart AWS Lambda Web Adapter サーバーレスJavaにおける技術スタック選定 なぜイベント駆動アーキテクチャなのか サーバーレスJavaにおける開発TIPS 適応度関数の計測 便利なツールセット まとめ
  3. 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
  4. Lambda SnapStart 2023/06/04 JJUG CCC 2023 Spring 8 Lambda SnapStartは

    サーバーレスJavaに どのような変化を もたらすのか
  5. コールドスタート 従来の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 外部コードの起動
  6. 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 フェーズが 実⾏される
  7. 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 フェーズ スナップショットの復元
  8. 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)
  9. AWS Lambda Web Adapter 2023/06/04 JJUG CCC 2023 Spring 20

    Spring Bootを Lambdaで起動︕︖ AWS Lambda Web Adapterの 魅⼒とは
  10. AWS SAMや Serverless Frameworkがあるのでは︖ AWS SAM や Serverless Framework は

    Deployment Framework 簡単にサーバーレスアプリケーションを デプロイ出来るOSSという位置付け (現在は様々な拡張機能が追加) 2023/06/04 JJUG CCC 2023 Spring 22
  11. 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
  12. 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
  13. Spring Boot の Dockerfile例 sam build コマンド実⾏時にDockerfileを指定して Dockerイメージをビルド DockerfileにはAWS Lambda

    Web Adapterの拡張機能を コピーする⼀⽂を加える(これだけ) 2023/06/04 JJUG CCC 2023 Spring 28
  14. AWS SAM CLIを利⽤して ビルドとデプロイを簡単にする sam build コマンドで Dockerfileからコンテナイメージを作成 sam deploy

    コマンドで⾃動的にECRリポジトリへのプッシュと、 AWS Lambdaのデプロイが完了 AWS SAM CLIによって ビルドとデプロイが 簡潔に実現可能︕ 2023/06/04 JJUG CCC 2023 Spring 29
  15. コールドスタート時間の⽐較 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秒... ?
  16. More More More .... !!! Graal VM Native Image まだまだ(起動速度が)遅いな

    ... !? よろしい、ならばGraal VM Native Imageだっ︕︕︕ 2023/06/04 JJUG CCC 2023 Spring 34
  17. コールドスタート時間の⽐較 (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です)
  18. 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
  19. AWS Lambda Web Adapter Non Native Image でも ⾼速起動したい そんな時は、

    Provisioned Concurrency と Application Auto Scaling を活⽤ 同時実⾏数が増えると、Provisioned の Lambda関数を ⾃動スケールアウト。実⾏数が減ると⾃動スケールイン 2023/06/04 JJUG CCC 2023 Spring 47
  20. コールドスタート (再掲)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 外部コードの起動
  21. AWS Lambda Powertools for Java Powertools は、AWS X-Ray によるトレース、 構造化ログ、カスタムメトリクスの⾮同期作成を

    容易にするAWS Lambda Functions のユーティリティスイート 安全なパラメータの取得やSQSバッチ処理、 イベントペイロードの検証機能などもサポート Maven, Gradle対応 2023/06/04 JJUG CCC 2023 Spring 60
  22. サーバーレスJavaの 実装⽅法を理解し最適な選択を サーバーレスJavaは起動速度が速い(遅かったのは昔話) 技術スタックの選択肢における Pure Java, Framework, Native Imageと SnapStart,

    Web Adapter を組み合わせて最適な選択肢を Javaという使い慣れた⾔語とエコシステムで サーバーレスJavaを開発できるメリットは⼤きい 2023/06/04 JJUG CCC 2023 Spring 65
  23. 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