Keycloak Ver.17でデフォルトとなったQuarkusディストリビューションについて：設定項目比較編

## はじめに
前回の記事ではQuarkus版Keycloakと従来のWildFly版Keycloakの変更点概要を紹介しました。  
Keycloak Ver.17はKeycloak.Xと呼ばれるアーキテクチャの刷新が行われて従来の
Keycloakから大きく変更されています。[過去の記事](https://qiita.com/yo-tabata/items/6d29795fc3afa72d1b08)ではプレビュー版のKeycloak.Xに対して機能面（外部DB接続、ロードバランサ接続、クラスタ構成）の確認を行っていましたが、今回は正式採用されたQuarkus版についてWildFly版と比較しつつ具体的な設定項目の可否やQuarkus版における改善内容をとりあげたいと思います。

## 設定可否の比較
WildFly版とQuarkus版の設定項目について、その可否を表にまとめました。参考として最右列にはQuarkus版におけるCLIオプションを記述しています。[前回の記事](https://qiita.com/m-takai/items/7d8b97767cd9544f4f41)で紹介したとおり、各CLIオプションは`keycloak.conf`に記述することで設定することも可能です。
|記号|意味||
|-|-|-|
|〇|できる|
|△|オプション設定のほかに作業が必要|
|×|できない

|設定大項目 | 設定小項目 | WildFly | Quarkus | Quarkus版のCLIオプション|
|-|-|-|-|-|
|起動モード |スタンドアローン |〇 |〇| 
||ドメインクラスター|△|×| 設定できない
||クロスデータセンターレプリケーション|△|△| --cache<br/>--cache-config-file[^1]<br/>--cache-stack
|DB|DBの選択|△|〇| --db |
||DBベンダーの追加|△|×| 設定できない
|ロードバランサ接続||〇|〇| --proxy
|ホスト名設定|フロントエンドURL設定|〇|〇| --hostname
|| バックエンドURL設定|〇|〇| --hostname-strict-backchannel
|| 管理URL設定|〇|〇| --hostname-admin
|HTTPS/SSL設定|サーバ証明書と秘密鍵のストア|〇|〇| --https-certificate-file<br/> --http-certificate-key-file
||クライアント証明書のストア|〇|〇|--https-trust-store-file|
|外部接続|HTTP接続プーリング|〇|〇| --spi-connections-http-client-default-
||プロキシマッピング|〇|〇| --spi-connections-http-client-default-
||HTTPS接続のトラストストア|〇|〇| --spi-truststore-file-

## Quarkus版で改善されたこと
### Keycloak.confにより設定の記述がシンプルになった
前回の記事で紹介したように、Quarkus版ではWildFlyの設定が混じった複雑なXMLファイルでなく、Keycloakの設定値のみが記載された設定ファイルである`keycloak.conf`によって設定できます。
Keycloak Ver.17のWildFly版（Keycloak-17.0.0-legacy）の設定ファイル（`standalone.xml`）はデフォルトで570行ありましたが、`keycloak.conf`はコメント行を除くと10行になりました。

また、設定の記述もシンプルになりました。たとえば、ホスト名の設定を記述する場合、従来のWildFly版では以下のようなXMLの記述が必要となります。
```
<spi name="hostname">
    <default-provider>default</default-provider>
    <provider name="default" enabled="true">
        <properties>
            <property name="frontendUrl" value="your-host-name"/>
        </properties>
    </provider>
</spi>
```

一方で、Quarkus版では以下のように1行で設定を記述できます。
```
hostname=your-host-name
```
このように、XML構造で記述しなくてよいため見通しの良い設定ファイルとなりました。

### 外部DBのドライバインストールが不要になった
従来のKeycloakで外部DBを扱う場合は`module/`ディレクトリ配下にJDBCドライバを配置して設定ファイルを書くことで設定していました。Quarkus版ではデフォルトでMariaDB、Microsoft SQL Server、MySQL、Oracle DB、PostgreSQLに対応しており、`--db`オプションによって選択できます。このため、自身でJDBCドライバを用意する必要がなくなりました。

## Quarkus版で対応しなくなったこと

### ドメインクラスターモード
WildFlyの機能としてドメインコントローラと呼ばれるノードがKeycloakの設定を管理して他のクラスターノードへ設定を伝搬することで冗長構成する動作モードがありましたが、Quarkusへ変更されるとともに廃止されました。QuarkusがKubernetesネイティブということもあり、一般的なコンテナアプリケーションと同様に静的な設定項目は設定ファイル込みでコンテナイメージを作成して、動的な設定項目はデプロイ時に環境変数を渡して設定することがベストプラクティスとなっていくと考えられます。

### 独自のJDBCドライバ設定
前述したようにWildFly版のKeycloakでは`module/`ディレクトリ配下にJDBCドライバを配置して設定ファイルを書くことで追加のドライバを入れることができました。一方で、一般にQuarkusアプリケーションでは動的にJDBCドライバを適用することはできず、mavenプロジェクトの`pom.xml`に依存関係を記載したうえで`application.properties`にJDBCの設定を記載してアプリケーションをビルドする必要があります。また、KeycloakではDBベンダの設定が列挙体によって定義されており、JDBCドライバのURLなどは設定できるもののドライバ名などを設定として読み込ませることができません。そのため、Quarkus版のKeycloakでは従来のようにユーザが任意のJDBCドライバを設定することはできなくなり、デフォルトで組み込まれているJDBCドライバを利用することになります。  

## おわりに
Quarkus版Keycloakでは従来の設定はそのままに、より簡素な設定ファイルによって記述することができるようになりました。また、外部DBも自身でJDBCドライバを用意することなく設定記述のみで複数のDBから選択して接続できます。

一方で、ドメインクラスターモードに対応しなくなったため、各サーバで個別に設定ファイルを持つ必要がありデプロイ作業や設定ファイルの管理などの運用面は変わります。こうした点はQuarkusがKubernetesネイティブを謳うことからも一般的なコンテナアプリケーションの運用に近づけていくことが必要となる可能性があります。

[^1]: クラスターの設定にはXMLで記述するinfinispanの設定ファイルが必要です。