Keycloakを学ぶ⑤外部DB接続編

記事タイトルとURLをコピーする

こんにちは、アプリケーションサービス本部の上田です。

以前某ソウルシリーズをまとめて購入し進めている話をしたのですが2の方をぼちぼちプレイしています。

シリーズとしては賛否両論あるようですが個人的にはゲームもプレイしやすくなっていて悪くないと思っています。道中に比べてボスが割かし簡単なのだけちょっと物足りなさがあるかなと感じるくらいですね。

さて、本題ですが今回はKeycloakと外部DBの接続を行ってみます。

Keycloakはレルムやユーザー情報を保存する際DBを使用しますが、デフォルトではH2というRDBMSが使用されています。

これはKeycloakをインストール時一緒に導入されますがあくまで開発用のもので、公式のドキュメント的には外部DBを使用することが推奨されているため、AWS上に外部DBを用意してKeycloakのデータをそちらで管理するようにしてみます。

今回の作業は以下の流れとなります。

  1. AWS上でデータベース (RDS) を作成

  2. DB用のセキュリティグループを設定

  3. Keycloak側の設定

  4. (オプション)過去データの流し込み

では早速DBの作成から始めましょう。

AWS上でデータベース (RDS) を作成

まずは「Aurora and RDS」の作成画面に移動して「データベースを作成する」を押下します。

今回のDBはエンジンタイプ:PostgreSQLで作成します。

基本的には画面の設定内容に従ってVPCやパブリックアクセスの設定を行いますが、DBインスタンスの識別子をわかりやすいものに変えておくとよいです。

また、マスターユーザー名とパスワード名は後ほど必要になるのでメモしておくと無難です(一応作成後に確認できますが)。

次のステップで変更を行うため、セキュリティグループは「新規作成」とします。

最後に「データベースの作成」を押下すると、作成中の画面となります。

DBを作成中の間に次の手順を済ませておきましょう。

DB用のセキュリティグループを設定

今作成中のDBの詳細画面を開いて「接続とセキュリティ」タブにある、「セキュリティグループのルール」からセキュリティグループのリンクをクリックします。

DBに設定されているセキュリティグループの詳細画面からインバウンドのルールを編集します。

インバウンドルールに以下の内容を追加します。

タイプ: PostgreSQL (ポート 5432)
ソース:keycloakサーバーのセキュリティグループIDまたはIP

これでセキュリティグループの設定はOKです。

Keycloak側の設定

最後にKeycloakの設定を書き換えますが、その際エンドポイントが必要になるので先ほど作成したDBのエンドポイント情報を取得しておきます。

取得したエンドポイントの情報を使って conf/keycloak.conf を編集します。

# エンジンタイプ
db=postgres

# RDSのエンドポイント情報
db-url=jdbc:postgresql://<RDSエンドポイント>:5432/postgres

# 接続情報
db-username={設定したユーザー名}
db-password={設定したパスワード}

# (オプション) 推奨設定:DB接続の最適化
db-pool-initial-size=5
db-pool-max-size=20

設定自体はこれでOKです。

設定を反映させるためにビルドをしてから起動します。

起動して早速アクセス!するとローカルアクセスが必要な旨が知らされます。

これは新しく接続したDBに管理者の情報がないからですね。

逆に言うと、新しいDBに接続できている証拠でもあります。

通常の場合であれば画面の指示通り一時的な管理者を作成してセットアップを続けるのですが、今回は元々のDBからの情報をインポートしてみましょう。

(オプション)過去データの流し込み

内部DBからのエクスポート

まずは内部DBから今ある情報をエクスポートします。

そのためにいったん元のDBの設定に戻してコマンドを実行する必要があります。

Keycloakを起動中の場合には一度停止して、先ほど設定したconf/keycloak.confのDB部分をコメントアウトし、ビルドした後に以下のコマンドを実行します。

# ビルドして 内部DB(H2) の設定を適用
sudo ./kc.sh build

# --db=dev-file を指定することで、一時的にH2データベースを参照してエクスポート
sudo ./kc.sh export --db=dev-file --file /tmp/keycloak-export.json

KC-SERVICES0035: Export finished successfullyとログが出ていればエクスポート完了です。

外部DBへのインポート

次に先ほどエクスポートしたファイルをもとに外部DBに取り込みを行います。

今度はconf/keycloak.confのDB部分のコメントアウトを解除してPostgreSQLの設定にしてビルド実行後、以下のコマンドを実施します。

# ビルドして PostgreSQL の設定を適用
sudo ./kc.sh build

# 次にファイルをインポート
sudo ./kc.sh import --file /tmp/keycloak-export.json

ログを確認してRealm master importedRealm test_realm imported などの文言ができていればOKです。

さて、それでは再度起動させてアクセスしてみましょう!

アクセスするといつもの画面が出てきました。

ログインしてレルムを確認すると内部DBで作っていたものが存在しています。

一応コマンドでも新DBの方にデータが入っていることを確認してみます。

ブラウザで確認したものと同じ内容が出てきていますね。

移行が終わって問題なければインポートするために使用したファイルを削除しておきます(ユーザー情報が入っているため)。

sudo rm /tmp/keycloak-export.json

これで移行完了です!

まとめ

というわけで今回はKeycloakと外部DBをつなぐ設定を行いました。

冒頭にも書きましたが、Keycloak では本番運用の際は PostgreSQL や MySQL などの外部データベースへ移行することを推奨しているため、ほぼ必須のステップとなっています。

接続の設定自体簡単ですし、定期的にバックアップを取ったりする意味でもDBは外部にしておくことは有効な手段だといえます。

この記事がどなたかの学習の助けになれば幸いです。

最後までお読みいただきありがとうございました。

上田幹也(執筆記事の一覧)

アプリケーションサービス部

趣味は飲酒と長風呂、音楽とM:tGです。どちらかというと犬派。