Be Software Architecture Wise
Be Wise Apps

Read in English · Leer en español · Auf Deutsch lesen

Section 10.4 sur 10.8 · Avancé · 24 min de lecture

Infrastructure en tant que code et infrastructure immuable

Leçon vidéo

5 min · narré en anglais, avec sous-titres
Écouter seulement (audio)
Lire la transcription

Cliquer dans une console cloud n’est ni relu, ni enregistré, ni reproductible. Dans cette leçon, vous verrez comment l’infrastructure devient du code : déclarée, planifiée, relue, appliquée et maintenue fidèle à la réalité.

Imaginez que vous meubliez un hôtel de deux cents chambres identiques. Vous pourriez dire à chaque décorateur quoi faire, et espérer qu’il s’en souvienne. Ou bien vous pourriez écrire une spécification précise pour une chambre, la ranger dans un classeur, et faire approuver chaque modification par écrit. Alors n’importe quelle chambre peut être vérifiée, une chambre endommagée peut être refaite à l’identique, et une nouvelle aile aménagée en quelques jours. L’infrastructure en tant que code est cette spécification pour les ordinateurs, les réseaux et les bases de données sur lesquels tourne un système.

L’infrastructure en tant que code, ou IaC, consiste à définir les réseaux, les machines, les bases de données et les autorisations dans des fichiers conservés sous gestion de versions. Un script impératif énumère les étapes : créer un réseau, puis un sous-réseau, puis une base de données. Exécutez-le deux fois, et il tente de tout créer deux fois. Un outil déclaratif décrit plutôt l’état final, et en déduit les étapes en comparant cette description avec ce qui existe. L’appliquer deux fois ne change donc rien la seconde fois. Cette propriété, l’idempotence, est ce qui permet d’exécuter du code d’infrastructure encore et encore, en automatisation, sans risque. Terraform est devenu l’outil multicloud le plus utilisé. En 2023, HashiCorp l’a fait passer d’une licence open source à la Business Source License, et la communauté en a fait un fork, OpenTofu. La leçon : la licence et la gouvernance d’un outil font partie de son risque.

Voici comment fonctionne un outil comme Terraform ou OpenTofu. Le code, conservé dans Git, dit ce qui devrait exister. Le fichier d’état associe chaque ressource du code à l’objet réel que l’outil a créé. Il doit être distant, verrouillé pendant les modifications, versionné, et traité comme un secret, car il contient souvent des mots de passe en clair. Le plan compare le code, l’état et l’infrastructure réelle, lue via l’API du fournisseur. Il montre ce qui changerait avant que quoi que ce soit ne se produise, et les relecteurs le lisent dans la pull request. Ce n’est qu’après la revue qu’il est appliqué. L’apply modifie l’infrastructure réelle et enregistre le résultat dans l’état. Mais si quelqu’un modifie quelque chose à la main dans la console, l’infrastructure réelle ne correspond plus au code. C’est la dérive, et le plan suivant tentera de l’annuler.

Voici la dérive en pratique. Pendant un incident un vendredi soir, un ingénieur ouvre le pare-feu de la base de données de production des commandes à l’adresse IP d’un prestataire, via la console. Personne ne met à jour le code. Le samedi, la tâche nocturne de détection de dérive exécute un plan pour chaque état de production. Elle signale un changement, pour ce pare-feu, et le publie à l’intention de l’équipe plateforme. Le plan montre l’adresse en plus, et le journal d’audit du cloud indique qui l’a ajoutée, quand, et pour quel incident. L’accès était temporaire et l’incident est terminé : c’est donc le code qui a raison et la réalité qui a tort. Appliquer le plan supprime la règle. Si le changement avait été nécessaire pour de bon, il serait entré dans le code par une pull request relue. Ensuite, l’accès en écriture à la console de production devient un rôle d’urgence qui exige une justification et déclenche une alerte. La règle empirique : toute différence est codifiée ou annulée au plus tard le jour ouvré suivant.

