IdP 検証のために keycloak を Cloud Run にデプロイする
Table of Contents
Identity Provider(IdP) と連携した機能の検証を行いたいが、自社の IdP は社内の情シス管理だし、なかなか触りづらい。
そこで、検証用に IdP を個別に立てて、利用したいなというモチベーション。
構成概要
目的が検証用途であるため、以下のような思想で構築していく。
- IdP として、無償で利用可能な Keycloak を選定
- 実行環境の準備は OpenJDK のインストール作業などを除くため、コンテナ化されたものを使用
- Google Cloud 関連で利用したかったこともあり、コンテナ実行環境は Cloud Run
- 常時起動している状態ではなく、揮発性データに対する考慮が必要
- Keycloak は 開発モード で実行する
- データ保存先のデータベースは個別に用意せず、 Cloud Run から GCS をマウントして、そこにデータを保存
- Keycloak 上の名称 dev-file を利用する
Keycloak 構築実施
Google Cloud 向けの事前準備
Artifact Registry のリモートリポジトリ構築
Cloud Run がコンテナイメージを取得する場合、 Artifact Registry もしくは、 Docker Hub からとなる。
一方で、 Keycloak のコンテナイメージは Quay から取得したいので、 Artifact Registry のリモートリポジトリを設定する。
参考: リモート リポジトリを作成する | Artifact Registry documentation | Google Cloud
gcloud artifacts repositories create quay \
--repository-format=docker \
--location=asia-northeast1 \
--mode=remote-repository \
--disable-vulnerability-scanning \
--remote-docker-repo=https://quay.io
永続データ保存用の GCS バケット作成
Cloud Run 上のコンテナの揮発性データが消えないように、コンテナにマウントさせる GCS バケットを作成する。
gcloud storage buckets create gs://${BUCKET_NAME}/ --uniform-bucket-level-access --location=asia-northeast1
Keycloak のデプロイ
Cloud Run へ Keycloak をデプロイ。
検証用途なので、とりあえず動かすために対応していますが、ID/PWのみで公開する設定となっているため、環境に応じたセキュリティ対策は必要になるかもしれません。
gcloud run deploy keycloak --image asia-northeast1-docker.pkg.dev/${PROJECT_ID}/quay/keycloak/keycloak:latest \
--set-env-vars KC_BOOTSTRAP_ADMIN_USERNAME=admin,KC_BOOTSTRAP_ADMIN_PASSWORD=${PASSWORD},KC_HOSTNAME=https://keycloak-${PROJECT_NUMBER}.asia-northeast1.run.app \
--add-volume name=keycloak-data,type=cloud-storage,bucket=${BUCKET_NAME} \
--add-volume-mount volume=keycloak-data,mount-path=/opt/keycloak/data/ \
--max-instances 1 --min-instances 0 --memory 2000Mi --cpu 2 --args start-dev --allow-unauthenticated --region asia-northeast1
Cloud Run デプロイ時のオプションについて
image: コンテナイメージを Artifact Registry へ作成した リモートリポジトリ から取得- latestタグを指定していますが、検証時点では26.3.2-0でした
set-env-vars: Keycloak への環境変数を指定- KC_BOOTSTRAP_ADMIN_USERNAME: 初期の管理者ユーザ名
- KC_BOOTSTRAP_ADMIN_PASSWORD: 初期の管理者パスワード
- KC_HOSTNAME: 公開されるホスト名
- Cloud Run の 決定論的URL で設定されるURLを指定する
add-volume,add-volume-mount: 作成した GCSバケット を/opt/keycloak/dataへマウント- これにより揮発性のデータを GCSバケット へ出力させて永続化する
max-instances,min-instances: 費用を抑えるために最小memory,cpu: Get started の Kubernetes 上へデプロイする場合の マニフェスト を参照してサイジング- 特にメモリは起動時に確保される
args: Keycloak 起動時の引数を指定start-dev引数で起動することで、 Keycloak を 開発モード で実行する
allow-unauthenticated: サービスを公開し、 IdP を利用したい接続元から接続できるようにするregion: とりあえず東京で起動- 変更する場合、
set-env-varsオプション内の KC_HOSTNAME も変更する点に留意
- 変更する場合、
動作確認
gcloud run deploy コマンド実行後のコンソールにも表示されるが、 Cloud Run が生成するURL( https://keycloak-${PROJECT_NUMBER}.asia-northeast1.run.app )をブラウザで開く。
すると、 Keycloak へログインするための username/password を求められるので、先に環境変数として設定した KC_BOOTSTRAP_ADMIN_USERNAME, KC_BOOTSTRAP_ADMIN_PASSWORD でログインできる。
関連ドキュメント
- Keycloak 公式
- Getting started Docker
- All configuration
Review build options and configuration for Keycloak.
- Keycloak のコンテナイメージ
- Google Cloud 公式
- Artifact Registry の リモートレポジトリ
- Cloud Run の 決定論的URL
