Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
SpringBoot-AWSLambda-GraalVM
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Takanori Hara
March 17, 2021
Programming
1.8k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
SpringBoot-AWSLambda-GraalVM
GraalVMを利用してSpring BootアプリをLambda上で動かした時のお話です。
Takanori Hara
March 17, 2021
Other Decks in Programming
See All in Programming
Domain-Driven Transformation
hschwentner
2
2.3k
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
220
Web Framework Benchmark Battle 2026, Any%
a_matsuda
2
2k
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
410
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
270
最近”作らせてる” ローカルAIアプリの話
akit37
0
470
ChromeでローカルLLM
ryu1013
0
140
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
270
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
590
Jetpack Compose Mechanisms
skydoves
3
820
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
1.1k
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
160
Featured
See All Featured
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
750
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Are puppies a ranking factor?
jonoalderson
2
4.1k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
460
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
67k
Docker and Python
trallard
47
4.2k
Scaling GitHub
holman
464
140k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Color Theory Basics | Prateek | Gurzu
gurzu
1
490
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 さいごに 実は、まだ検証が終わった段階で実運⽤はこれからです
情報交換などさせて頂けると嬉しいです 今⽇のお話が、何かの参考になったら幸いです