Préambule
Si vous êtes passé à côté de cette information, Keycloak a troqué (depuis sa version 17) son bon vieux socle Wildfly pour une monture Quarkus.
Ce changement technologie permet désormais à Keycloak d’être bien plus adapté aux déploiements Cloud.
Vous ne me croyez pas ? Suivez le guide pour déployer votre instance Keycloak sous CloudRun !
Pré-requis
- Évidemment, un projet GCP sur lequel travailler (le free tiers suffit (presque) !)
- (Optionnel) le code source de vos extensions Keycloak, en version Quarkus
Si vous n’avez pas encore migré (n’attendez plus !), ce guide de migration devrait vous aider.
Préparer Keycloak pour son décollage dans le Cloud
Pour pouvoir utiliser Cloud Run, il est nécessaire de packager l’application Keycloak dans une image docker (Cloud Run exploite Kubernetes sous le capot) et de la mettre à disposition sur la GCP.
Packager Keycloak dans une image docker
Vous devrez généralement passer par une image docker personnalisée de Keycloak, car le nouveau socle Quarkus impose d’ajouter les extensions dans le conteneur Keycloak.
Comme on est sympa chez Ineat, on vous propose de forker ce projet directement prêt à l’emploi !
Pour gommer une contrainte technique liée à Cloud Logging, nous avons besoin d’utiliser une propriété native de Quarkus afin de binder l’attribut du niveau log de level (jboss logging) à severity
.
Dans notre projet, vous y trouverez
- un
Dockerfile
pour la construction de l’image - un fichier
quarkus.properties
qui permet de supporter le log JSON dans Cloud Logging - un fichier
cloudbuild.yaml
qui va nous permettre d’automatiser la création de l’image et son dépôt dans Cloud Artifact Registry ainsi que le déploiement de cette image docker dans CloudRun.
Initier le service Artifact Registry
Artifact Registry va nous permettre de pouvoir héberger nos images Docker de Keycloak afin de s’en servir dans les déploiements Cloud Run.
Dans votre projet GCP,
- Rendez-vous sur la page de Artifact Registry
- Si c’est la première fois que vous souhaitez utiliser ce service, GCP vous demandera d’activer l’api (gratuite en dessous de 500mo / mois !)
- Dans l’onglet Dépôts, cliquez sur le + afin d’initier un dépôt Docker
- Nommez le dépôt
docker-registry
(c’est le nom utilisé par le fichier cloudbuild.yml)
- Nommez le dépôt
Initier le service Cloud Build
Votre Registry Docker initialisée, nous allons pouvoir passer à la publication de l’image grâce à Cloud Build.
Dans votre projet GCP,
- Rendez-vous sur la page de Cloud Build
- Si c’est la première fois que vous souhaitez utiliser ce service, GCP vous demandera d’activer l’api (gratuite les premières 120 minutes / jour !)
- Afin de pouvoir construire notre image depuis notre code source Github, nous allons créer un déclencheur qui se basera sur ce dépôt Github.
- Allez dans la section Déclencheurs et cliquez sur
Connecter un dépôt
. - Choisissez Github puis cliquez
Continuer
- Autorisez Google Cloud Build à s’y connecter
- Installer l’application Github sur votre dépôt :
- Allez dans la section Déclencheurs et cliquez sur
- Puis cliquez
Créer un déclencheur
Nous allons créer un déclencheur manuel qui va nous permettre de créer notre image et la déployer sous Cloud Run à la demande et pour une version de Keycloak donnée !
- Choisissez donc l’option Déclenchement suite à un
Appel manuel
- Dans la partie Variables de substitution, ajoutez _
KEYCLOAK_VERSION
avec une version disponible de Keycloak (21.1.1
par exemple) - Puis cliquez
Créer
Vous devriez avoir un déclencheur dans la liste à l’issue de cette procédure
Si vous cliquez sur Exécuter
, un menu apparaitra afin que vous puissiez déclencher un build
- pour une branche donnée
- pour une version de Keycloak donnée
Essayez !
Vous devriez normalement avoir un build en succès :
Si vous basculez sur Artifact Registry, vous devriez y retrouver votre image :
Propulsez Keycloak dans le Cloud
Bien, maintenant que nous avons packagé Keycloak, il est maintenant (quasiment) prêt à décoller !
Créer un VPC sans serveur
Keycloak n’est pour le moment pas compatible avec Cloud SQL Proxy à cause de limitations introduites par Quarkus; Seule l’utilisation d’un VPC permet à Keycloak de communiquer avec les instances Cloud SQL.
Dans votre projet GCP,
- Rendez-vous sur la page Accès au VPC sans serveur
- Cliquez sur
Créer un connecteur
- Choisissez la même région que votre instance Cloud Run
- Choisissez le réseau
default
- Avec une plage de sous-réseau quelconque (par exemple : 10.8.0.0)
- Dans les paramètres de scaling, vous pouvez basculer sur une instance
f1-micro
pour alléger les couts
Ce service est malheureusement payant. Si votre organisation possède déjà des connecteurs, autant les réutiliser.
Initier une base de donnée sous Cloud SQL
Comme vous le savez surement, Keycloak a besoin d’une base de donnée relationnelle pour fonctionner. Nous allons donc exploiter les capacités de Cloud SQL.
Dans votre projet GCP,
- Rendez-vous sur la page de Cloud SQL
- Cliquez sur
Créer une instance
- Choisissez
PostgresSQL
- Google vous demandera certainement d’activer l’API Compute Engine (Les services Compute Engine et Cloud SQL ne possèdent pas de Free tiers (mais peuvent entrer dans votre crédit gratuit de 300$)
- Créer une instance
- Avec l’identifiant
keycloak-db
par exemple - Générer un mot de passe (et stockez sa valeur temporairement, nous en aurons besoin dans l’étape suivante) pour l’utilisateur
postgres
- Choisissez la version désirée de postgres (v15 au moment de la rédaction de cet article)
- Choisissez la configuration
Développement
- Puis personnalisez votre instance (pour les besoins de cet article, nous allons prendre la plus petite instance possible)
- Type de machine : Cœur partagé – 1 processeur 0.6Go
- Stockage : HDD, 10 GB
- Connexions :
- Adresse IP privée avec réseau
default
(votre connecteur VPC joue son rôle ici !) - Adresse IP publique si vous souhaitez contacter votre BDD depuis l’exterieur
- Adresse IP privée avec réseau
- Avec l’identifiant
- Protection des données : Désactivez les sauvegardes
- Puis cliquez sur
Créer
(la création du service prend un certain temps)
L’activation par IP privé va permettre à Keycloak de contacter le service au travers du connecteur, car pour l’heure, Keycloak ne supporte pas Cloud Proxy à cause de limitations introduites par Quarkus.
Votre instance créée, vous pouvez créer un utilisateur dédié à Keycloak en vous rendant sur l’onglet Utilisateurs
- Nom d’utilisateur : keycloak
- Mot de passe : généré (gardez-le de côté, nous allons en avoir besoin)
Vous pouvez utiliser PgAdmin avec Cloud SQL (la raison pour laquelle nous avons activé l’ip publique).
Vous devez autoriser vos ips à accéder à l’instance via l’onglet Connexions → Mise en réseau → Réseaux autorisés
Configuration CloudRun
Bon, et bien, je pense que nous sommes prêts pour amorcer la rampe de lancement de Keycloak
Vous pouvez donc vous rendre sur la page du service Cloud Run :
- Cliquez sur Créer un service (service qui ne sera pas facturé pour nos usages)
- Sélectionnez l’image docker de Keycloak présente sur notre Artifact Registry :
- Sélectionnez la région désirée (en europe tant qu’à faire)
- Laissez l’option d’allocation du processeur par défaut
- Configurez l’autoscaling à 0 – 1
- Contrôle d’entrée : Toutes
- Authentification : Autoriser les appels non authentifiés
- Option indispensable pour rendre Keycloak accessible à tous
Il est désormais nécessaire de configurer la partie Conteneur, mise en réseau et sécurité.
- Les champs Commande du conteneur et Arguments du conteneur vont vous permettre de définir les options de lancement de Keycloak tel que
start
,start-dev
ou--import-realm
par exemple.
- Pour la capacité, adaptez là en fonction de votre charge estimée de travail, Pour les besoins de ce tutoriel, nous allons choisir la plus petite configuration possible :
Cliquez sur l’onglet Réseau, et choisissez le réseau VPC récemment créé :
La dernière étape consiste à déclarer des variables d’environnement qui seront interprétées par Keycloak pour son paramétrage.
Nous allons donc déclarer les essentielles, qui ne doivent pas contenir d’informations sensibles :
Variable | Valeur |
---|---|
KC_DB_URL_DATABASE | keycloak |
KC_DB_URL_HOST | l’adresse IP privée de votre instance CloudSQL |
KC_DB_URL_PORT | 5432 |
KC_DB | postgres |
KC_DB_SCHEMA | public |
KC_LOG_CONSOLE_OUTPUT | json (permet de remonter les logs au format adapté Cloud Logging) |
KC_PROXY | edge (très important, GCP portera la partie proxy) |
KC_HOSTNAME (optionnel) | indispensable pour les redirections opérés par Keycloak si vous avez lié un DNS propre. |
Il nous reste des variables d’environnements à définir, qui contiendront des informations sensibles telles que des mots de passes.
Pour les définir de manière sécurisé, nous allons exploiter Secret Manager.
Exploiter Secrets Manager
Pour configurer vos secrets, ouvrez Secrets Manager dans un nouvel onglet.
Nous allons y créer les secrets détenant les mots de passes de connexions à Keycloak, et Postgres
Créez les trois secrets suivants :
Variable | Valeur |
---|---|
KC_DB_PASSWORD | Le mot de passe de l’utilisateur Postgres Keycloak, créé précédemment |
KEYCLOAK_ADMIN | Le nom d’utilisateur admin de votre Keycloak |
KEYCLOAK_ADMIN_PASSWORD | Le mot de passe de l’utilisateur admin de Keycloak |
Secrets Manager permet de stocker également des secrets depuis un fichier (via upload) ; Vous pouvez donc y stocker des valeurs de certificats par exemple, qui pourront être montés en tant que volumes dans Cloud Run.
Si vous avez besoin de personnaliser les options de votre JVM Keycloak, vous pouvez également y déclarer la variable KC_JAVA_OPTS
avec ce genre d’options :
-Dsun.security.krb5.debug=true -Dsun.security.spnego.debug=true -Djava.security.auth.login.config=/krb5/krb5Login.conf -Djava.security.krb5.conf=/krb5/krb5.conf
Ces secrets créés, vous pouvez rebasculer sur la configuration de Cloud Run afin de les intégrer:
- Cliquez sur
Ajouter la référence à un secret
pour les 3 secrets créés - Choisissez le secret créé
- Méthode de référence : Variable d’environnement
- Utilisez le même nommage que le nom du secret, en version latest
Pour monter un volume, utilisez la méthode de référence Volumes, Le chemin d’accès au montage vous permettra d’accéder au fichier.
Vous pouvez maintenant déployer votre révision !
Si le démarrage s’effectue correctement, une URI google sera généré en .web.app
afin que vous puissiez accéder au backoffce de Keycloak.
Vous pouvez d’ailleurs consulter les logs (au format JSON, s’il vout plait) de Keycloak grâce à l’onglet Journaux ou directement dans Cloud Logging
Et voilà !