Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
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.6k
SpringBoot-AWSLambda-GraalVM
GraalVMを利用してSpring BootアプリをLambda上で動かした時のお話です。
Takanori Hara
March 17, 2021
Tweet
Share
Other Decks in Programming
See All in Programming
iOS開発スターターキットの作り方
akidon0000
0
240
0から始めるモジュラーモノリス-クリーンなモノリスを目指して
sushi0120
0
250
あなたとJIT, 今すぐアセンブ ル
sisshiki1969
0
520
AIのメモリー
watany
13
1.4k
実践 Dev Containers × Claude Code
touyu
1
160
MCPで実現できる、Webサービス利用体験について
syumai
7
2.4k
オホーツクでコミュニティを立ち上げた理由―地方出身プログラマの挑戦 / TechRAMEN 2025 Conference
lemonade_37
2
450
可変性を制する設計: 構造と振る舞いから考える概念モデリングとその実装
a_suenami
10
1.7k
変化を楽しむエンジニアリング ~ いままでとこれから ~
murajun1978
0
690
React 使いじゃなくても知っておきたい教養としての React
oukayuka
18
5.5k
GUI操作LLMの最新動向: UI-TARSと関連論文紹介
kfujikawa
0
690
Dart 参戦!!静的型付き言語界の隠れた実力者
kno3a87
0
180
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.6k
Mobile First: as difficult as doing things right
swwweet
223
9.9k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
KATA
mclloyd
32
14k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Making the Leap to Tech Lead
cromwellryan
134
9.5k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
131
19k
Designing for humans not robots
tammielis
253
25k
The Cult of Friendly URLs
andyhume
79
6.5k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Bash Introduction
62gerente
614
210k
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 さいごに 実は、まだ検証が終わった段階で実運⽤はこれからです
情報交換などさせて頂けると嬉しいです 今⽇のお話が、何かの参考になったら幸いです