Slide 1

Slide 1 text

Spring Boot 2 から 3 へ バージョンアップしてみた 2023/06/04 JJUG CCC 2023 Spring

Slide 2

Slide 2 text

⾃⼰紹介 猪熊 朔也 ( いのくま さくや ) - 株式会社 Red Frasco - インフラエンジニア - Twitter(@sinocloudon) u経歴 ⾦融系SIer -> リクルート -> ⾦融系スタートアップ -> Red Frasco uその他コメント - ⾹川県出⾝ - うどんが好きです - うどん脳 をプロフィールアイコンにすることが多いです - ラーメン⼆郎も好きです 2

Slide 3

Slide 3 text

3 はじめに

Slide 4

Slide 4 text

⽬次 バージョンアップ対象について バージョンアップで実施したこと 発⽣した課題とその対処 まとめ

Slide 5

Slide 5 text

5 バージョンアップ対象について

Slide 6

Slide 6 text

不動産会社向けの業務⽀援システムにおける事例です 6 不動産会社 担当者 ⼊⼒ 変換 連携 業務⽀援 システム 他システム 物件データ 画像データ ⼿⼊⼒ 連携先システム ⾃動連携 システムA システムB システムC システムD ⾃動連携 ⾃動連携 ⾃動連携 ⾃動連携

Slide 7

Slide 7 text

システム構成 • Web アプリとバッチが存在します • Web アプリ︓Spring Boot • バッチ︓Spring Boot, Spring Batch 7 Aurora ALB EC2 Amazon EventBridge AWS Step Functions workflow AWS Batch AWS Batch AWS Batch

Slide 8

Slide 8 text

Webアプリ構成 8 Spring Security Controller Service Spring Session DAO (MyBatis) Thymeleaf Spring Security Rest Controller SPA (Vue.js) DB 外部 システム MPA

Slide 9

Slide 9 text

バッチ構成 9 Step (Tasklet) Service DAO (MyBatis) DB 外部 システム Batch Application Batch Configuration Job

Slide 10

Slide 10 text

バージョン情報 対象 From To Spring Boot 2.7.1 3.0.1 Spring Framework 5.3.23 6.0.3 Spring Security 5.7.2 6.0.1 Spring Batch 4.3.6 5.0.0 10

Slide 11

Slide 11 text

11 バージョンアップで実施したこと

Slide 12

Slide 12 text

なぜバージョンアップするのか︖ • 5年ぶりのメジャーバージョンアップ • バージョンアップがどれくらい⼤変なのか把握しておきたかった • そもそもサポート期間が最⻑2年しかない • こまめなバージョンアップを前提とした運⽤を整備する必要性 • 追従しないことによるデメリット • バグ修正、脆弱性対応が実施されないリスク 12

Slide 13

Slide 13 text

13 https://spring.pleiades.io/projects/spring-boot#support

Slide 14

Slide 14 text

バージョンアップの流れ • Migration Guide に⽬を通す • https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0- Migration-Guide • 実際にバージョンアップしてエラーを1つずつ解消 • なお、Java ⾃体のバージョンアップはしていません • すでに Java 17(Amazon Corretto) を使⽤していたため 14 発⽣した課題とその対処について共有します

Slide 15

Slide 15 text

15 発⽣した課題とその対処

Slide 16

Slide 16 text

Java EE → Jakarta EE 対応 (Spring Framework) • javax -> jakarta • パッケージ名が変わったので、ひたすら置換 16 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#jakarta-ee 仕様変更のポイント 課題と対処

Slide 17

Slide 17 text

Trailing Slash 対応 (Spring Framework) • Trailing Slash のオプションが⾮推奨 • deprecated かつ デフォルト false • 末尾スラッシュのありなしが区別されることによる不具合が発 ⽣したので、アプリケーションを修正 • Trailing Slash がオプションによって付与されることを前提としていた • 明⽰的にTrailing Slash ありに統⼀することで解消 17 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#spring-mvc- and-webflux-url-matching-changes 仕様変更のポイント 課題と対処

Slide 18

Slide 18 text

明⽰的なアクセス許可 (Spring Security) • Authorization ルールに合致しないリクエストはデフォルト拒否 • ALB からのヘルスチェックが失敗するようになった • Spring Boot Actuator を使ってヘルスチェックをしていたが、明⽰的な ルールが存在しなかったため、ALB のヘルスチェックが失敗 • actuator 配下のURL に対して明⽰的な許可を追加した 18 https://docs.spring.io/spring- security/reference/5.8/migration/servlet/authorization.html#_ensure_that_all_requests_have_defined_au thorization_rules 仕様変更のポイント 課題・対処

Slide 19

Slide 19 text

