Terraform est un outil open-source d’IaC (Infrastructure as Code). Celui-ci fonctionne au travers de providers qui viennent compléter l’outil afin d’interagir avec les différents cloud providers, SaaS providers et bien d’autres encore. Terraform utilise, pour ses providers, un protocole particulier et open source. Comment fonctionne-t-il ? Qui a-t-il derrière ce protocole ?

Introduction

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 utilisable. 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:

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 : Terraform plugin (Source: https://www.terraform.io/docs/extend/index.html)

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 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, je vous ai préparé un schéma qui retrace les grandes étapes entre Terraform core et la registry: Terraform Registry Protocol

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 type de protocoles de registry:

  • Provider/module registry protocol: le protocole utilisé par https://app.terraform.io (Terraform Registry) et le plus complet. Le protocole que nous avons décrit au-dessus représente celui-ci. En utilisant ce protocole vous serez en capacité de mettre à disposition à vos utilisateurs Terraform des providers et modules. En plus de celà 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 notamment avoir une Provider registry accessible en privé simple sans pour autant publier des providers a des tiers. 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 à l’exception que le stockage et l’accès des providers se fait via un filesystem. Pratique dans certains cas où l’usage en local à son sens mais atteint rapidement ses limites à l’échelle. Plus d’informations sur le provider filesystem mirror sur la documentation officielle HashiCorp.

Le schéma synthétise les propos précédents: Terraform Registry Protocol comparator A noter que le Network Mirror Protocol est moins complet que le Provider/Module Registry Protocol mais se fait beaucoup plus facilement.

Authentification a la registry

A l’exception du Provider filesystem mirror, il est possible d’implémenter le Login Protocol dans votre registry afin d’autoriser certains call 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 static 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 le repository GitHub suivant: https://github.com/apparentlymart/terraform-aws-tf-registry