Des modules réutilisables masquent les détails du fournisseur derrière une interface réduite, comme le nom, la taille et la haute disponibilité. Le staging et la production utilisent les mêmes modules versionnés avec des entrées différentes, jamais du code copié, qui diverge en quelques mois. L’infrastructure immuable consiste à ne jamais modifier un serveur en fonctionnement. Chaque changement, même un correctif du système d’exploitation, est une nouvelle image qui remplace les anciennes instances. Il n’y a pas de dérive, et revenir en arrière consiste à redéployer l’image précédente. Et la politique en tant que code transforme des règles, comme l’absence de buckets de stockage publics et le chiffrement des bases de données, en vérifications automatiques sur chaque plan, expliquées dans la pull request.

GitOps applique la boucle de réconciliation de la section dix point deux à des environnements entiers. Un développeur pousse du code, et le pipeline le teste, construit une image et la pousse vers un registre. Le pipeline commite ensuite le nouveau digest de l’image dans un dépôt de configuration, qui contient l’état souhaité. Les changements apportés à ce dépôt sont relus comme n’importe quel code. À l’intérieur du cluster, un agent comme Argo CD ou Flux récupère ce dépôt, l’applique, et corrige sans cesse la dérive. Une modification manuelle ne dure que jusqu’à la synchronisation suivante. Comme c’est l’agent qui va chercher les changements, le pipeline n’a besoin d’aucun identifiant pour la production. Git devient le journal d’audit, et revenir en arrière est un revert relu.

La section complète compare les outils, montre comment tester le code d’infrastructure, et se termine par une liste de contrôle pour la production. Ensuite, dans la section dix point cinq, nous suivons un changement du commit jusqu’à la production. À très vite.

Ce qu’il faut savoir

Ce qu’est l’infrastructure en tant que code

L’infrastructure en tant que code (IaC) consiste à définir les réseaux, les machines virtuelles, les clusters, les bases de données, les files d’attente, les enregistrements DNS, les autorisations et tous les autres éléments d’infrastructure dans des fichiers texte conservés sous gestion de versions, et à laisser des outils créer et modifier les ressources réelles à partir de ces fichiers. Au lieu qu’un ingénieur clique dans une console cloud, un changement est un commit : relu dans une pull request, testé dans un pipeline, appliqué automatiquement et enregistré pour toujours.

L’idée est plus ancienne que le cloud public. CFEngine de Mark Burgess (1993) gérait des machines Unix à partir de politiques déclaratives ; Puppet (2005), Chef (2009) et Ansible (2012) ont popularisé la gestion de configuration. Le cloud l’a rendue indispensable, car l’infrastructure elle-même est devenue accessible par des API : AWS CloudFormation (2011) et Terraform de HashiCorp (2014) décrivent des environnements entiers, et pas seulement le logiciel installé sur les serveurs. Le livre de Kief Morris Infrastructure as Code, aujourd’hui dans sa troisième édition (2025), est l’ouvrage de référence sur cette pratique et ses principes.

Les bénéfices sont ceux du génie logiciel appliqué à l’infrastructure. Les environnements deviennent reproductibles : le staging peut être construit à partir des mêmes définitions que la production, et une région peut être reconstruite après un sinistre à partir du code plutôt que de mémoire. Les changements deviennent vérifiables et auditables, ce que les régulateurs et les équipes de sécurité apprécient. Le savoir cesse de vivre dans la tête d’un seul ingénieur. Et la rapidité augmente, car créer un environnement pour un nouveau service de la plateforme de livraison de repas devient une pull request plutôt qu’un ticket qui attend deux semaines.

Déclaratif ou impératif

Une approche impérative énumère les étapes : créer un réseau, puis un sous-réseau, puis une base de données, puis ouvrir tel port. Exécuter le script deux fois tente de tout créer deux fois. Une approche déclarative décrit l’état final, l’état souhaité de la section 10.2 : un réseau avec ces sous-réseaux, une base de données de cette taille, un pare-feu qui autorise ce port. L’outil compare la description avec ce qui existe et en déduit les étapes, si bien que l’appliquer deux fois ne change rien la seconde fois. Cette propriété, l’idempotence, est ce qui permet d’exécuter du code d’infrastructure de façon répétée et en automatisation sans risque.

