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)

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 :
  • 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
  • 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 :

  • 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é.

  • 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 :

VariableValeur
KC_DB_URL_DATABASEkeycloak
KC_DB_URL_HOSTl’adresse IP privée de votre instance CloudSQL
KC_DB_URL_PORT5432
KC_DBpostgres
KC_DB_SCHEMApublic
KC_LOG_CONSOLE_OUTPUTjson (permet de remonter les logs au format adapté Cloud Logging)
KC_PROXYedge (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 :

VariableValeur
KC_DB_PASSWORDLe mot de passe de l’utilisateur Postgres Keycloak, créé précédemment
KEYCLOAK_ADMINLe nom d’utilisateur admin de votre Keycloak
KEYCLOAK_ADMIN_PASSWORDLe 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
configuration des variables d'environnements via les secrets

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à !