JJUG CCC 2023 Spring の登壇資料です
より詳細な内容は Zenn をご覧ください https://zenn.dev/red_frasco/articles/637280c126d959
Spring Boot 2 から 3 へバージョンアップしてみた2023/06/04 JJUG CCC 2023 Spring
View Slide
⾃⼰紹介猪熊 朔也 ( いのくま さくや )- 株式会社 Red Frasco- インフラエンジニア- Twitter(@sinocloudon)u経歴⾦融系SIer -> リクルート -> ⾦融系スタートアップ -> Red Frascouその他コメント- ⾹川県出⾝- うどんが好きです- うどん脳 をプロフィールアイコンにすることが多いです- ラーメン⼆郎も好きです2
3はじめに
⽬次バージョンアップ対象についてバージョンアップで実施したこと発⽣した課題とその対処まとめ
5バージョンアップ対象について
不動産会社向けの業務⽀援システムにおける事例です6不動産会社担当者⼊⼒ 変換 連携業務⽀援システム他システム物件データ画像データ⼿⼊⼒連携先システム⾃動連携 システムAシステムBシステムCシステムD⾃動連携⾃動連携⾃動連携⾃動連携
システム構成• Web アプリとバッチが存在します• Web アプリ︓Spring Boot• バッチ︓Spring Boot, Spring Batch7AuroraALB EC2AmazonEventBridgeAWS Step Functions workflowAWS Batch AWS Batch AWS Batch
Webアプリ構成8SpringSecurityController ServiceSpringSessionDAO(MyBatis)ThymeleafSpringSecurityRestControllerSPA(Vue.js)DB外部システムMPA
バッチ構成9Step(Tasklet)ServiceDAO(MyBatis) DB外部システムBatchApplicationBatch ConfigurationJob
バージョン情報対象 From ToSpring Boot 2.7.1 3.0.1Spring Framework 5.3.23 6.0.3Spring Security 5.7.2 6.0.1Spring Batch 4.3.6 5.0.010
11バージョンアップで実施したこと
なぜバージョンアップするのか︖• 5年ぶりのメジャーバージョンアップ• バージョンアップがどれくらい⼤変なのか把握しておきたかった• そもそもサポート期間が最⻑2年しかない• こまめなバージョンアップを前提とした運⽤を整備する必要性• 追従しないことによるデメリット• バグ修正、脆弱性対応が実施されないリスク12
13https://spring.pleiades.io/projects/spring-boot#support
バージョンアップの流れ• Migration Guide に⽬を通す• https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide• 実際にバージョンアップしてエラーを1つずつ解消• なお、Java ⾃体のバージョンアップはしていません• すでに Java 17(Amazon Corretto) を使⽤していたため14発⽣した課題とその対処について共有します
15発⽣した課題とその対処
Java EE → Jakarta EE 対応 (Spring Framework)• javax -> jakarta• パッケージ名が変わったので、ひたすら置換16https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#jakarta-ee仕様変更のポイント課題と対処
Trailing Slash 対応 (Spring Framework)• Trailing Slash のオプションが⾮推奨• deprecated かつ デフォルト false• 末尾スラッシュのありなしが区別されることによる不具合が発⽣したので、アプリケーションを修正• Trailing Slash がオプションによって付与されることを前提としていた• 明⽰的にTrailing Slash ありに統⼀することで解消17https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#spring-mvc-and-webflux-url-matching-changes仕様変更のポイント課題と対処
明⽰的なアクセス許可 (Spring Security)• Authorization ルールに合致しないリクエストはデフォルト拒否• ALB からのヘルスチェックが失敗するようになった• Spring Boot Actuator を使ってヘルスチェックをしていたが、明⽰的なルールが存在しなかったため、ALB のヘルスチェックが失敗• actuator 配下のURL に対して明⽰的な許可を追加した18https://docs.spring.io/spring-security/reference/5.8/migration/servlet/authorization.html#_ensure_that_all_requests_have_defined_authorization_rules仕様変更のポイント課題・対処
Dispatch Type の指定 (Spring Security)• すべての dispatch type (request, async, error, forward, include) がFilter の適⽤対象になる• 無限ループが発⽣• AuthenticationFailureHandler の実装で forward を利⽤• 認証失敗時、forward 先でも Filter が適⽤されてしまう• spring.security.filter.dispatcher-types プロパティを追加し、Filter の適⽤対象を限定19https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#dispatch-types仕様変更のポイント課題・対処
SecurityContextRepository のデフォルト実装変更 (Spring Security)• SecurityContextRepository のデフォルト実装がDelegatingSecurityContextRepository に変更• 認証に成功しても未認証扱いのままになった• 仕様変更の影響でセッションが永続化できていなかった• DelegatingSecurityContextRepository を使⽤するようコードを変更20https://docs.spring.io/spring-security/reference/servlet/authentication/persistence.html#securitycontextrepository仕様変更のポイント課題・対処
@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
22https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#enablebatchprocessing-is-now-discouraged
JobBuilderFactory, StepBuilderFactory が⾮推奨 (Spring Batch)• JobBuilderFactory -> JobBuilder• StepBuilderFactory -> StepBuilder• JobBuilder, StepBuilder を利⽤するように修正23https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-Guide#jobbuilderfactory-and-stepbuilderfactory-bean-exposureconfiguration仕様変更のポイント課題・対処
その他依存ライブラリへの影響• Datadog APM ⽤の Agent が当初 Spring Boot 3 未サポートだった• アプリケーションが全く動かなくなる• 切り分けた結果、Datadog APM の Agent が悪さをしていた• サポートされるまで Datadog APM の利⽤を停⽌• 現在はサポートされています• https://github.com/DataDog/dd-trace-java/pull/460524仕様変更のポイント課題・対処
その他依存ライブラリへの影響• Datadog APM ⽤の Agent が当初 Spring Boot 3 未サポートだった• アプリケーションが全く動かなくなる• 切り分けた結果、Datadog APM の Agent が悪さをしていた• サポートされるまで Datadog APM の利⽤を停⽌• 現在はサポートされています• https://github.com/DataDog/dd-trace-java/pull/460525仕様変更のポイント課題・対処外部ライブラリのサポート状況確認も忘れずに︕
26番外編
Gradle の Version catalog 化• Version catalog 対応を実施• プロジェクトごとにバージョン定義・管理し続けるのが⾯倒だった• Version catalog で⼀元管理できるように変更• Renovate も導⼊し、今後のバージョンアップ運⽤を効率化27
Spring Boot Migrator (SBM)• Spring Boot のアップデートツールがあるらしい…• ただし、以下の条件を満たす必要あり• Spring Boot 2.7 -> 3.0 の移⾏パスのみ• Java 17, Maven のみ(Gradle はサポートされていない)28Gradle がサポートされたら試してみます
29まとめ
Spring Boot バージョンアップのまとめ• 普通にアプリが動かなくなったのでちょっと焦った• バージョンアップ作業にかかった時間は3⽇程度• アップデートのPRを出してマージするまで• 本番稼働している場合は、テスト・リリース⼯数がプラス• Migration Guide を⼀通り読んでから作業する• 外部ライブラリの確認も忘れずに• ⾃動テスト(ユニットテスト、E2Eテスト)を前提にすることでバージョンアップ運⽤に備える30
Special Thanks!!31@shinopsより詳細な情報は記事にまとめてみたよ
32後⽇公開します
END OFPRESENTATIONご清聴ありがとうございました