La plupart des outils matures sont déclaratifs au fond, mais ils diffèrent par le langage utilisé pour écrire la déclaration et par l’entité qui tient le registre de ce qui existe. Le tableau résume les principales familles.

Approches du code d’infrastructure

ApprocheVous écrivezExemplesPoints fortsFaiblesses
Scripts impératifsDes séquences d’appels CLI ou SDKScripts shell appelant les CLI des clouds, programmes SDKFamiliers, souples, rapides pour des tâches ponctuellesNon idempotents sans grand soin ; aucun registre de ce qui existe ; difficiles à modifier sans risque
Langage déclaratif dédiéDes ressources et leurs relations dans un langage de configurationTerraform et OpenTofu (HCL), AWS CloudFormation (YAML ou JSON), Azure Bicep, manifestes KubernetesPlans lisibles et vérifiables ; idempotents ; vastes écosystèmes de providersBoucles, conditions et abstraction parfois malcommodes ; un langage à apprendre
Modèle déclaratif, langage généralisteDu code en TypeScript, Python, Go, C# ou Java qui construit un modèle déclaratifPulumi, AWS Cloud Development Kit (CDK)De vraies abstractions, des outils de test et des éditeurs ; familier pour les développeursFacile d’écrire une infrastructure astucieuse et difficile à relire ; le plan est moins visible dans le code
Réconciliation continueDes ressources de style Kubernetes décrivant l’infrastructure cloudCrossplane, contrôleurs Kubernetes des fournisseurs cloudMême boucle de réconciliation et mêmes outils que pour les applications ; dérive corrigée en continuNécessite un plan de contrôle Kubernetes ; le débogage s’étend sur deux systèmes
Gestion de configurationLa configuration souhaitée des logiciels sur des serveurs existantsAnsible, Chef, PuppetGère les machines à longue durée de vie, les équipements réseau et les parcs sur siteLes serveurs accumulent un historique et dérivent ; plus lent et moins prévisible que de les remplacer

Les outils et le fork OpenTofu

Terraform est devenu l’outil multicloud le plus utilisé parce qu’un seul langage et un seul flux de travail couvrent des milliers de providers : AWS, Azure, Google Cloud, Cloudflare, Kubernetes, GitHub, des services de supervision et bien d’autres. Le 10 août 2023, HashiCorp a fait passer Terraform de la licence open source Mozilla Public License 2.0 à la Business Source License 1.1, qui autorise l’usage interne et commercial mais interdit de le proposer dans des produits concurrents de ceux de HashiCorp. La version 1.5.7 a été la dernière publiée sous l’ancienne licence.

La communauté a répondu par un fork. Un manifeste appelant à un retour à l’open source est paru en quelques jours ; en septembre 2023, la Linux Foundation a accepté le fork sous le nom d’OpenTofu ; sa première version stable, la 1.6.0, a suivi en janvier 2024 ; et en 2025, il a été accepté à la CNCF comme projet sandbox. IBM a finalisé son acquisition de HashiCorp en février 2025. Les deux outils restent largement compatibles par le langage et les providers, mais leurs fonctionnalités divergent : OpenTofu a par exemple ajouté le chiffrement de l’état côté client, tandis que la plateforme commerciale de Terraform a ajouté ses propres capacités. Pour un architecte, l’épisode rappelle que la licence et la gouvernance d’un outil font partie de son profil de risque, et que des standards ouverts et une alternative crédible gardent ce risque maîtrisable.

