Skill Terraform pour Claude
Guidance diagnostique d'abord pour Terraform et OpenTofu. Le fichier principal est un workflow ; la profondeur se charge à la demande dans les références.
Contrat de réponse
Toute réponse Terraform/OpenTofu doit inclure :
- Hypothèses et version minimale — runtime (
terraformoutofu), version exacte, providers, backend d'état, chemin d'exécution (local/CI/Cloud/Atlantis), criticité de l'environnement. Énoncez explicitement les hypothèses d'état si l'utilisateur ne les a pas fournies. - Catégorie de risque traitée — une ou plusieurs de : churn d'identité, exposition de secrets, rayon d'explosion, dérive CI, lacunes de conformité, corruption d'état, risque de mise à jour de provider, angles morts de test.
- Remédiation choisie et compromis — ce qui a été choisi, ce qui a été échangé, pourquoi.
- Plan de validation — commandes exactes (
fmt -check,validate,plan -out, vérification de politique) adaptées au runtime et au niveau de risque. - Notes de restauration — pour tout changement destructif ou mutant d'état : comment annuler, quelles preuves conserver.
Ne recommandez jamais un apply direct en production sans un artefact plan examiné et une approbation.
Ne lancez jamais terraform destroy (ciblé ou complet) sans d'abord exécuter terraform plan -destroy et montrer à l'utilisateur chaque ressource qui sera supprimée — incluant les dépendants implicites tirés via des locals ou for_each. Obtenez une confirmation explicite avant de procéder. N'utilisez jamais -auto-approve sur destroy.
Workflow
- Capturez le contexte d'exécution — runtime+version, provider(s), backend, chemin d'exécution, criticité de l'environnement.
- Diagnostiquez le(s) mode(s) de défaillance en utilisant la table de routage ci-dessous. Si l'intention s'étend sur plusieurs catégories, chargez les deux références.
- Chargez uniquement le(s) fichier(s) de référence correspondant(s) — ne préchargez pas la profondeur que la tâche ne nécessite pas.
- Proposez une correction avec contrôles de risque — pourquoi cela traite le mode, ce qui pourrait encore mal tourner, garde-fous (tests/approbations/restauration).
- Générez des artefacts — HCL, blocs de migration (
moved,import), changements CI, règles de politique. - Validez avant de finaliser — exécutez les commandes de validation adaptées au niveau de risque.
- Émettez le Contrat de réponse à la fin.
Diagnostiquer avant de générer
| Catégorie de défaillance | Symptômes | Références principales |
|---|---|---|
| Churn d'identité | Les adresses de ressources changent après refactorisation, churn d'index count, blocs moved manquants |
Code Patterns: count vs for_each, Code Patterns: moved blocks, Code Patterns: LLM mistakes |
| Exposition de secrets | Secrets dans les défauts, l'état, les logs, les artefacts CI | Security & Compliance, Code Patterns: write-only, State Management |
| Rayon d'explosion | Stacks surdimensionnés, état prod/non-prod partagé, applies non sécurisés | State Management, Module Patterns |
| Cascade de destruction | Destroy ciblé supprime plus que prévu ; les locals référençant une ressource ciblée rendent tous les consommateurs for_each des dépendants implicites |
Contrat de réponse : plan-destroy d'abord ; State Management: Safe Destroy |
| Dérive CI | Plan local ≠ plan CI, apply sans artefact examiné, versions non épinglées | CI/CD Workflows, Code Patterns: versions |
| Lacunes de conformité | Étape de politique manquante, pas de modèle d'approbation, pas de conservation de preuves | Security & Compliance, CI/CD Workflows |
| Angles morts de test | Validation plan uniquement des valeurs calculées, indexation de type set, confusion mock/réel | Testing Frameworks |
| Corruption/récupération d'état | Verrou bloqué, migration de backend, réconciliation de dérive | State Management |
| Risque de mise à jour de provider | Saut de version majeure de provider, modules non épinglés | Code Patterns: versions, Module Patterns |
| Cycle de vie du provider | Suppression d'un provider avec des ressources toujours en état, ressources orphelines, utilisation du bloc removed |
State Management: Provider Removal |
| Amorçage/mauvais usage d'orchestration | null_resource + local-exec pour amorçage, remote-exec pour scripts de setup, stdout de provisioner fuyant des secrets dans les logs CI |
Code Patterns: Provisioners as Last Resort |
| Navigation/angles morts de renommage sécurisé | Impossible de localiser les définitions/références de symboles sémantiquement, renommage valeur-symbole fait comme remplacement de texte aveugle, refactorisation grep-only manquant des références, shim rg halluciné |
Code Intelligence |
| Cross-cloud/mapping de provider | « Quel est l'équivalent Azure/GCP de X », choix d'un backend/modèle d'auth par cloud | State Management: Cross-cloud equivalents |
Quand utiliser cette Skill
Activez quand : création ou examen de configurations ou modules Terraform/OpenTofu, mise en place ou débogage de tests, structuration de déploiements multi-environnements, implémentation d'IaC CI/CD, choix de patterns de modules ou organisation d'état, configuration ou migration de backends d'état distants.
N'utilisez pas pour : questions de syntaxe HCL basiques que Claude connaît déjà, référence API de provider (lien vers les docs), questions de plateforme cloud non liées à Terraform/OpenTofu.
Principes fondamentaux
Hiérarchie des modules
| Type | Quand l'utiliser | Portée |
|---|---|---|
| Module de ressource | Groupe logique unique de ressources connectées | VPC + subnets, SG + règles |
| Module d'infrastructure | Collection de modules de ressources pour un objectif | Plusieurs modules de ressources dans une région/compte |
| Composition | Infrastructure complète | S'étend sur plusieurs régions/comptes |
Flux : ressource → module de ressource → module d'infrastructure → composition.
Disposition des répertoires
environments/ # prod/ staging/ dev/ — configurations par environnement
modules/ # networking/ compute/ data/ — modules réutilisables
examples/ # minimal/ complete/ — docs + fixtures d'intégration
Séparez les environnements des modules. Utilisez examples/ à la fois comme documentation et fixtures de test. Gardez les modules petits et responsabilité unique.
Voir Module Patterns pour les principes d'architecture, conventions de nommage, contrats variable/sortie.
Conventions de nommage (résumé)
- Noms de ressources descriptifs (
aws_instance.web_server, pasaws_instance.main) - Réservez
thispour les ressources singleton véritables uniquement - Préfixez les variables avec le contexte (
vpc_cidr_block, pascidr) - Fichiers standards :
main.tf,variables.tf,outputs.tf,versions.tf
Voir Module Patterns: Variable Naming et Code Patterns: Block Ordering pour les exemples.
Ordre des blocs (résumé)
Blocs de ressources : count/for_each en premier → arguments → tags → depends_on → lifecycle.
Blocs de variables : description → type → default → validation → nullable → sensitive.
Voir Code Patterns: Block Ordering & Structure pour les règles complètes et exemples.
Stratégie de test
Matrice de décision : Quelle approche de test ?
| Situation | Approche | Outils | Coût |
|---|---|---|---|
| Vérification syntaxe rapide | Analyse statique | validate, fmt |
Gratuit |
| Validation pré-commit | Statique + lint | validate, tflint, trivy, checkov |
Gratuit |
| Terraform 1.6+, logique simple | Framework de test natif | terraform test |
Gratuit-Faible |
| Pré-1.6, ou expertise Go | Test d'intégration | Terratest | Faible-Moyen |
| Focus sécurité/conformité | Policy as code | OPA, Sentinel | Gratuit |
| Workflow sensible aux coûts | Mock providers (1.7+) | Tests natifs + mocks | Gratuit |
| Multi-cloud, complexe | Intégration complète | Terratest + infra réelle | Moyen-Élevé |
Règles de test natif (1.6+)
Avant d'écrire le code de test : validez les schémas de ressources via Terraform MCP pour que les assertions ciblent les attributs réels.
command = plan— rapide, pour les valeurs dérivées d'entrée uniquementcommand = apply— requis pour les valeurs calculées (ARNs, noms générés) et les blocs imbriqués de type set- Les blocs de type set ne peuvent pas être indexés avec
[0]— utilisez les expressionsforou matérialisez viacommand = apply - Types de set courants : règles de chiffrement S3, transitions de cycle de vie, instructions de politique IAM
Voir Testing Frameworks pour les pipelines d'analyse statique, patterns de tests natifs, intégration Terratest, mock providers, et la liste de vérification complète des erreurs LLM.
Count vs For_each — Règle rapide
| Scénario | Utilisez | Pourquoi |
|---|---|---|
| Condition booléenne (créer / ne pas créer) | count = condition ? 1 : 0 |
Basculement singleton optionnel |
| Les éléments peuvent être réordonnés ou supprimés | for_each = toset(list) |
Adresses de ressources stables |
| Référence par clé | for_each = map |
Accès nommé |
| Plusieurs ressources nommées | for_each |
Meilleure stabilité d'identité |
Ne utilisez jamais l'index de liste comme identité de longue durée — supprimer un élément du milieu réordonne chaque adresse après lui. Pour la matrice de décision, le playbook de migration sécurisée, les patterns de bloc moved, et les cas d'échec connus lors du plan, voir Code Patterns: count vs for_each.
Locals pour la gestion des dépendances
Utiliser try() dans un local pour préférer l'attribut d'une ressource conditionnelle à son parent est un pattern spécialisé mais de haute valeur — il force un ordre de suppression correct sans depends_on explicite. Usage courant : VPC + associations CIDR secondaires + subnets.
Voir Code Patterns: Locals for Dependency Management pour le pattern complet et l'exemple travaillé.
Développement de modules
Disposition standard :
my-module/
├── README.md # Documentation d'utilisation
├── main.tf # Ressources principales
├── variables.tf # Entrées typées avec descriptions
├── outputs.tf # Valeurs de sortie
├── versions.tf # required_version + required_providers
├── examples/
│ ├── minimal/
│ └── complete/
└── tests/
└── module_test.tftest.hcl # ou Go pour Terratest
Contrats de variables : toujours description, toujours type explicite, utilisez validation pour les contraintes complexes, utilisez sensitive = true pour les secrets, préférez optional() avec défauts typés (1.3+) à map(any) non typé.
Contrats de sorties : toujours description, marquez les sorties sensibles, exposez des sous-ensembles stables (pas d'objets provider entiers).
Voir Module Patterns pour les patterns de contrat complets, liste de vérification de publication de module, et liste de vérification des erreurs LLM.
CI/CD
Étapes du pipeline : validate → test → plan → apply (avec protection d'environnement).
Contrôle des coûts : mock providers sur validation PR, intégration cloud réelle uniquement sur main ou programmée, taggez les ressources de test, nettoyage automatique.
Prévention de la dérive : épinglez le runtime et les providers, committez .terraform.lock.hcl, appliquez l'artefact plan examiné de l'étape plan (ne relancez pas plan dans le job d'apply), exécutez l'étape politique/sécurité sur chaque chemin vers apply.
Voir CI/CD Workflows pour les modèles GitHub Actions, GitLab CI et Atlantis plus la liste de vérification des erreurs LLM.
Sécurité et conformité
Vérifications essentielles :
trivy config .
checkov -d .
Ne pas : stocker les secrets dans les variables ou .tfvars, utiliser le VPC par défaut, ignorer le chiffrement, ouvrir les groupes de sécurité à 0.0.0.0/0, utiliser les blocs ingress/egress inline dans aws_security_group.
Faire : sourcer les secrets d'un gestionnaire de secrets cloud (AWS Secrets Manager / Azure Key Vault / GCP Secret Manager) ou utiliser des arguments write_only sur 1.11+, créer des VPCs dédiés, appliquer le chiffrement au repos et TLS, groupes de sécurité avec privilèges minimums, utiliser des ressources aws_vpc_security_group_{ingress,egress}_rule séparées (p. ex. AWS provider v5+).
Marquer une variable sensitive = true masque l'affichage uniquement — la valeur vit toujours en état. Utilisez write_only / *_wo sur 1.11+, ou gardez le matériel secret entièrement hors de Terraform via des recherches d'exécution.
Voir Security & Compliance pour les pipelines trivy/checkov, durcissement des fichiers d'état, mappages de conformité, et la liste de vérification des erreurs LLM.
Gestion d'état
Ne utilisez jamais l'état local en équipes ou en production. Les backends distants fournissent le verrouillage automatique, le chiffrement, le versioning, la journalisation d'audit, et la collaboration sécurisée.
Choix d'un backend distant
Exemple AWS (Azure azurerm / GCP gcs / syntaxe TF Cloud : voir State Management: Choosing a Remote Backend) :
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "prod/vpc/terraform.tfstate"
region = "us-east-1"
encrypt = true
use_lockfile = true # Verrouillage S3 natif, 1.10+
}
}
Sur Terraform < 1.10, utilisez dynamodb_table = "terraform-state-lock" à la place de use_lockfile. Azure Storage, GCS et Terraform Cloud offrent tous un verrouillage intégré - voir la référence State Management pour la syntaxe. Pour choisir entre les backends et leurs modèles de verrouillage, voir Choosing a Remote Backend.
Organisation d'état
| Pattern | À utiliser quand | Chemin exemple |
|---|---|---|
| Par environnement | Différentes équipes par env | prod/terraform.tfstate, staging/... |
| Par composant | Cycles de vie indépendants | prod/vpc/, prod/eks/, prod/rds/ |
| Hybride (recommandé) | Les deux bénéfices | prod/networking/, prod/compute/, staging/networking/ |
Divisez l'état quand : différentes équipes, différents rythmes de mise à jour, ou >500 ressources. Combinez quand : ressources étroitement couplées, <100 ressources, même cycle de vie.
Voir State Management pour le verrouillage, la migration, l'isolation multi-équipes, la récupération d'urgence, et la liste de vérification des erreurs LLM.
Gestion des versions
| Composant | Stratégie | Exemple |
|---|---|---|
| Runtime Terraform | Épinglez le mineur | required_version = "~> 1.9" |
| Providers | Épinglez la majeure | version = "~> 5.0" |
| Modules (prod) | Épinglez exactement | version = "5.1.2" |
| Modules (dev) | Autorisez le patch | version = "~> 5.1" |
Committez .terraform.lock.hcl intentionnellement. Gardez les mises à jour de provider/runtime dans une PR séparée des changements fonctionnels. Voir Code Patterns: Version Management pour la syntaxe de contrainte et le workflow de mise à jour.
Fonctionnalités Terraform modernes (1.0+)
| Fonctionnalité | Version min | Usage courant |
|---|---|---|
try() |
0.13+ | Replis sécurisés, remplace element(concat()) |
nullable = false |
1.1+ | Prévient null écrasant silencieusement les défauts |
Blocs moved |
1.1+ | Refactorisation sans destroy/recréation |
optional() avec défauts |
1.3+ | Attributs d'objet typés |
Blocs import |
1.5+ | Imports déclaratifs, révisables dans VCS |
Blocs check |
1.5+ | Assertions à l'exécution |
Test natif terraform test |
1.6+ | Framework de test intégré |
| Mock providers | 1.7+ | Tests unitaires sans coûts |
Blocs removed |
1.7+ | Suppression de ressources déclarative |
| Fonctions définies par provider | 1.8+ | Transformations spécifiques au provider (nécessite que le provider déclare les fonctions) |
| Validation cross-variable | 1.9+ | Référencez d'autres var.* dans les blocs validation |
Arguments write_only |
1.11+ | Secrets jamais stockés en état |
| Fichier de verrou S3 natif | 1.10+ | Verrouillage d'état sans DynamoDB |
Avant d'émettre une fonctionnalité, vérifiez le plancher du runtime. Voir Code Patterns: Feature Guard Table pour la table complète avec les patterns d'erreur LLM courants par fonctionnalité.
Guidance spécifique au runtime
- Terraform 1.0-1.5 (OpenTofu démarre à 1.6) : Terratest pour l'intégration, analyse statique + validation plan uniquement (pas de tests natifs).
- 1.6+ : test natif
terraform test/tofu testdisponible — migrez les tests unitaires simples, gardez Terratest pour l'intégration complexe. - 1.7+ : mock providers réduisent les coûts de test — mock pour les tests unitaires, exécutions réelles pour l'intégration finale.
- 1.10+ : le fichier de verrou S3 natif (
use_lockfile) est le défaut correct pour les nouvelles configurations — le verrouillage DynamoDB n'est plus requis. - 1.11+ : les arguments
write_onlypour la gestion des secrets gardent les credentials hors de l'état. - Terraform vs OpenTofu : tous deux supportés. Pour les licences, gouvernance, et delta de fonctionnalités, voir Quick Reference: Terraform vs OpenTofu.
Code Intelligence (terraform-ls)
Navigation sémantique pour HCL. terraform-ls est optionnel ; sans lui, chaque ligne ci-dessous dégénère en rg fourni + repli Read.
Couche terraform-ls auto-contenue d'une discipline de code-intelligence générique - appliquez les lignes ci-dessous directement. Compagnon recommandé : le plugin code-intelligence (même marketplace antonbabenko/agent-plugins) porte la discipline générique (ancrage de position, portail de dégradation, format de divulgation, anti-shim fantôme) et expédie /code-intelligence:doctor pour la préparation. S'il est installé, déférez à son protocole générique ; cette skill reste entièrement auto-contenue sans lui.
| Objectif | Utilisez | Compromis |
|---|---|---|
| Trouver la définition / toutes les références | terraform-ls goToDefinition / findReferences |
Nécessite init + une position ancrée |
| Renommer un symbole valeur (var/local/output/alias provider) | Manuel : findReferences -> lecture fraîche par fichier -> éditer -> validate |
Pas de provider de renommage |
| Renommer une adresse ressource/module | Bloc moved + plan montre 0 destroy |
Renommage texte force destroy/recréation |
Texte exact / nom connu / .tfvars / non-HCL |
rg + Read |
Pas de portée sémantique |
✅ Supportés : goToDefinition, findReferences, documentSymbol, hover, workspaceSymbol.
❌ Non supportés : goToImplementation, hiérarchie d'appel, renommer provider. N'appelez pas ces éléments puis rapportez leur absence comme une constatation.
- ✅ Prérequis :
terraform/tofulocal sur PATH,terraform initexécuté ; le démarrage à froid peut nécessiter une nouvelle tentative. - ✅ Les appels LSP sont ancrés par position (
file:line:character) - ancrez avecrgd'abord, jamais nom-symbole uniquement. - ❌ Ne prétendez pas « LSP cassé, utilisant rg » jusqu'à ce que le Degradation Gate passe ; divulguez toute substitution d'outil sur la première ligne.
Profondeur : Code Intelligence.
Fichiers de référence
Divulgation progressive — essentiels ici, profondeur à la demande :
- Testing Frameworks — analyse statique, tests natifs, Terratest, mock providers
- Module Patterns — structure, contrats variable/sortie, règles
terraform_remote_state, liste de vérification de publication - CI/CD Workflows — GitHub Actions, GitLab CI, Atlantis, contrôle des coûts
- Security & Compliance — trivy/checkov, gestion des secrets, mappages de conformité
- State Management — backends, verrouillage, migration, multi-équipes, récupération
- Code Patterns — ordre des blocs, deep dive count/for_each, fonctionnalités modernes, gestion des versions, locals
- Code Intelligence - capacités terraform-ls, appels ancrés par position, renommage manuel, portail de dégradation
- Quick Reference — pense-bête de commandes, organigrammes, dépannage
Licence
Apache License 2.0. Voir LICENSE pour les conditions complètes.
Copyright © 2026 Anton Babenko