Quiz : Terraform avancé
Ce quiz vérifie la compréhension des notions du cours Terraform avancé : modules, tests, état. Visez au moins 12 bonnes réponses sur 15 ; chaque réponse renvoie à la leçon à relire. Le niveau 300 se valide avec le projet, relu par un pair.
Modules
1. Vous déplacez des ressources du module racine vers un module reseau. Que propose le plan si vous ne faites rien d'autre, et comment l'éviter ?
Réponse
Le chemin du module fait partie de l'adresse dans l'état (module.reseau.scaleway_vpc.principal) : sans indication, Terraform voit des ressources supprimées et d'autres créées, et propose de détruire puis recréer. Un bloc moved (from l'ancienne adresse, to la nouvelle) réécrit l'adresse ; le plan affiche alors has moved et 0 to destroy. Leçon 1.
2. Pourquoi un module réutilisable ne doit-il pas contenir de bloc provider ?
Réponse
Parce que la configuration du fournisseur (région, identifiants) appartient à l'appelant, qui peut vouloir appeler le module pour plusieurs régions ou projets. Un module déclare ses fournisseurs (required_providers, configuration_aliases) et l'appelant les passe avec providers. En outre, un module qui configure un fournisseur ne peut pas être utilisé avec count ou for_each, ni retiré sans erreur. Leçon 2.
3. À quoi sert optional() dans le type d'une variable objet ?
Réponse
À rendre un attribut facultatif, éventuellement avec une valeur par défaut (optional(number, 7)) : l'appelant ne fournit que ce qui diffère. Cela permet des interfaces typées précisément sans obliger à tout renseigner. Leçon 2.
4. Vous appelez un module Git avec version = "~> 1.2". Que se passe-t-il ?
Réponse
C'est une erreur : l'argument version ne s'applique qu'aux sources de type registre. Pour une source Git, la révision se donne dans l'URL avec ?ref= (une étiquette, une branche ou une empreinte de commit). Leçon 3.
5. Pourquoi épingler un module Git par empreinte de commit plutôt que par étiquette ?
Réponse
Une étiquette Git peut être déplacée vers un autre commit ; une empreinte ne change pas. Aucun fichier de verrouillage ne couvre les modules : l'empreinte (avec la version en commentaire) ou des étiquettes protégées dans la forge sont la seule garantie que le code exécuté est celui qui a été relu. Leçon 3.
Couches, tests et politiques
6. Selon quels critères découper une infrastructure en couches ?
Réponse
Le cycle de vie (le réseau change rarement, l'application souvent), le rayon d'impact (une erreur dans l'application ne doit pas toucher la base), et la propriété (qui a le droit de modifier quoi). La vitesse du plan vient en dernier. Chaque frontière a un coût : interface entre couches et ordre d'application. Leçons 4 et 8.
7. Quel risque présente terraform_remote_state pour passer des informations entre couches ?
Réponse
Il exige de pouvoir lire l'état entier de la couche lue, et copie toutes ses sorties dans l'état du consommateur, secrets compris s'il y en a. Les sources de données du fournisseur, ou des sorties publiées explicitement, sont préférables par défaut. Leçon 4.
8. Un test command = plan échoue sur une assertion qui porte sur l'identifiant d'une ressource. Pourquoi, et que faire ?
Réponse
Au plan, l'identifiant est une valeur inconnue (calculée à la création) : l'assertion ne peut pas être évaluée. On teste en apply simulé avec mock_provider, on force la valeur avec override_resource et override_during = plan, ou l'on asserte sur une valeur connue au plan. Leçon 5.
9. Quelle différence entre une postcondition et une politique exécutée sur le plan JSON ?
Réponse
Une postcondition s'évalue après la création ou la lecture de la ressource : elle protège la suite du graphe, pas l'infrastructure, puisque l'objet existe déjà. Une politique sur le plan JSON (par exemple Rego avec conftest) s'exécute avant l'apply et peut empêcher le changement. Leçon 6.
10. Un bloc check échoue. L'apply est-il bloqué ?
Réponse
Non : un check produit un avertissement, jamais un blocage. Il sert à surveiller la santé de l'ensemble (un point d'accès qui répond, un certificat qui n'expire pas), pas à empêcher un changement. Leçon 6.
Secrets, états et mises à jour
11. Quelle combinaison garde le mot de passe d'une base hors de l'état et du plan ?
Réponse
Une valeur éphémère (variable ou ressource ephemeral, par exemple un mot de passe généré) transmise à un argument en écriture seule (password_wo), avec son numéro de version (password_wo_version) qu'on incrémente pour déclencher une rotation. Terraform 1.11 et OpenTofu 1.11 au moins. sensitive seul ne suffit pas. Leçon 7.
12. Un secret a été écrit dans l'état par le passé, puis le code a été corrigé. Le problème est-il réglé ?
Réponse
Non : les versions antérieures de l'état (versionnement du bucket, sauvegardes) le contiennent toujours, et il a pu être lu. Il faut changer le secret (rotation), pas seulement le code. Leçon 7.
13. Comment déplacer une ressource d'un état à un autre de façon relue et déclarative ?
Réponse
Un bloc removed avec destroy = false dans la configuration d'origine (la ressource sort de la gestion sans être détruite), puis un bloc import dans la configuration d'arrivée. Le critère de réussite est un plan vide des deux côtés. terraform state mv -state-out fait la même chose de façon impérative, avec sauvegardes obligatoires. Leçon 8.
14. Quand adopter Terragrunt, Terramate ou un équivalent ?
Réponse
Face à une douleur précise : beaucoup d'états, une configuration de backend répétée partout, un ordre d'application entre couches que des scripts gèrent mal, un besoin de ne planifier que ce qui a changé. Avec peu d'états, un Makefile ou un script suffit. L'outil adopté concentre des droits et entre dans la chaîne d'approvisionnement : versions épinglées, identités par couche. Leçon 9.
15. Le fichier de verrouillage fixe le fournisseur Scaleway en 2.84.0 et la contrainte autorise ~> 2.84. La version 2.90.0 sort. Que se passe-t-il au prochain terraform init ?
Réponse
Rien : le verrou prime sur la contrainte, et init réutilise 2.84.0. Seul terraform init -upgrade passe à 2.90.0 et réécrit le verrou. On le fait dans une branche, on lit les notes de version, et l'on attend un plan vide en préproduction avant d'aller plus loin. Leçon 10.