Parmi les outils propres à un seul cloud, AWS CloudFormation (2011) et Bicep de Microsoft (introduit en 2020, compilé en modèles Azure Resource Manager) sont exécutés par le fournisseur, qui tient le registre de ce qui existe : il n’y a donc pas de fichier d’état à gérer, au prix d’une dépendance à un seul cloud. Pulumi (2018) et l’AWS CDK permettent aux développeurs d’écrire l’infrastructure dans des langages généralistes ; Crossplane étend Kubernetes pour gérer les ressources cloud par réconciliation. Le bon choix dépend des clouds que vous utilisez, des compétences de votre équipe, de la maturité des providers dont vous avez besoin, de la politique en matière de licences et de ce que le reste de l’organisation utilise déjà ; la cohérence entre les équipes vaut généralement plus que les mérites marginaux d’un outil donné.

terraform {
  required_version = ">= 1.6"
  backend "gcs" {                 # remote state; this backend locks natively
    bucket = "fd-infra-state"
    prefix = "orders/prod"
  }
}

variable "environment" { type = string }

module "orders_db" {
  source      = "git::https://git.example.com/modules/postgres.git?ref=v3.2.0"
  name        = "orders-${var.environment}"
  size        = var.environment == "prod" ? "large" : "small"
  high_avail  = var.environment == "prod"   # standby in a second zone
  backup_days = 14
}

output "orders_db_host" {
  value = module.orders_db.host
}
OpenTofu ou Terraform (HCL) : état distant et module interne versionné qui masque les détails du provider derrière une interface réduite.

Exécuter tofu plan (ou terraform plan) montre ce qui changerait avant que quoi que ce soit ne se produise. Le plan est l’artefact le plus important du flux de travail : les relecteurs le lisent dans la pull request, à côté du code, et c’est lui qui est appliqué.

  # module.orders_db.google_sql_database_instance.this will be updated in-place
  ~ resource "google_sql_database_instance" "this" {
      ~ settings {
          ~ tier = "db-custom-2-8192" -> "db-custom-4-16384"
        }
    }

Plan: 0 to add, 1 to change, 0 to destroy.
Un plan abrégé pour redimensionner la base de données de production des commandes. Le tilde signale une mise à jour sur place ; un -/+ signifierait détruire et recréer, ce qui, pour une base de données, est un signal d’alarme.

État, verrouillage et dérive

Les outils déclaratifs doivent savoir quelles ressources réelles correspondent à quelles définitions. Terraform et OpenTofu conservent cette information dans l’état : un fichier qui associe chaque ressource du code à l’identifiant de l’objet réel, avec ses derniers attributs connus. La planification compare trois choses : le code (ce qui devrait exister), l’état (ce que l’outil a créé) et l’infrastructure réelle, lue via l’API du fournisseur (ce qui existe vraiment).

Plan, apply, état et dérive

Flux du code d’infrastructure : l’étape plan compare le code, le fichier d’état et l’infrastructure réelle ; apply modifie l’infrastructure et enregistre le résultat dans l’état ; une modification manuelle en console provoque une dériveCode (.tf)état souhaité, dans GitÉtatdistant, verrouilléPlancalculer la différenceInfrastructure réelleAPI fournisseurApplyaprès revue humaineModif. consolemanuellece qui doit existerce qu’ona créélire le réelenreg. résultatdérive : la réalité diffère du code
Un plan compare le code, l’état et la réalité ; une modification manuelle dans la console fait diverger la réalité des deux, et le plan suivant tentera de l’annuler.

L’état demande du soin parce qu’il est à la fois critique et sensible. Il doit être stocké à distance (dans un stockage objet ou un service managé), pas sur un portable, afin que toute l’équipe et le pipeline partagent une seule version. Il doit être verrouillé pendant les modifications, pour que deux apply ne puissent pas s’entremêler et le corrompre. Il doit être sauvegardé et versionné, car un fichier d’état perdu laisse l’outil dans l’ignorance des ressources qu’il a créées. Et c’est un secret : l’état contient souvent des mots de passe de bases de données et des clés en clair, donc son accès doit être restreint, et il doit être chiffré au repos (OpenTofu peut aussi le chiffrer côté client).

