Aller au contenu
Infrastructure as Code medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Utiliser un module du Terraform Registry

9 min de lecture

logo terraform

Le Terraform Registry est le catalogue officiel de modules prêts à l’emploi. Au lieu de tout écrire vous-même, vous pouvez réutiliser un module créé et maintenu par la communauté ou par un éditeur. Il suffit de référencer son nom et sa version dans un bloc module pour que terraform init le télécharge automatiquement.

Prérequis : avoir lu Créer un module Terraform et Utiliser un module local.

  • Trouver un module sur le Terraform Registry
  • Référencer un module public avec la syntaxe source et version
  • Utiliser un sous-module avec la notation //
  • Comprendre ce que terraform init télécharge concrètement
  • Comparer les différentes sources de modules

Le Terraform Registry est accessible à l’adresse registry.terraform.io. Il héberge deux types de contenus :

  • Providers : les plugins qui permettent à Terraform de communiquer avec une API (AWS, Azure, libvirt…)
  • Modules : des blocs de code réutilisables qui assemblent des ressources

Chaque module du Registry possède une page avec :

  • Les inputs (variables) et leurs types
  • Les outputs disponibles
  • Un README avec des exemples d’utilisation
  • Les versions publiées et leur changelog
  • Les dépendances (providers requis)

Un module du Registry se référence avec le format namespace/name/provider :

module "iam_account" {
source = "terraform-aws-modules/iam/aws"
version = "5.52.2"
# ↑ ↑ ↑ ↑
# | namespace name provider
# argument version (fortement recommandé pour figer le comportement)
}
ComposantRôleExemple
namespaceOrganisation ou auteurterraform-aws-modules
nameNom du moduleiam
providerProvider principalaws

Pour un module du Registry, l’argument version n’est pas techniquement obligatoire, mais il est fortement recommandé. Si vous l’omettez, Terraform résout la version disponible au moment du init, ce qui rend les mises à jour moins prévisibles. Terraform supporte les contraintes de version :

module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "5.21.0"
# ↑ version exacte recommandée
}
module "vpc_flexible" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.0"
# ↑ accepte 5.x.x mais pas 6.0.0
}
ContrainteSignification
"5.21.0"Version exacte uniquement
"~> 5.0">= 5.0 et < 6.0
"~> 5.21.0">= 5.21.0 et < 5.22.0 (patchs uniquement)
">= 5.0, < 6.0"Plage explicite

Les modules du Registry contiennent souvent des sous-modules dans un dossier modules/. La notation // permet de cibler un sous-module spécifique :

module "iam_account" {
source = "terraform-aws-modules/iam/aws//modules/iam-account"
version = "5.52.2"
# ↑ le module principal est "iam"
# le sous-module ciblé est "modules/iam-account"
}

La partie avant // identifie le module du Registry. La partie après // est le chemin relatif vers le sous-module à l’intérieur du dépôt.

Lors de l’initialisation, Terraform affiche clairement le téléchargement :

$ terraform init
Initializing modules...
Downloading registry.terraform.io/terraform-aws-modules/iam/aws 5.52.2 for iam_account...
- iam_account in .terraform/modules/iam_account/modules/iam-account

Le module est stocké dans .terraform/modules/. Le fichier .terraform/modules/modules.json enregistre la correspondance :

{
"Modules": [
{
"Key": "iam_account",
"Source": "registry.terraform.io/terraform-aws-modules/iam/aws//modules/iam-account",
"Version": "5.52.2",
"Dir": ".terraform/modules/iam_account/modules/iam-account"
}
]
}

Le contenu téléchargé est un module Terraform classique — les mêmes fichiers qu’un module local :

.terraform/modules/iam_account/modules/iam-account/
├── main.tf
├── outputs.tf
├── README.md
├── variables.tf
└── versions.tf

Voici un exemple complet qui utilise un module du Registry pour configurer une politique de mots de passe AWS :

versions.tf
terraform {
required_version = ">= 1.11.0"
}
main.tf
module "iam_account" {
source = "terraform-aws-modules/iam/aws//modules/iam-account"
version = "5.52.2"
account_alias = "mon-compte-demo"
minimum_password_length = 14
require_numbers = true
require_symbols = true
require_lowercase_characters = true
require_uppercase_characters = true
}

Le terraform validate confirme la validité de cette configuration — même sans credentials AWS, la syntaxe est vérifiée :

$ terraform validate
Success! The configuration is valid.

Le bloc source accepte plusieurs formats selon l’origine du module :

SourceFormat sourceversionTéléchargement
Local"./modules/reseau"Non supportéLecture directe sur disque
Registry public"namespace/name/provider"Obligatoireregistry.terraform.io
Registry privé"app.terraform.io/org/name/provider"ObligatoireTerraform Cloud/Enterprise
GitHub"github.com/org/repo//modules/X"Non (utiliser ref)Clone Git
Git générique"git::https://example.com/repo.git"Non (utiliser ref)Clone Git
S3"s3::https://bucket/module.zip"NonTéléchargement HTTP

Les modules locaux et du Registry public couvrent la grande majorité des cas d’usage.

SituationRecommandation
Infrastructure standard (VPC, IAM, S3…)Module du Registry — gain de temps considérable
Besoin très spécifique à votre entrepriseModule local ou privé
Apprentissage d’un service cloudModule du Registry — code de référence
Infrastructure critique en productionModule du Registry épinglé + revue du code source
SymptômeCause probableSolution
Module not foundNom du module incorrectVérifier le format namespace/name/provider sur le Registry
version ... does not matchContrainte de version incompatibleConsulter les versions disponibles sur la page du module
Error downloading modulesProblème réseau ou proxyVérifier la connectivité à registry.terraform.io
Could not download module avec Registry privéToken manquantConfigurer credentials dans ~/.terraformrc
Module téléchargé mais terraform plan échoueVariables obligatoires non fourniesLire les Inputs sur la page du module
  1. Le Terraform Registry héberge des modules réutilisables créés par la communauté
  2. La source suit le format namespace/name/provider avec une version obligatoire
  3. La notation // cible un sous-module dans un dépôt multi-modules
  4. terraform init télécharge le module dans .terraform/modules/
  5. Un module du Registry a la même structure qu’un module local (main.tf, variables.tf, outputs.tf)
  6. Épinglez toujours la version pour éviter les mises à jour surprises

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn