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
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
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
0
1.8k
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
4
3.6k
Java 27新機能 / Java 27 new features
kishida
2
170
アクセシビリティから考える情報設計
high_g_engineer
0
390
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
660
FreeBSDでZabbixを動かす
kenkino
0
320
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
200
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.9k
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
160
新卒PdEのリアル
ryu1013
1
510
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
0
190
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
9
4.9k
Featured
See All Featured
New Earth Scene 8
popppiees
4
2.6k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
500
Balancing Empowerment & Direction
lara
6
1.3k
Leo the Paperboy
mayatellez
10
2.3k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Amusing Abliteration
ianozsvald
1
310
Mind Mapping
helmedeiros
1
370
Paper Plane (Part 1)
katiecoart
PRO
2
11k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
290
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
370
Visualization
eitanlees
152
17k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
500
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 さいごに 実は、まだ検証が終わった段階で実運⽤はこれからです
情報交換などさせて頂けると嬉しいです 今⽇のお話が、何かの参考になったら幸いです