La dérive de configuration (drift) est toute différence entre le code et la réalité, généralement due à des modifications manuelles faites dans l’urgence, à un autre outil qui touche la même ressource, ou à un échec partiel pendant un apply. La dérive est dangereuse, car le prochain apply peut annuler silencieusement un changement dont quelqu’un dépendait, ou échouer en production sur une différence dont personne ne soupçonnait l’existence. Les équipes la détectent en exécutant un plan à intervalles réguliers (par exemple chaque nuit) et en alertant sur tout changement proposé, et la préviennent en limitant l’accès en écriture à la console à une procédure d’urgence (break-glass) enregistrée.

L’état définit aussi le rayon d’impact (blast radius). Un état géant pour toute une entreprise signifie que chaque plan est lent, que chaque apply met tout en jeu et qu’un seul verrou bloque toutes les équipes. Découper l’état par composant et par environnement (réseau, cluster partagé, ressources de chaque service ; production séparée du staging) garde les plans rapides et les défaillances contenues, au prix de devoir transmettre des sorties, comme les identifiants réseau, d’un état à l’autre. La refactorisation est prise en charge : les blocs moved renomment des ressources sans les détruire, et import place sous gestion des ressources existantes créées à la main.

Exemple commenté

Exemple commenté : une règle de pare-feu qui a dérivé

Pendant un incident un vendredi soir, un ingénieur ouvre, via la console cloud, le pare-feu de la base de données de production des commandes à l’adresse IP d’un prestataire, pour que celui-ci aide à diagnostiquer une requête lente. Personne ne met à jour le code.

DétectionLa tâche nocturne de détection de dérive exécute tofu plan pour chaque état de production. Le samedi, elle signale 1 to change pour le pare-feu de la base des commandes et publie le plan dans le canal de l’équipe plateforme.
DiagnosticLe plan montre une adresse source autorisée en plus. Le journal d’audit du cloud indique qui l’a ajoutée, quand et dans le cadre de quel incident.
DécisionL’accès était temporaire et l’incident est clos : c’est donc le code qui a raison et la réalité qui a tort. Appliquer le plan supprime la règle. Si le changement avait été nécessaire de façon permanente, la correction aurait consisté à l’ajouter au code par une pull request relue.
PréventionL’accès en écriture à la console de production est remplacé par un rôle d’urgence (break-glass) qui exige une justification et déclenche une alerte à chaque utilisation. Une règle de politique (voir plus bas) rejette toute règle de pare-feu de base de données ouverte à tout l’internet.
Ce que cela montreLa dérive n’est pas qu’une question de rangement : un trou non documenté dans un pare-feu est une exposition de sécurité, et sans détection, le prochain apply sans rapport l’aurait supprimé sans que personne sache pourquoi le prestataire avait perdu son accès.

La règle empirique : la réalité peut différer du code pendant quelques minutes lors d’une urgence, mais la différence doit être soit codifiée, soit annulée au plus tard le jour ouvré suivant.

Modules et environnements

Un module est une unité réutilisable de code d’infrastructure, avec des entrées et des sorties : une base de données PostgreSQL avec sauvegardes et supervision, le réseau et l’équilibreur de charge d’un service, un namespace Kubernetes standard avec ses quotas et ses politiques. Un bon module applique le masquage de l’information du chapitre 3 : une interface réduite (nom, taille, haute disponibilité ou non) devant les nombreux détails propres au fournisseur qu’une équipe de service ne devrait pas avoir à connaître. Les modules sont versionnés et publiés comme des bibliothèques, et les environnements font référence à une version précise, comme le ref=v3.2.0 de l’exemple, afin qu’un changement de module n’atteigne la production que lorsque quelqu’un en fait délibérément la mise à niveau.

Les environnements doivent être construits à partir des mêmes modules avec des entrées différentes, et non à partir de code copié. Une organisation courante consiste en un répertoire (ou un dépôt) par environnement et par composant, chacun avec son propre état, qui appelle des modules partagés et versionnés ; un changement est promu en mettant à jour la version du module ou les entrées en staging, puis en production. Les environnements copiés-collés divergent en quelques mois, jusqu’à ce que le staging ne permette plus de prédire la production. Les workspaces, qui donnent plusieurs états à une même configuration, conviennent mieux aux copies éphémères, comme les environnements de test par branche, qu’au staging et à la production, qui durent.

