Infrastructure as Code (IaC) : définition, outils et exemple
La pratique qui consiste à décrire serveurs, réseaux et services Cloud dans des fichiers versionnés plutôt qu'à les configurer à la main : principes, état, idempotence, outils, exemple Terraform et tests.
Par Équipe Blent· Mis à jour le · 14 min de lecture· Niveau intermédiaire
Infrastructure as Code en bref
- Abréviation
- IaC
- Principe
- L'infrastructure décrite dans des fichiers versionnés
- Approches
- Déclarative ou impérative
- Propriété clé
- Idempotence
- Outils phares
- Terraform, OpenTofu, Pulumi, Ansible
- Cibles
- Cloud public, Kubernetes, réseau, on-premise
Définition : Infrastructure as Code
L'Infrastructure as Code, ou IaC, est une pratique qui consiste à décrire et à gérer une infrastructure informatique (serveurs, réseaux, bases de données, services Cloud, clusters) au moyen de fichiers de code plutôt que par des opérations manuelles dans une console. Ces fichiers sont versionnés dans Git, relus comme du code applicatif et exécutés par un outil qui crée, modifie ou supprime les ressources pour atteindre l'état décrit. L'IaC rend l'infrastructure reproductible, traçable et automatisable : le même code produit le même environnement, en développement comme en production, et chaque changement laisse une trace dans l'historique.
En une phrase : l'Infrastructure as Code décrit serveurs, réseaux et services Cloud dans des fichiers versionnés, qu'un outil applique de façon reproductible.
Dans cette définition
Qu'est-ce que l'Infrastructure as Code ?
L'Infrastructure as Code consiste à traiter l'infrastructure comme du logiciel : elle s'écrit, se versionne, se relit, se teste et se déploie automatiquement.
Avant l'IaC, créer un environnement signifiait enchaîner des dizaines d'opérations manuelles : commander un serveur, installer le système, configurer le réseau, ouvrir des ports, créer une base de données. Ces étapes étaient au mieux décrites dans une documentation vite obsolète, au pire connues d'une seule personne. Chaque environnement finissait par diverger des autres, et reconstruire la production après un incident relevait de l'archéologie. L'IaC remplace ces procédures par des fichiers qu'un outil sait exécuter, autant de fois que nécessaire, avec le même résultat.
La pratique s'est d'abord développée avec les outils de gestion de configuration comme Puppet, Chef puis Ansible, conçus pour configurer des parcs de serveurs. L'essor du Cloud public, dont toutes les ressources sont pilotables par API, a ensuite fait naître les outils de provisionnement : AWS CloudFormation, puis Terraform de HashiCorp, devenu le standard multi-cloud, et plus récemment Pulumi, OpenTofu et Crossplane.
L'IaC est un pilier du DevOps : elle permet d'appliquer à l'infrastructure les mêmes pipelines CI/CD que pour le code applicatif, et constitue le prérequis du GitOps.
À retenir : avec l'IaC, la vérité sur l'infrastructure n'est plus dans une console ou dans la mémoire d'un administrateur, mais dans un dépôt Git que toute l'équipe peut lire et relire.
Déclaratif, impératif, idempotence et état : les notions clés
Déclaratif ou impératif
Une approche déclarative décrit le résultat attendu : « je veux trois serveurs de telle taille derrière un équilibreur de charge ». L'outil calcule lui-même les actions nécessaires pour y parvenir à partir de la situation actuelle. Terraform, OpenTofu, CloudFormation et Crossplane fonctionnent ainsi.
Une approche impérative décrit la suite d'actions à exécuter : « crée un serveur, puis installe ce paquet, puis redémarre ce service ». Les scripts Bash ou les appels directs à une API Cloud en sont l'exemple type. Ansible occupe une position intermédiaire : ses playbooks décrivent des tâches ordonnées, mais chaque module cherche à atteindre un état donné.
Idempotence
Un outil idempotent peut être exécuté plusieurs fois sans effet indésirable. Si le serveur existe déjà avec la bonne configuration, une nouvelle exécution ne fait rien. C'est ce qui permet de lancer le code d'infrastructure dans un pipeline automatique à chaque modification, sans craindre de créer des doublons.
L'état
Pour savoir quoi modifier, un outil comme Terraform conserve un fichier d'état qui associe chaque ressource du code à son identifiant chez le fournisseur Cloud. Ce fichier doit être stocké dans un backend partagé, verrouillé pendant chaque exécution et protégé, car il peut contenir des valeurs sensibles. Les outils sans état, comme Ansible, interrogent directement les machines à chaque exécution.
Exemple concret : un bucket de journaux avec Terraform
Voici un extrait de code Terraform qui crée un bucket S3 versionné et chiffré pour stocker des journaux d'application, avec un état distant partagé.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 5.0"
}
}
# État partagé et centralisé pour toute l'équipe
backend "s3" {
bucket = "acme-terraform-state"
key = "production/journaux.tfstate"
region = "eu-west-3"
}
}
provider "aws" {
region = "eu-west-3"
}
variable "environnement" {
type = string
default = "production"
}
resource "aws_s3_bucket" "journaux" {
bucket = "acme-${var.environnement}-journaux"
tags = {
Environnement = var.environnement
GerePar = "terraform"
}
}
resource "aws_s3_bucket_versioning" "journaux" {
bucket = aws_s3_bucket.journaux.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_s3_bucket_server_side_encryption_configuration" "journaux" {
bucket = aws_s3_bucket.journaux.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
Le cycle d'exécution tient en trois commandes :
terraform init # télécharge le provider et configure le backend
terraform plan -out=plan.tfplan # affiche et enregistre les changements prévus
terraform apply plan.tfplan # applique exactement le plan relu
Le code ne dit jamais « crée » ni « modifie » : il décrit le résultat. Si le bucket existe déjà avec cette configuration, terraform plan n'annonce aucun changement. Si quelqu'un désactive le versionnement à la main dans la console, le plan suivant le détecte et propose de le réactiver. En pratique, ces commandes sont exécutées par un pipeline : le plan est publié en commentaire de la merge request, et l'application n'a lieu qu'après fusion.
À quoi sert l'Infrastructure as Code ?
Dès qu'une infrastructure doit être recréée, dupliquée ou auditée, la décrire en code devient rentable.
Environnements identiques
Créer développement, préproduction et production à partir du même code, avec des paramètres distincts.
Environnements éphémères
Monter un environnement complet pour tester une branche, puis le détruire automatiquement.
Reprise après sinistre
Reconstruire une infrastructure dans une autre région en quelques dizaines de minutes.
Socle Cloud d'entreprise
Déployer comptes, réseaux, droits et règles de sécurité communs à toutes les équipes.
Clusters Kubernetes
Provisionner les clusters et leurs dépendances (réseau, stockage, identités) de façon répétable.
Conformité et audit
Prouver la configuration de chaque ressource et vérifier automatiquement les règles internes.
Quels sont les avantages de l'Infrastructure as Code ?
L'IaC apporte à l'infrastructure les bénéfices que le développement logiciel tire depuis longtemps du code versionné.
- Environnements reproductibles, sans différences cachées entre préproduction et production.
- Historique complet des changements : qui a modifié quoi, quand et pourquoi.
- Revue de code et plan d'exécution avant chaque modification de l'infrastructure.
- Provisionnement en minutes au lieu de jours, sans ticket ni clic manuel.
- Réutilisation des bonnes pratiques grâce aux modules partagés entre équipes.
- Documentation vivante : le code décrit exactement ce qui est déployé.
Quelles sont les limites de l'Infrastructure as Code ?
L'IaC déplace la complexité plus qu'elle ne la supprime : une erreur de code peut détruire une infrastructure entière aussi vite qu'elle l'a créée.
- Courbe d'apprentissage : langage, gestion de l'état, modules et fournisseurs à maîtriser.
- Fichier d'état sensible, qui doit être partagé, verrouillé, sauvegardé et protégé.
- Dérive de configuration dès que quelqu'un modifie une ressource à la main.
- Erreurs à fort impact : une suppression mal relue dans un plan peut toucher la production.
- Tests plus difficiles que pour du code applicatif, car ils créent de vraies ressources.
- Reprise délicate d'une infrastructure existante créée manuellement.
Terraform, Pulumi, Ansible, Crossplane : quelles différences ?
Les outils d'IaC ne se concurrencent pas tous : certains provisionnent les ressources, d'autres configurent les machines.
| Outil | Rôle principal | Approche | Langage | Gestion de l'état |
|---|---|---|---|---|
| Terraform / OpenTofu | Provisionnement multi-cloud | Déclarative | HCL | Fichier d'état |
| Pulumi | Provisionnement multi-cloud | Déclarative, pilotée par du code | TypeScript, Python, Go, C#, Java | Fichier d'état ou service managé |
| AWS CloudFormation | Provisionnement sur AWS | Déclarative | YAML ou JSON | Géré par AWS |
| Ansible | Configuration de serveurs | Procédurale, modules idempotents | YAML | Sans état |
| Crossplane | Provisionnement depuis Kubernetes | Déclarative, réconciliation continue | Manifestes Kubernetes | Dans le cluster |
Le couple le plus fréquent reste Terraform pour créer les ressources et Ansible pour configurer les machines qui en ont besoin. Les équipes déjà très investies dans Kubernetes se tournent vers Crossplane, qui réconcilie en continu les ressources Cloud comme n'importe quel objet du cluster. Pour les machines virtuelles, Packer complète l'ensemble en produisant des images préconfigurées : on remplace alors un serveur plutôt que de le modifier, c'est l'infrastructure immuable.
Tester son code d'infrastructure et maîtriser la dérive
Une infrastructure décrite en code peut et doit être testée. Les contrôles s'organisent du plus rapide au plus complet :
- Validation :
terraform fmt -checketterraform validatevérifient le format et la cohérence du code. - Analyse statique : des outils comme Checkov ou Trivy repèrent un bucket public, un port ouvert à tout Internet ou une base non chiffrée avant toute création.
- Revue du plan : le plan d'exécution est relu en merge request, avec une attention particulière aux suppressions et remplacements.
- Tests d'intégration : Terratest ou la commande
terraform testdéploient réellement les ressources dans un compte de test, vérifient leur comportement puis les détruisent.
La dérive de configuration est l'autre risque majeur. Elle apparaît dès qu'une ressource est modifiée hors du code, souvent en urgence pendant un incident. Pour la maîtriser, on restreint les droits d'écriture dans la console, on exécute un plan planifié chaque nuit pour détecter les écarts, et on reporte systématiquement les corrections d'urgence dans le code.
Faut-il décrire son infrastructure en code ?
Pour une infrastructure Cloud amenée à durer ou à évoluer, la réponse est presque toujours oui. Le vrai choix porte sur l'outil et sur le rythme d'adoption.
L'IaC s'impose
- Vous gérez plusieurs environnements qui doivent rester identiques.
- Plusieurs personnes ou équipes modifient l'infrastructure.
- Vous devez pouvoir reconstruire votre infrastructure rapidement.
- Vos changements d'infrastructure doivent être audités.
L'effort peut attendre
- Vous testez un service Cloud pour quelques heures, sans lendemain.
- Une plateforme managée gère déjà toute l'infrastructure sous-jacente.
- Personne dans l'équipe ne pourra maintenir le code produit.
- L'infrastructure se limite à un seul serveur stable et documenté.
Quels outils pour faire de l'Infrastructure as Code ?
Les outils se répartissent entre provisionnement des ressources, configuration des machines, création d'images et tests.
- Provisionnement
Terraform
L'outil multi-cloud de référence, édité par HashiCorp, avec son langage déclaratif HCL.
- Provisionnement
OpenTofu
Fork open source de Terraform hébergé par la Linux Foundation, compatible avec HCL.
- Provisionnement
Pulumi
IaC écrite en langages généralistes : TypeScript, Python, Go, C# ou Java.
- Provisionnement
AWS CloudFormation
Service natif d'AWS qui crée des piles de ressources à partir de modèles YAML ou JSON.
- Configuration
Ansible
Configuration des serveurs et orchestration de tâches, sans agent, via des playbooks YAML.
- Provisionnement Kubernetes
Crossplane
Ressources Cloud gérées comme des objets Kubernetes et réconciliées en continu.
- Images
Packer
Fabrication d'images machine préconfigurées, base d'une infrastructure immuable.
- Tests
Terratest
Bibliothèque Go pour tester du code d'infrastructure en déployant de vraies ressources.
- Environnements locaux
Vagrant
Création de machines virtuelles de développement décrites dans un fichier.
Les concepts à connaître autour de l'Infrastructure as Code
Ces notions reviennent dans tous les outils d'IaC et dans les pratiques qui s'appuient dessus.
- GitOpsL'application continue et automatique du code d'infrastructure à partir de Git.
- CI/CDLa chaîne qui valide, planifie et applique les changements d'infrastructure.
- IdempotenceLa garantie qu'exécuter deux fois le même code produit le même résultat.
- Fichier d'étatLa correspondance entre les ressources décrites et les ressources réelles.
- Dérive de configurationL'écart entre l'infrastructure réelle et celle décrite dans le code.
- Infrastructure immuableRemplacer une ressource plutôt que la modifier, à partir d'images préconstruites.
Ressources pour approfondir l'Infrastructure as Code
Trois articles du blog Blent pour écrire, configurer et tester son infrastructure en code.
- Outil
Terraform : automatiser son infrastructure Cloud
Providers, ressources, état et modules : les bases de l'outil de référence.
Lire l'article - Outil
Ansible : qu'est-ce que c'est ?
Inventaires, playbooks et rôles pour configurer des serveurs sans agent.
Lire l'article - Qualité
Terratest : tester son infrastructure
Écrire des tests automatisés qui déploient, vérifient puis détruisent l'infrastructure.
Lire l'article
Questions fréquentes
Questions fréquentes
Expertise
À propos de l'auteur
Équipe Blent
Les ingénieurs et mentors Blent conçoivent, automatisent et mettent en production des infrastructures Cloud, et forment chaque année des centaines de professionnels au Cloud et au DevOps.
Sources et méthodologie
- Kief Morris, Infrastructure as Code, O'Reilly
- Documentation officielle de Terraform, OpenTofu, Pulumi et Ansible
- Documentation Terratest, Gruntwork
- Retours d'expérience des projets et formations Blent
Comment fonctionne un workflow d'Infrastructure as Code ?
Avec un outil déclaratif comme Terraform, chaque évolution de l'infrastructure suit un cycle en six étapes, très proche de celui du code applicatif.
Décrire les ressources
L'ingénieur écrit dans des fichiers les ressources souhaitées et leurs paramètres : réseau, machines, bases de données, droits d'accès. Les blocs réutilisables sont regroupés en modules.
Versionner et faire relire
Les fichiers sont commités dans Git et soumis en merge request. Des contrôles automatiques vérifient le format, la syntaxe et les règles de sécurité.
Planifier
L'outil compare le code, l'état enregistré et les ressources réelles, puis affiche la liste exacte des créations, modifications et suppressions prévues.
Appliquer
Après validation du plan, l'outil appelle les API du fournisseur Cloud dans le bon ordre, en tenant compte des dépendances entre ressources.
Enregistrer l'état
L'outil met à jour son fichier d'état, stocké de façon partagée et verrouillée, qui associe chaque ressource du code à son identifiant réel.
Détecter la dérive
Un plan exécuté régulièrement révèle les écarts introduits par des modifications manuelles, qu'il faut ensuite corriger ou reporter dans le code.