Keycloakは年4回の頻度でバージョンが上がり続けるプロダクトです。認証基盤という止められない土台を、breaking changeとDBスキーマ移行をさばきながらどう追随させるか。リリースサイクルの読み方から、自動/手動のDB移行、ダウンタイム最小化、ロールバックまで、実構築の現場で使う勘所を整理します。

01まず全体像 — Keycloakは「上がり続ける」前提で設計する

Keycloakは認証基盤という「止められない土台」でありながら、プロダクト自体は活発にリリースが続きます。コミュニティ版(keycloak.org)はマイナーリリースが年4回のペースで、メジャーは2〜3年に一度という頻度で更新されます。塩漬けにできる性質のミドルウェアではなく、「上がり続ける前提」で運用設計する必要がある、というのがまず押さえたい点です。

本記事は現行のQuarkusベースのディストリビューション(26系以降)を基準にします。旧WildFlyベース(標準サポート終了済み)からの移行は前提が大きく異なるため、Quarkusディストリビューションへの移行を別途参照してください。バージョン依存の細かい挙動は動くバージョンで変わり得るので、必ず公式のUpgrading Guideで最終確認する、という姿勢を通します。

現場のコツ:「まだ動いているから」で数バージョン飛ばしを常態化すると、後でまとめて上げる際にbreaking changeとDB移行が積み重なって一気に重くなります。認証基盤こそ小刻みに追随させる方が、結果的に安全でコストも低い、という逆説を最初に共有しておくのが有効です。

02リリースサイクルとLTSの読み方

運用計画の出発点はサポート期間の把握です。コミュニティ版とRed Hat build of Keycloak(RHBK)でライフサイクルが異なるため、どちらを使っているかで戦略が変わります。

つまりRHBKでは「1マイナーを約1年安定運用し、年1〜2回上げる」計画が組めます。エンタープライズで変更管理を厳格に回すなら、サポート期間が明確なRHBKを選ぶ判断は理にかなっています。逆にコミュニティ版なら、四半期ごとの追随を運用カレンダーに織り込むのが現実的です。

現場のコツ:「今のバージョンのパッチ提供がいつ切れるか」を管理台帳に持たせ、その期限から逆算してアップグレードのスプリントを予約しておくと、EOL間際の駆け込み対応を避けられます。

03breaking changeの追随 — Release-specific changesを起点にする

アップグレードの実務は、公式の「Release-specific changes」を一件ずつ潰す作業に尽きます。Keycloakのポリシーでは、マイナー/パッチでの破壊的変更は原則バグ修正に限られ、しかもopt-in(明示設定で有効化)とされています。廃止(deprecation)はマイナーでも起こり得ますが、機能の実削除は次のメジャーまで持ち越されます。この「マイナーは基本互換、削除はメジャー」という約束が、計画を立てる土台になります。

実際に効いてくる変更の型を挙げます。

現場のコツ:Release-specific changesは「自分の環境に関係あるか」でトリアージします。使っていないSPIやフェデレーション種別の変更は読み飛ばし、実際に有効化している機能(realm設定・認証フロー・カスタムSPI・テーマ)に触れる項目だけを検証対象に落とすと、レビュー工数が現実的になります。

04DBスキーマ移行 — Liquibaseの自動/手動を使い分ける

Keycloakのスキーマ移行はLiquibaseで管理され、リリースごとの変更セットが同梱されます。デフォルトでは、新バージョンを初回起動した際にスキーマが自動適用されます。小〜中規模なら自動で十分ですが、エンタープライズでは以下の2点で「手動戦略」を選ぶ場面が出てきます。

手動戦略は、connections-jpaプロバイダの migration-strategymanual に設定します。この状態で起動すると、必要な変更が bin/keycloak-database-update.sql に書き出され、サーバーは移行を実行せずに停止します。DBAはこのSQLをレビューして適用し、その後あらためて新バージョンを起動する、という2段構えになります。変更セットの実体は model/jpa/src/main/resources/META-INF 配下にバージョンごとのXMLとして置かれており、何が変わるかはソースでも追えます。