Méfiez-vous de la sur-abstraction. Un module avec quarante entrées booléennes qui essaie de servir toutes les équipes est aussi difficile à modifier que le code qu’il a remplacé. Préférez quelques modules aux choix affirmés qui encodent les standards de l’organisation : c’est exactement ce qu’une équipe plateforme propose sous forme de golden path à la section 10.7.

Infrastructure immuable ou gestion de configuration

Les outils de gestion de configuration maintiennent des serveurs à longue durée de vie dans un état décrit : Ansible se connecte par SSH et pousse les changements sans agent ; Chef et Puppet font tourner des agents qui récupèrent leur configuration et y convergent périodiquement. Ils fonctionnent, mais chaque serveur accumule un historique : paquets installés pendant un incident, fichiers modifiés à la main, mises à jour appliquées à moitié. Martin Fowler a appelé le résultat un snowflake server (serveur flocon de neige), unique et impossible à reproduire, et a proposé comme remède le phoenix server (serveur phénix), régulièrement brûlé et reconstruit de zéro.

L’infrastructure immuable, terme popularisé par Chad Fowler en 2013, pousse ce remède jusqu’au bout : ne jamais modifier un serveur en fonctionnement. Chaque changement, qu’il s’agisse d’une mise en production applicative ou d’un correctif du système d’exploitation, passe par la construction d’une nouvelle image (une image de conteneur, ou une image de machine avec un outil comme Packer), son test et le remplacement des anciennes instances, généralement par un déploiement progressif ou bleu-vert. Les conteneurs sur Kubernetes sont immuables par défaut. Les avantages sont l’absence de dérive, des instances identiques, des environnements trivialement reproductibles et un retour arrière par redéploiement de l’image précédente ; les coûts sont un pipeline d’images, le besoin de processus jetables et sans état (section 10.3) et un délai plus long pour un changement urgent isolé.

La gestion de configuration n’a pas disparu. Elle reste le bon outil pour les parcs qui ne peuvent pas être remplacés en bloc : serveurs sur site, équipements réseau, bases de données sur du matériel dédié, et les images de base elles-mêmes, souvent construites en exécutant Ansible pendant la construction de l’image. La règle d’architecture est de repousser la mutabilité aussi bas et aussi tôt que possible : configurer pendant la construction des images, puis traiter ce qui tourne comme étant en lecture seule.

GitOps

GitOps applique la boucle de réconciliation de la section 10.2 à des environnements entiers. Le terme a été forgé en 2017 par Alexis Richardson, de Weaveworks, l’entreprise à l’origine de l’outil Flux. Le projet OpenGitOps, un groupe de travail de la CNCF, définit quatre principes : l’état souhaité est déclaratif ; il est versionné et immuable, avec un historique complet ; il est récupéré automatiquement par des agents logiciels ; et il est réconcilié en continu, des agents observant l’état réel et appliquant l’état souhaité. Les deux principaux agents, Argo CD et Flux, sont tous deux des projets diplômés (graduated) de la CNCF ; Flux a continué comme projet communautaire après la fermeture de Weaveworks en 2024.

Un flux de livraison GitOps

GitOps : la CI construit et pousse une image, puis commite son digest dans un dépôt de configuration ; les changements relus dans ce dépôt sont récupérés par un agent dans le cluster, qui les applique et corrige sans cesse la dériveDéveloppeurDépôt appcode sourcePipeline CItest, build, pushRegistreimages par digestcommit du digestRelecteursapprouventrevue de PRDépôt configétat souhaitéCluster Kubernetesdétecte la dérive et réappliqueAgent GitOpsArgo CD ou Fluxrécupéré par l’agentWorkloadspods, servicesrécup. images
La CI construit et publie les images ; Git contient l’état souhaité ; un agent dans le cluster le récupère, l’applique et corrige sans cesse la dérive.

