ResourcesINGÉNIERIE · IAC

Structurer ses modules Terraform pour une infra AWS qui scale

Du main.tf monolithique à une base Terraform modulaire, versionnée et multi-environnements — sans tout casser.

STRALYA11 min readJune 2026

Tout projet Terraform commence par un main.tf de 30 lignes. Dix-huit mois plus tard, c'est un fichier de 2 000 lignes que personne n'ose toucher, avec un seul state partagé entre prod et staging. Voici comment structurer dès le départ — ou refactorer proprement.

Le problème du state unique

Le piège le plus courant : un seul state pour tous les environnements. Un terraform apply destiné à staging peut alors impacter la prod. La première règle est d'isoler les states, idéalement dans un backend S3 avec verrouillage DynamoDB.

La clé key encode l'environnement et le périmètre. Chaque combinaison environnement × domaine a son propre state — un blast radius réduit, et des applies parallélisables.

Anatomie d'un module réutilisable

Un module est une unité qui expose des entrées (variables.tf), produit des ressources (main.tf) et renvoie des sorties (outputs.tf). La structure type :

L'environnement ne fait qu'assembler des modules en leur passant ses valeurs :

Les règles qui évitent la dette

  • Versionnez vos modules : référencez un tag Git (?ref=v1.4.0), pas main, pour que staging et prod n'évoluent pas en même temps.
  • Pin les versions de providers dans required_providers pour des applies reproductibles.
  • Un module = un domaine (réseau, données, calcul). Évitez le module fourre-tout.
  • Pas de valeurs en dur : tout passe par variables, les secrets par SSM/Secrets Manager, jamais dans le state en clair.

Refactorer sans recréer

Découper un monolithe ne doit pas détruire des ressources existantes. terraform state mv (ou les blocs moved depuis la 1.1) déplace une ressource dans le state sans la recréer :

Un plan qui affiche « No changes » après le déplacement est la preuve que le refactor est neutre. C'est l'invariant à viser à chaque étape.

À retenir

  • Isolez les states par environnement × domaine (backend S3 + lock DynamoDB).
  • Un module = un domaine, versionné par tag Git, providers pinnés.
  • Refactorez avec state mv / moved : le plan doit rester « No changes ».
  • Aucun secret ni valeur en dur — variables, SSM, Secrets Manager.
AWS TEARDOWN · FREE

Get the AWS Teardown: where your bill really goes.

The guide listing the 12 cost areas that leak the most at scale-ups, and how to plug them. Free, by email, no obligation.