DBスキーマ移行 — 自動 / 手動の分岐 新バージョン起動 migration-strategy の判定 (既定=auto / manual) auto manual 起動時に自動適用 30万件超はindex省略 SQLを書き出して停止 keycloak-database-update.sql サービス稼働 DBAがレビュー→適用 →再起動で稼働
図:移行戦略の分岐。承認プロセスや巨大テーブルがある本番では手動戦略で「何を流すか」を可視化する。
現場のコツ:Liquibaseの移行は原則フォワードオンリーです。途中で失敗しても自動では戻せません。移行前のDBフルバックアップ(あるいはスナップショット)は交渉の余地なく必須、と割り切ってください。ロールバックの拠り所はこのバックアップだけです。

05ダウンタイム最小化 — update-compatibilityで判定する

近年のKeycloakは、同一 major.minor ストリーム内のパッチ更新について、ゼロダウンタイムのローリング更新をサポート対象・既定有効としました。パッチ間ではDBスキーマとキャッシュ(Infinispan)の後方互換が保たれるため、新旧のノードが一時的に混在しても動作します。ただしこれはパッチレベルの話で、マイナー・メジャーをまたぐ場合は前提が変わります。

ローリング更新が可能かは、感覚で判断せず update-compatibility コマンドで機械的に判定できます。

判定は終了コードで返ります。0=ゼロダウンタイムのローリング更新が可能、3=recreate戦略が必要(全ノード停止を伴う)、4=ローリング更新機能が無効。CI/CDに組み込めば、「今回はローリングで行けるか、計画停止が要るか」をリリースごとに自動で切り分けられます。Operator運用なら更新戦略を Auto にしておくと、この判定に基づく更新を任せられます。

ローリング可否の機械判定 現行ver で metadata file.json 出力 新ver で check file.json と比較 終了コードで分岐 0 : ローリング可 無停止で更新 3 : recreate 必要 計画停止で更新 4 : 機能無効 設定を確認
図:update-compatibilityの終了コードで、リリースごとに無停止更新か計画停止かを自動で切り分ける。

Kubernetes上の可用性設計そのものはKubernetes上のKeycloakAWS上のHA構成で扱っています。マイナー/メジャー跨ぎでスキーマが前進する更新では、原則ローリングが効かない前提で、青緑デプロイや計画停止を組み合わせるのが安全です。

06ロールバック設計 — 「戻せない前提」で守りを固める

もっとも誤解されやすいのがロールバックです。前述のとおりDBスキーマ移行はフォワードオンリーで、Liquibaseが勝手に前の状態へ戻すことはできません。したがってロールバック戦略は「アプリのバイナリを戻す」話ではなく、「移行前のDB状態を復元できるか」の話になります。実務では次の順序で守りを固めます。

現場のコツ:新バージョンでスキーマが前進した後に旧バイナリを起動すると、想定外の不整合を招きます。切り戻しは「旧バイナリ+移行前DBのセット」で戻すのが原則です。DBだけ、アプリだけ、の部分ロールバックは避けてください。

07テーマ/SPI/クライアントの互換 — サーバーの外側を忘れない

アップグレードで見落とされがちなのが、サーバー本体ではなく「その周辺」です。公式の推奨手順も、サーバー→アダプター→クライアントライブラリ(Admin/Authorization/Policy enforcer)の順で上げる、と明記しています。周辺の互換で特に注意する点を挙げます。

これらは「サーバーは上がったのに管理画面のログイン画面が崩れる」「起動時にプロバイダのロードで落ちる」といった形で表面化します。サーバー単体のスモークテストだけでなく、テーマ描画・カスタムフロー・外部連携までを含む回帰テストの束を、アップグレード用の検証セットとして常備しておくのが堅実です。

まとめ — 検証の型を資産化する

Keycloakのバージョンアップは、単発の作業ではなく「毎年繰り返す運用プロセス」です。要点を再掲します。

この「検証の型」を一度作ってしまえば、以降のアップグレードは同じレールに乗せて回せます。EMWはKeycloakでエンタープライズの認証基盤を実構築してきた経験から、この型づくりと移行検証を支援しています。実案件の概要は導入事例もご覧ください。

参考(一次情報)

認証基盤のバージョンアップ計画やアップグレード検証でお困りの際は、お問い合わせください。実構築の知見をもとに移行手順の設計から検証まで伴走します。

相談する
← ブログ一覧へ戻る