Le modèle pull a un avantage de sécurité sur un pipeline qui pousse les changements dans le cluster : le système de CI n’a besoin d’aucun identifiant pour la production, car l’agent à l’intérieur du cluster va chercher ce qu’il doit exécuter. Git devient le journal d’audit et l’interface du changement, y compris pour l’exploitation : mettre un service à l’échelle ou revenir en arrière est un commit relu ou un revert. La dérive est corrigée automatiquement, si bien qu’un kubectl edit manuel ne dure que jusqu’à la synchronisation suivante.

GitOps soulève ses propres questions de conception. Les secrets ne doivent pas se trouver en clair dans Git ; les équipes les chiffrent (SOPS, Sealed Secrets) ou stockent des références que l’External Secrets Operator résout à partir d’un gestionnaire de secrets. La promotion entre environnements demande une convention, par exemple un répertoire par environnement, avec des pull requests qui copient un nouveau digest d’image du staging vers la production. La correction automatique de la dérive doit être délibérément suspendue lors de certaines urgences, et la structure du dépôt doit refléter la responsabilité, afin que les équipes puissent modifier leurs propres services sans toucher à ceux des autres. GitOps est le plus naturel pour Kubernetes, mais les mêmes principes s’appliquent à l’infrastructure cloud via Crossplane ou via des pipelines qui planifient et appliquent le code d’infrastructure à partir de commits fusionnés.

Politique en tant que code (policy as code)

La politique en tant que code (policy as code) exprime les règles sur l’infrastructure sous forme de code vérifiable par machine au lieu d’une page de wiki : les buckets de stockage ne doivent pas être publics, les bases de données doivent être chiffrées et sauvegardées, chaque ressource doit porter une étiquette de responsable et de centre de coûts, seules les régions approuvées peuvent être utilisées, les conteneurs ne doivent pas s’exécuter en root, les images de production doivent provenir du registre de l’entreprise. Les vérifications s’exécutent à plusieurs moments : sur le plan dans la pull request (Open Policy Agent avec Conftest, Checkov, HashiCorp Sentinel dans ses produits commerciaux), à l’admission dans un cluster Kubernetes (OPA Gatekeeper, Kyverno) et en continu sur les ressources en fonctionnement (services de politiques des fournisseurs cloud).

La politique en tant que code fait passer la gouvernance d’une réunion de revue à un garde-fou rapide et cohérent qui s’explique de lui-même dans la pull request. Elle fonctionne au mieux quand les politiques sont peu nombreuses, clairement justifiées, versionnées et testées comme n’importe quel code, quand elles commencent en mode avertissement avant de bloquer, et quand il existe un processus d’exception documenté. Le chapitre 11 explique comment ces vérifications automatisées s’intègrent à la gouvernance de l’architecture (la gouvernance dans les organisations agiles).

Tester le code d’infrastructure, du plus rapide au plus lent

  1. Vérifications statiques à chaque commitLe formatage, validate, le linting (par exemple TFLint) et les scanners de sécurité détectent en quelques secondes les erreurs de syntaxe, les arguments obsolètes et les mauvaises configurations évidentes.
  2. Vérifications de politiques sur le planProduisez le plan en JSON et évaluez-le au regard des politiques de l’organisation ; les relecteurs voient les violations dans la pull request.
  3. Tests de modulesterraform test et tofu test exécutent des assertions sur un module, avec des providers simulés pour des tests rapides de type unitaire, ou réels pour des tests d’intégration.
  4. Tests d’intégration dans des environnements éphémèresAppliquez le module ou l’environnement dans un compte jetable, vérifiez qu’il fonctionne (une base de données accepte des connexions, un service répond), puis détruisez-le. Des outils comme Terratest automatisent cela ; c’est lent et cela coûte de l’argent, donc réservez-le aux modules partagés.
  5. Revue du plan et déploiement par étapesAppliquez d’abord en staging, puis en production, à partir des mêmes versions ; une personne lit chaque plan de production, en particulier les destructions et les remplacements.
  6. Détection de la dérive et exercices de restaurationDes plans exécutés à intervalles réguliers détectent la dérive ; reconstruire périodiquement un environnement à partir du code prouve que c’est le code, et non la mémoire, qui fait foi.

