$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
SpringBoot-AWSLambda-GraalVM
Search
Takanori Hara
March 17, 2021
Programming
0
1.7k
SpringBoot-AWSLambda-GraalVM
GraalVMを利用してSpring BootアプリをLambda上で動かした時のお話です。
Takanori Hara
March 17, 2021
Tweet
Share
Other Decks in Programming
See All in Programming
これだけで丸わかり!LangChain v1.0 アップデートまとめ
os1ma
6
1.9k
Tinkerbellから学ぶ、Podで DHCPをリッスンする手法
tomokon
0
130
ローカルLLMを⽤いてコード補完を⾏う VSCode拡張機能を作ってみた
nearme_tech
PRO
0
100
モデル駆動設計をやってみようワークショップ開催報告(Modeling Forum2025) / model driven design workshop report
haru860
0
270
AIコーディングエージェント(skywork)
kondai24
0
180
Developing static sites with Ruby
okuramasafumi
0
310
AtCoder Conference 2025「LLM時代のAHC」
imjk
2
520
WebRTC と Rust と8K 60fps
tnoho
2
2k
SwiftUIで本格音ゲー実装してみた
hypebeans
0
420
Go コードベースの構成と AI コンテキスト定義
andpad
0
130
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
2.7k
UIデザインに役立つ 2025年の最新CSS / The Latest CSS for UI Design 2025
clockmaker
18
7.5k
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.6k
Code Review Best Practice
trishagee
74
19k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.2k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.3k
Making the Leap to Tech Lead
cromwellryan
135
9.7k
GitHub's CSS Performance
jonrohan
1032
470k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Why Our Code Smells
bkeepers
PRO
340
57k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
The Language of Interfaces
destraynor
162
25k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Transcript
2021/03/17 auコマース&ライフ株式会社 原 隆徳 SpringBoot な AWS Lambda を GraalVM
で 軽量爆速化 させた話 KGDC Tech Conference #0
© 2019 au Commerce & Life, Inc. 2 ⾃⼰紹介 auコマース&ライフ株式会社
マーケットプラットフォーム本部 原 隆徳(Takanori Hara) Twitter : @TknrHara 業務 「au PAY マーケット」 の サーバサイドエンジニア 担当 会員管理、メール配信 技術 Java、AWS 経歴 通信系SIer(11年) → 現職(3年)
© 2019 au Commerce & Life, Inc. 3 会社紹介 ⽇⽤品から、グルメ、ファッション、インテリア、家電などの“モノ”から、レストラ
ン、ビューティー、宿泊などの“コト”まで、たくさんの商品やお店、体験と出会える 総合ショッピングサイト。 「お得に贅沢体験」をテーマに、厳選したサービス・商品をプレミアム・タイムセ ールを中⼼に展開するショッピングサイト。 auコマース&ライフは、KDDIのコマース事業を担う会社です
© 2019 au Commerce & Life, Inc. 4 アジェンダ Function
として実⾏可能にする 概要説明 まとめ Function を軽量爆速化する
© 2019 au Commerce & Life, Inc. 5 今⽇お話しする内容 Spring
Boot を AWS Lambda で動かすお話 • Spring は、いまや Java のデファクト とも⾔えるフレームワーク • AWS Lambda で使うには 起動が遅い という課題があった • この課題が、最近になって解消 されつつあり、今後が期待される • 実際に使ってみて、その効果などの共有
Spring Boot (WebApp) © 2019 au Commerce & Life, Inc.
6 背景 EC2 API Gateway Lambda なぜやるのか? • 利⽤⽤途が増え、今後 突発的なアクセス増加 が⾒込まれる • API単位でスケーリング させたい • なるべくソースコードを共⽤ したい API 何をするのか? Spring Boot の WebApp にある API 機能を、AWS Lambda に移設
© 2019 au Commerce & Life, Inc. 7 AWS Lambda
で動かすために必要な 2 つのこと 1. Function を実装する Spring Cloud Function の導⼊ • ロジックを Function 型で実⾏ • 「起動が遅い」という点が課題 2. Function を軽量爆速化する Spring GraalVM Native の導⼊※次のver0.9からSpring Nativeに改名 • GraalVM による Java の Native 変換をサポート • Native 変換により、省メモリ かつ ⾼速起動 を実現
© 2019 au Commerce & Life, Inc. 8 前提条件 環境情報
w GraalVM CE 20.3.0 w Java 8 w Spring Boot 2.4.0 w Spring Cloud 2020.0.0 w Spring Cloud Function 3.1.0 w Spring GraalVM Native 0.8.3
© 2019 au Commerce & Life, Inc. 9 アジェンダ Function
を実装する 概要説明 まとめ Function を軽量爆速化する
© 2019 au Commerce & Life, Inc. 10 Spring Cloud
Function (導⼊) 実装時のポイント Spring Cloud Function の導⼊ • クラウドベンダーに依存せず Function を実装できる • ロジック部分はそのまま 利⽤可能 • エントリポイントとして Handler クラス を⽤意(実装は不要) • API Gateway との統合 ⽤にラッパークラスを利⽤(実装は不要) ※ できてしまえば簡単なのですが、最初に動かすときはいくつか躓きも。 詳しいお話は別の機会にできればと思います。 https://spring.io/projects/spring-cloud-function
© 2019 au Commerce & Life, Inc. 11 Spring Cloud
Function (初回実⾏結果) 実際に Lambda を実⾏すると、コールドスタートが遅い コールドスタート 約 28秒 ※ほぼ起動の時間、起動後の処理部分は 1 秒未満
© 2019 au Commerce & Life, Inc. 12 Spring Cloud
Function (チューニング) メモリ設定 512 MB 1,024 MB 2,048 MB 3,008 MB コールドスタート時間 28 秒 16 秒 12 秒 8 秒 AWS Lambda のメモリ設定 Lambda Layers の導⼊ 依存関係のライブラリを別zipにまとめる → 1秒短縮 などなど 例えば、読み込むライブラリやクラスを極限まで減らす、など
© 2019 au Commerce & Life, Inc. 13 Spring Cloud
Function (チューニング効果) チューニング前 約 28秒 チューニング後 約 10秒 10 秒を切るぐらいまで改善
© 2019 au Commerce & Life, Inc. 14 アジェンダ Function
を実装する 概要説明 まとめ Function を軽量爆速化する
© 2019 au Commerce & Life, Inc. 15 起動が遅い原因と解決策 解決策
できるだけ 事前に処理を済ませて、起動時に必要な処理を最⼩限にする 起動が遅い原因 Java のアプリケーションは、単純に 起動時の処理が多い JVM起動 アプリ起動 クラス 読み込み オブジェクト 初期化 ・・・ Java 起動時の処理
© 2019 au Commerce & Life, Inc. 16 そこで、GraalVM Oracleが開発した新しいJVM(2018年〜)
主要機能 Graal Java製の⾼性能なJITコンパイラ Truffle / Polyglot Java以外の⾔語が実⾏可能/⾔語間呼び出しが可能 Native Image Java のコードをネイティブコンパイル するツール https://www.graalvm.org/
© 2019 au Commerce & Life, Inc. 17 Native Image
の特⻑ スタンドアロン実⾏ が可能 バイナリ変換済みのため、即実⾏が可能 AOTコンパイル により、起動時間を短縮 ビルド時にほぼコンパイルされ、起動時の処理が軽量化 ※ 通常の Java は JIT コンパイル SubstrateVM の内包により、JVM起動も不要 GC など実⾏に最⼩限の JVM 機能を提供
© 2019 au Commerce & Life, Inc. 18 【余談】Native Image
に対応したフレームワーク Spring 以外のフレームワーク AOTコンパイルに最適化を図った軽量フレームワーク • Micronaut(Oracle, 2018〜) • Quarkus(Red Hat, 2019〜) Spring と Native Image の相性 Spring はコアの部分がJITコンパイル前提 (リフレクションや動的プロキシを多⽤) 早くから GraalVM 対応されたものの、実⽤的ではなかった
© 2019 au Commerce & Life, Inc. 19 【余談】Spring Framework
の対応状況 ver5.1(2018/10) GraalVM対応は発表されたが、問題が多数発⽣ ※問題があったと公式ドキュメントに記載されている ver5.2(2019/10) 問題解決に注⼒ ver5.3(2020/11) 実験的に利⽤可能に!(公式サポートはまだ) ※Spring-GraalVM-Native(experimental project)
© 2019 au Commerce & Life, Inc. 20 Spring GraalVM
Native (導⼊) Spring GraalVM Native の導⼊ AOT コンパイル⽤の設定ファイルを含めて、通常の FatJar を⽣成 native-image コマンドで FatJar を Native ファイルに変換 https://docs.spring.io/spring-native/docs/current/reference/htmlsingle/ AOT コンパイル⽤の設定ファイルを⽣成 本来は実⾏しないとわからない クラスの読み込み情報を全て定義 する https://www.graalvm.org/reference-manual/native-image/BuildConfiguration/ ファイル⽣成⼿順 ※ GraalVM 指定の⽣成⽅法 w FatJar をデバッガ起動(GraalVMのオプションを付ける) w クラスローダをフックして、リフレクションなどの情報をJSONに出⼒ ※ Spring GraalVM Native ではアノテーションでも指定できそう (Spring Hints) $ java -agentlib:native-image-agent=config-output-dir=出⼒先 -jar FatJarファイル
© 2019 au Commerce & Life, Inc. 21 Spring GraalVM
Native (AWS Lambda 対応) Native Image の⽣成と実⾏は同じOS バイナリファイルのため、⽣成時のOSに依存した形式 Dockerを利⽤(Amazon Linux をベースに GraalVM などインストール) ランタイムは「カスタムランタイム」 実⾏モジュールは Native ファイル (Java ではない) 以下を zip にして、AWS Lambdaにデプロイ w 実⾏するNative ファイル w Native ファイルをキックするシェル
© 2019 au Commerce & Life, Inc. 22 Spring GraalVM
Native(実⾏結果⽐較) コールドスタートが 1 秒程度まで短縮 GraalVM対応前 約 10秒 GraalVM対応後 約 1秒
© 2019 au Commerce & Life, Inc. 23 Spring GraalVM
Native(実⾏結果詳細) 何がどれだけ速くなったのか コールドスタート時の時間配分 InitDuration Duration Lambdaインスタンスの初期化 アプリの初期化 (Spring Boot 起動など) ロジック実⾏ コールドスタート AWS Lambda メモリ設定 InitDuration Duration Java 884 ms 9,476 ms 2,048 MB Native 1,011 ms 131 ms 256 MB 実⾏結果詳細
© 2019 au Commerce & Life, Inc. 24 Spring GraalVM
Native (メリット) 起動時間が速く、スケーラブルに最適 • コールドスタートの場合も、⼗分速い応答速度 • スケールアウト時に 滞留しにくい • ウォームアップが不要 (インタンス待機が不要) 使⽤メモリが少なく、コスト抑制 • AWS Lambda の費⽤は、メモリ量と実⾏時間によって算出 • AWS Lambda の 費⽤⾯でのコスト削減 ができる
© 2019 au Commerce & Life, Inc. 25 Spring GraalVM
Native (デメリット) ビルドに時間がかかるため、開発効率が悪い • 10〜15分/ビルド1回 • 4vCPU/8GBメモリ のリソース(Fargateの場合) • 1時間に4回しかビルドできず、開発効率に懸念 設定ファイルが複雑なため、メンテナンス性が悪い • 1つのAPI実装に、4,000⾏以上のJSON • ⾃動⽣成後、⼿直しが必要(「ビルドする→エラー修正」の反復作業) • 継続開発していく上での、メンテナンス性に懸念
© 2019 au Commerce & Life, Inc. 26 Spring GraalVM
Native(現時点での課題) Spring-GraalVM-Native は、まだ experimental • 情報が少ない • 情報の 鮮度劣化 が早い experimental の影響か、細かいところで実装が不便 • Native Image コマンド叩いて、ビルドエラーを随時修正していく作業 ⼀部の例 w 未対応のライブラリ がある → 例: SpringCache が使えず、SpringDataRedis で代⽤ w Gradle のサブプロジェクトで DIが効かない → @Autowired が使えず、@Import で代⽤ w プロパティの 新仕様が効かない → プロパティにuse-legacy-processing=trueを設定
© 2019 au Commerce & Life, Inc. 27 アジェンダ Function
を実装する 概要説明 まとめ Function を軽量爆速化する
© 2019 au Commerce & Life, Inc. 28 まとめ AWS
Lambda で Spring Boot を使うための対応は 2 点 1. Spring Cloud Function で Function 化 2. Spring GraalVM Native で Native Image 化 Native Image 化しないと、コールドスタートの遅さが課題 • メモリを⼤量に積んでも 数秒〜10秒弱 Native Image 化により、コールドスタートは軽量爆速化 • 1 秒程度(メモリ 256MB)まで圧縮 • ただし、現時点では実験的プロジェクトで発展途上
© 2019 au Commerce & Life, Inc. 29 所感 いきなり⼤規模に導⼊するより、まずはポイントを絞る
• ミッションクリティカルではないが突発で⼤量アクセスがある、など • 開発⾯では、デバッグがツラい、保守性にも懸念あり • 開発プロジェクトやチームの状況で判断 開発できてしまえば、運⽤における価値は絶⼤ • ぜひ実⽤化していきたい • コミュニティ・開発状況は活発で、近い将来への期待感は⾼い • Java / Spring Boot で実現できることの価値は⾼い
© 2019 au Commerce & Life, Inc. 30 さいごに 実は、まだ検証が終わった段階で実運⽤はこれからです
情報交換などさせて頂けると嬉しいです 今⽇のお話が、何かの参考になったら幸いです