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.2k
SpringBoot-AWSLambda-GraalVM
GraalVMを利用してSpring BootアプリをLambda上で動かした時のお話です。
Takanori Hara
March 17, 2021
Tweet
Share
Other Decks in Programming
See All in Programming
Folding Cheat Sheet #1
philipschwarz
PRO
0
210
Ruby GitHub Packages
bkuhlmann
0
620
本格ローグライク制作にEbitengineを選んでみた
nagainaganawa
0
290
二郎系ラーメンのコールで学ぶ AST 解析
memory1994
PRO
7
1.6k
脱・初心者!脱・マネコン!AWS CDKを使ってみませんか!?
har1101
0
300
⼤規模⾔語モデルの拡張(RAG)が 終わったかも知れない件について
nearme_tech
22
15k
ゆるい個人開発のススメ
kuroppe1819
10
930
Ruby製社内ツールのGo移行
bgpat
2
330
puregoの活用例
aethiopicuschan
0
220
TYPO3 v13 – The road to LTS: What's new and new APIs
luisasofie_xoxo
0
180
コードレビューで学ぶ!Kotlinオブジェクト指向デザインパターン
akkie76
2
180
Prepare for Jakarta EE 11 - Performance and Developer Productivity
ivargrimstad
0
420
Featured
See All Featured
Become a Pro
speakerdeck
PRO
10
4.5k
Done Done
chrislema
178
15k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
13
1.5k
A designer walks into a library…
pauljervisheath
199
23k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
15
1.4k
No one is an island. Learnings from fostering a developers community.
thoeni
14
2.1k
Building Effective Engineering Teams - LeadDev
addyosmani
27
1.8k
Intergalactic Javascript Robots from Outer Space
tanoku
266
26k
Infographics Made Easy
chrislema
237
18k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
226
16k
Producing Creativity
orderedlist
PRO
336
39k
We Have a Design System, Now What?
morganepeng
42
6.7k
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 さいごに 実は、まだ検証が終わった段階で実運⽤はこれからです
情報交換などさせて頂けると嬉しいです 今⽇のお話が、何かの参考になったら幸いです