Liste de contrôle : un code d’infrastructure prêt pour la production

Utilisez-la pour relire le dépôt d’infrastructure d’une équipe ou un nouveau module de plateforme.

  • Tout est dans le codeAucune ressource de production n’existe simplement parce que quelqu’un a cliqué ; les ressources existantes créées à la main ont été importées.
  • État distant, verrouillé et chiffréBackend partagé avec verrouillage, gestion de versions et accès restreint ; état découpé par composant et par environnement pour limiter le rayon d’impact.
  • Plans relusChaque changement est une pull request qui montre le plan ; les destructions et remplacements de ressources avec état exigent une approbation explicite.
  • Modules versionnésLes environnements épinglent les versions des modules ; le staging et la production utilisent les mêmes modules avec des entrées différentes, pas des copies.
  • Politiques appliquées automatiquementLes règles de chiffrement, d’exposition réseau, d’étiquetage et de région sont vérifiées sur chaque plan et à l’admission dans le cluster.
  • Secrets tenus hors du code et de GitLes identifiants proviennent d’un gestionnaire de secrets ou de l’identité de charge de travail ; l’accès à l’état est traité comme un accès à des secrets.
  • Tests dans le pipelineVérifications statiques et vérifications de politiques à chaque changement ; tests de modules pour les modules partagés ; tests d’intégration pour les modules critiques.
  • Dérive détectée et traitéeDes plans exécutés à intervalles réguliers alertent sur les différences ; l’accès en écriture à la console est une procédure d’urgence (break-glass) enregistrée.
  • Immuable quand c’est possibleLes serveurs et les conteneurs sont remplacés à partir d’images au lieu d’être corrigés sur place ; la configuration se fait au moment de la construction de l’image.
  • Reprise testée en exerciceUn environnement a été reconstruit à partir du code dans le délai de reprise convenu, restauration des données comprise (voir la section 10.6).

Vérifiez votre compréhension

Pourquoi l’idempotence est-elle importante pour le code d’infrastructure ?

Parce que l’automatisation réexécute souvent le code. Un outil déclaratif et idempotent ne change rien quand la réalité correspond déjà au code, donc le réexécuter est sans risque ; un script non idempotent risque de tenter de tout recréer.

Citez trois choses qu’un plan compare, et ce que chacune représente.

Le code (ce qui devrait exister), l’état (ce que l’outil a créé et suit) et l’infrastructure réelle lue via l’API du fournisseur (ce qui existe vraiment).

Pourquoi l’état ne devrait-il pas être conservé dans un seul fichier pour toute une organisation ?

Un seul état signifie des plans lents, un verrou unique qui bloque toutes les équipes et un rayon d’impact qui couvre tout ; le découper par composant et par environnement garde les changements rapides et les défaillances contenues.

Quel avantage de sécurité le modèle pull de GitOps a-t-il sur un pipeline qui pousse vers le cluster ?

Le système de CI n’a besoin d’aucun identifiant de production, car un agent à l’intérieur du cluster récupère l’état souhaité dans Git et l’applique.

Quand la gestion de configuration reste-t-elle un bon choix ?

Pour les machines à longue durée de vie qui ne peuvent pas simplement être remplacées, comme les serveurs sur site et les équipements réseau, et pour configurer les images de base pendant leur construction.

Suivant · 10.5CI/CD et déploiementComment un changement va du commit à la production : étapes du pipeline, build once, deploy many, développement basé sur le tronc, déploiements progressifs, bleu-vert, canari et fantômes, feature flags, migrations et retour arrière.Continuer →

Sources et lectures complémentaires

Une question sur cette section ? ArchitectBot, l’assistant d’étude IA du cours, répond d’abord à partir du cours.

Demander : « Comment découper notre état Terraform ou OpenTofu pour la plateforme de livraison de repas, et comment empêcher les gens de faire des modifications dans la console ? »