Dispatch Type の指定 (Spring Security) • すべての dispatch type (request, async, error, forward, include) が Filter の適⽤対象になる • 無限ループが発⽣ • AuthenticationFailureHandler の実装で forward を利⽤ • 認証失敗時、forward 先でも Filter が適⽤されてしまう • spring.security.filter.dispatcher-types プロパティを追加し、Filter の 適⽤対象を限定 19 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#dispatch-types 仕様変更のポイント 課題・対処

Slide 20

Slide 20 text

SecurityContextRepository のデフォルト実装変更 (Spring Security) • SecurityContextRepository のデフォルト実装が DelegatingSecurityContextRepository に変更 • 認証に成功しても未認証扱いのままになった • 仕様変更の影響でセッションが永続化できていなかった • DelegatingSecurityContextRepository を使⽤するようコードを変更 20 https://docs.spring.io/spring- security/reference/servlet/authentication/persistence.html#securitycontextrepository 仕様変更のポイント 課題・対処

Slide 21

Slide 21 text

@EnableBatchProcessing が⾮推奨 (Spring Batch) • @EnableBatchProcessing のアノテーションを削除しないと、 Spring Boot の AutoConfiguration が有効にならない。 • バッチジョブが動かなくなった • バッチジョブ定義を AutoConfiguration で設定していたため • @EnableBatchProcessing のアノテーションを削除 • ⾒出し “@EnableBatchProcessing is now discouraged” しか読んでなかった らハマった(⾮推奨なだけじゃないの︖なんで動かないの︖) 21 仕様変更のポイント 課題・対処 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration- Guide#enablebatchprocessing-is-now-discouraged

Slide 22

Slide 22 text

22 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#enablebatchprocessing-is-now-discouraged

Slide 23

Slide 23 text

JobBuilderFactory, StepBuilderFactory が⾮推奨 (Spring Batch) • JobBuilderFactory -> JobBuilder • StepBuilderFactory -> StepBuilder • JobBuilder, StepBuilder を利⽤するように修正 23 https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration- Guide#jobbuilderfactory-and-stepbuilderfactory-bean-exposureconfiguration 仕様変更のポイント 課題・対処

Slide 24

Slide 24 text

その他依存ライブラリへの影響 • Datadog APM ⽤の Agent が当初 Spring Boot 3 未サポートだった • アプリケーションが全く動かなくなる • 切り分けた結果、Datadog APM の Agent が悪さをしていた • サポートされるまで Datadog APM の利⽤を停⽌ • 現在はサポートされています • https://github.com/DataDog/dd-trace-java/pull/4605 24 仕様変更のポイント 課題・対処

Slide 25

Slide 25 text

その他依存ライブラリへの影響 • Datadog APM ⽤の Agent が当初 Spring Boot 3 未サポートだった • アプリケーションが全く動かなくなる • 切り分けた結果、Datadog APM の Agent が悪さをしていた • サポートされるまで Datadog APM の利⽤を停⽌ • 現在はサポートされています • https://github.com/DataDog/dd-trace-java/pull/4605 25 仕様変更のポイント 課題・対処 外部ライブラリの サポート状況確認も忘れずに︕

Slide 26

Slide 26 text

26 番外編

Slide 27

Slide 27 text

Gradle の Version catalog 化 • Version catalog 対応を実施 • プロジェクトごとにバージョン定義・管理し続けるのが⾯倒だった • Version catalog で⼀元管理できるように変更 • Renovate も導⼊し、今後のバージョンアップ運⽤を効率化 27

Slide 28

Slide 28 text

Spring Boot Migrator (SBM) • Spring Boot のアップデートツールがあるらしい… • ただし、以下の条件を満たす必要あり • Spring Boot 2.7 -> 3.0 の移⾏パスのみ • Java 17, Maven のみ(Gradle はサポートされていない) 28 Gradle がサポートされたら試してみます

Slide 29

Slide 29 text

29 まとめ

Slide 30

Slide 30 text

Spring Boot バージョンアップのまとめ • 普通にアプリが動かなくなったのでちょっと焦った • バージョンアップ作業にかかった時間は3⽇程度 • アップデートのPRを出してマージするまで • 本番稼働している場合は、テスト・リリース⼯数がプラス • Migration Guide を⼀通り読んでから作業する • 外部ライブラリの確認も忘れずに • ⾃動テスト(ユニットテスト、E2Eテスト)を前提にすることで バージョンアップ運⽤に備える 30

Slide 31

Slide 31 text

Special Thanks!! 31 @shinops より詳細な情報は 記事にまとめてみたよ

Slide 32

Slide 32 text

32 後⽇公開します

Slide 33

Slide 33 text

END OF PRESENTATION ご清聴ありがとうございました