Terraform Registry Protocol
Terraform, outil open-source d’IaC (Infrastructure as Code), fonctionne au travers de providers afin d’interagir avec les différents fournisseurs Cloud, SaaS et bien d’autres encore. Terraform utilise, pour ces providers, un protocole particulier et open source, auquel nous allons nous intéresser aujourd’hui. Comment fonctionne-t-il ? Que trouve-t-on derrière ce protocole ?
Dans cet article, nous verrons comment Terraform utilise les Provider au travers de la Terraform public registry, puis les différents types de protocoles de registry utilisables.
Il est possible d’étendre cette méthode pour utiliser les modules Terraform mais le sujet n’est pas abordé ici. Pour plus d’informations sur le sujet, vous pouvez en apprendre plus sur la documentation officielle.
Prérequis
Côté Terraform:
- Connaître les bases : si vous ne connaissez pas Terraform, je vous invite à essayer le learning interactif sur le site officiel de HashiCorp Terraform.
- Les providers Terraform : si la notion de provider vous semble floue, il peut être intéressant de faire un tour sur la documentation.
Comment fonctionne Terraform avec la registry ?
Pour fonctionner, Terraform a besoin de récupérer et d’utiliser des providers afin d’interagir avec les plateformes cibles :
(Source)
La récupération de ces providers passe par défaut par la Terraform public registry (que nous nommerons ici simplement Terraform registry), qui est managée par HashiCorp et accessible via internet.
Pour l’utilisateur de Terraform, récupérer le provider est assez trivial et peut s’apparenter à un simple « téléchargement » (au travers de la commande terraform init). En réalité, les actions réalisées par Terraform sont bien plus nombreuses et complexes.
Terraform interagit avec la registry via un protocole particulier qui est défini dans la documentation Terraform.
Pour éviter la lecture de toute la documentation, voici un schéma qui retrace les grandes étapes entre Terraform core et la registry :
Comme vous l’aurez compris, les interactions sont plus nombreuses et plus complexes qu’un simple download de binaire.
Les différentes registry protocol
Il existe plusieurs types de protocoles de registry :
- Provider/module registry protocol : le protocole utilisé par https://app.terraform.io (Terraform Registry), et le plus complet. C’est le le protocole que nous avons décrit ci-dessus. En utilisant ce protocole vous serez en capacité de mettre à disposition à vos utilisateurs Terraform des providers et modules. En plus de cela, il est possible de vérifier la signature des providers et aussi de stocker les binaires des providers dans un autre endroit que la registry. Plus d’informations sur le protocole et les providers dans la documentation officielle HashiCorp.
- Provider network mirror protocol : une version allégée du protocole ci-dessus. Il permet de mettre des providers à disposition des utilisateurs Terraform sans pour autant vérifier l’origine et/ou signature du provider. Celui-ci peut être un bon choix si vous souhaitez une mise en place plus simple que dans le protocole ci-dessus. Il n’est pas encore possible (au moment de la rédaction de l’article) d’utiliser ce protocole pour des modules. Plus d’informations sur le protocole en question sur la documentation officielle HashiCorp.
- Provider filesystem mirror : Dans la même logique que le Provider network mirror protocol, à une exception, le stockage et l’accès des providers se fait via un filesystem. Pratique dans certains cas où l’usage en local a son sens mais atteint rapidement ses limites à l’échelle. Plus d’informations sur le provider filesystem mirror sur la documentation officielle HashiCorp.
On résume dans un schéma :
A noter que le Network Mirror Protocol est moins complet que le Provider/Module Registry Protocol, mais se fait beaucoup plus facilement.
Authentification à la registry
A l’exception du Provider filesystem mirror, il est possible d’implémenter le Login Protocol dans votre registry afin de n’autoriser certains appels API que si vos utilisateurs sont authentifiés.
Le protocole se base sur OAuth 2.0 et ne supporte que les autorisations de type Code Grant avec certaines limitations comme :
- Le refresh tokens n’est pas supporté. L’utilisateur devra s’authentifier de nouveau.
- L’expiration des token n’est pas supportée.
Au travers de la commande terraform login, l’utilisateur est en capacité de s’authentifier auprès d’un serveur OAuth. La commande supporte notamment le Proof Key for Code Exchange afin de protéger les interceptions de requête.
Enfin, il est important de noter que l’authentification d’obtention de token se fait côté utilisateur et qu’il faudra ajouter à votre registry un mécanisme de vérification de validité du token sur les API cibles.
Aller plus loin
Nous avons vu notamment comment fonctionne le Protocole Registry et ses variations.
Pour ceux qui veulent aller plus loin, il est possible de mettre en place un Provider Registry sous forme de site web statique et simplement. Sauf exception, si vous implémentez un Login Protocol qui demandera de mettre en place un mécanisme de vérification de validité du token sur les API cibles.
Enfin, pour ceux qui souhaite implémenter le protocol registry, vous pouvez vous baser sur ce repository GitHub.