Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Bonnes pratiques pour la structure et l'organisation de la base de code
Une structure et une organisation de base de code appropriées sont essentielles car l'utilisation de Terraform augmente au sein des grandes équipes et entreprises. Une base de code bien conçue permet une collaboration à grande échelle tout en améliorant la maintenabilité.
Cette section fournit des recommandations sur la modularité de Terraform, les conventions de dénomination, la documentation et les normes de codage qui favorisent la qualité et la cohérence.
Les conseils incluent la division de la configuration en modules réutilisables par environnement et par composant, l'établissement de conventions de dénomination à l'aide de préfixes et de suffixes, la documentation des modules et l'explication claire des entrées et des sorties, et l'application de règles de formatage cohérentes à l'aide de contrôles de style automatisés.
Les meilleures pratiques supplémentaires concernent l'organisation logique des modules et des ressources dans une hiérarchie structurée, le catalogage des modules publics et privés dans la documentation et l'extraction des détails de mise en œuvre inutiles dans les modules afin de simplifier l'utilisation.
En mettant en œuvre des directives relatives à la structure de base du code relatives à la modularité, à la documentation, aux normes et à l'organisation logique, vous pouvez favoriser une large collaboration entre les équipes tout en garantissant la maintenance de Terraform à mesure que l'utilisation se répand au sein de l'organisation. En appliquant les conventions et les normes, vous pouvez éviter la complexité d'une base de code fragmentée.
Bonnes pratiques :
Implémenter une structure de référentiel standard
Nous vous recommandons d'implémenter la disposition de référentiel suivante. La normalisation de ces pratiques de cohérence entre les modules améliore la découvrabilité, la transparence, l'organisation et la fiabilité tout en permettant la réutilisation dans de nombreuses configurations Terraform.
-
Module ou répertoire racine : il doit être le point d'entrée principal pour les modules racine
et réutilisables de Terraform et devrait être unique. Si votre architecture est plus complexe, vous pouvez utiliser des modules imbriqués pour créer des abstractions légères. Cela vous permet de décrire l'infrastructure en termes d'architecture plutôt que directement en termes d'objets physiques. -
README : le module racine et tous les modules imbriqués doivent contenir des fichiers README. Ce fichier doit être nommé
README.md
. Il doit contenir une description du module et de son utilisation. Si vous souhaitez inclure un exemple d'utilisation de ce module avec d'autres ressources, placez-le dans unexamples
répertoire. Envisagez d'inclure un diagramme qui décrit les ressources d'infrastructure que le module peut créer et leurs relations. Utilisez terraform-docspour générer automatiquement les entrées ou les sorties du module. -
main.tf : C'est le point d'entrée principal. Pour un module simple, toutes les ressources peuvent être créées dans ce fichier. Pour un module complexe, la création de ressources peut être répartie sur plusieurs fichiers, mais tous les appels de modules imbriqués doivent figurer dans le
main.tf
fichier. -
variables.tf et outputs.tf : ces fichiers contiennent les déclarations des variables et des sorties. Toutes les variables et sorties doivent être décrites en une ou deux phrases expliquant leur objectif. Ces descriptions sont utilisées pour la documentation. Pour plus d'informations, consultez la HashiCorp documentation relative à la configuration des variables
et à la configuration de sortie . -
Toutes les variables doivent avoir un type défini.
-
La déclaration de variable peut également inclure un argument par défaut. Si la déclaration inclut un argument par défaut, la variable est considérée comme facultative et la valeur par défaut est utilisée si vous ne définissez aucune valeur lorsque vous appelez le module ou exécutez Terraform. L'argument par défaut nécessite une valeur littérale et ne peut pas faire référence à d'autres objets de la configuration. Pour rendre une variable obligatoire, omettez une valeur par défaut dans la déclaration de variable et déterminez si le réglage
nullable = false
est judicieux. -
Pour les variables dont les valeurs sont indépendantes de l'environnement (telles que
disk_size
), fournissez des valeurs par défaut. -
Pour les variables qui ont des valeurs spécifiques à l'environnement (telles que
project_id
), ne fournissez pas de valeurs par défaut. Dans ce cas, le module d'appel doit fournir des valeurs significatives. -
Utiliser des valeurs par défaut vides pour des variables telles que des chaînes ou des listes vides uniquement lorsque le fait de laisser la variable vide est une préférence valide que les API sous-jacentes ne rejettent pas.
-
Utilisez judicieusement les variables. Paramétrez les valeurs uniquement si elles doivent varier pour chaque instance ou environnement. Lorsque vous décidez d'exposer une variable, assurez-vous de disposer d'un cas d'utilisation concret pour modifier cette variable. S'il n'y a qu'une faible chance qu'une variable soit nécessaire, ne l'exposez pas.
-
L'ajout d'une variable avec une valeur par défaut est rétrocompatible.
-
La suppression d'une variable est rétroincompatible.
-
Dans les cas où un littéral est réutilisé à plusieurs endroits, vous devez utiliser une valeur locale sans l'exposer en tant que variable.
-
-
Ne transmettez pas les sorties directement via les variables d'entrée, car cela les empêcherait d'être correctement ajoutées au graphe de dépendance. Pour garantir la création de dépendances implicites
, assurez-vous que les sorties font référence aux attributs des ressources. Au lieu de référencer directement une variable d'entrée pour une instance, transmettez l'attribut.
-
-
locals.tf : Ce fichier contient des valeurs locales qui attribuent un nom à une expression. Un nom peut donc être utilisé plusieurs fois dans un module au lieu de répéter l'expression. Les valeurs locales sont similaires aux variables locales temporaires d'une fonction. Les expressions contenues dans les valeurs locales ne se limitent pas à des constantes littérales ; elles peuvent également faire référence à d'autres valeurs du module, notamment des variables, des attributs de ressources ou d'autres valeurs locales, afin de les combiner.
-
providers.tf : Ce fichier contient le bloc terraform
et les blocs fournisseur. provider
les blocs doivent être déclarés uniquement dans les modules racines par les consommateurs de modules.Si vous utilisez HCP Terraform, ajoutez également un bloc cloud vide.
Le cloud
bloc doit être entièrement configuré via des variables d'environnement et des informations d'identification de variablesd'environnement dans le cadre d'un pipeline CI/CD. -
versions.tf : Ce fichier contient le bloc required_providers
. Tous les modules Terraform doivent déclarer les fournisseurs dont ils ont besoin pour que Terraform puisse installer et utiliser ces fournisseurs. -
data.tf : Pour une configuration simple, placez les sources de données
à côté des ressources qui les référencent. Par exemple, si vous récupérez une image à utiliser lors du lancement d'une instance, placez-la à côté de l'instance au lieu de collecter les ressources de données dans leur propre fichier. Si le nombre de sources de données devient trop important, envisagez de les déplacer vers un data.tf
fichier dédié. -
Fichiers .tfvars : pour les modules root, vous pouvez fournir des variables non sensibles à l'aide d'un fichier.
.tfvars
Pour des raisons de cohérence, nommez les fichiers variablesterraform.tfvars
. Placez les valeurs communes à la racine du référentiel et les valeurs spécifiques à l'environnement dans leenvs/
dossier. -
Modules imbriqués : les modules imbriqués doivent exister dans le
modules/
sous-répertoire. Tout module imbriqué doté d'unREADME.md
est considéré comme utilisable par un utilisateur externe. Si unREADME.md
n'existe pas, le module est considéré pour un usage interne uniquement. Les modules imbriqués doivent être utilisés pour diviser un comportement complexe en plusieurs petits modules que les utilisateurs peuvent sélectionner avec soin.Si le module racine inclut des appels à des modules imbriqués, ces appels doivent utiliser des chemins relatifs, de
./modules/sample-module
manière à ce que Terraform les considère comme faisant partie du même référentiel ou package au lieu de les télécharger à nouveau séparément.Si un dépôt ou un package contient plusieurs modules imbriqués, ils devraient idéalement être composables par l'appelant au lieu de s'appeler directement et de créer une arborescence de modules profondément imbriquée.
-
Exemples : des exemples d'utilisation d'un module réutilisable doivent se trouver dans le
examples/
sous-répertoire à la racine du dépôt. Pour chaque exemple, vous pouvez ajouter un fichier README pour expliquer l'objectif et l'utilisation de l'exemple. Les exemples de sous-modules doivent également être placés dans leexamples/
répertoire racine.Comme les exemples sont souvent copiés dans d'autres référentiels à des fins de personnalisation, la source des blocs de modules doit être définie sur l'adresse qu'un appelant externe utiliserait, et non sur un chemin relatif.
-
Fichiers nommés par le service : les utilisateurs souhaitent souvent séparer les ressources Terraform par service dans plusieurs fichiers. Cette pratique devrait être découragée autant que possible et les ressources devraient
main.tf
plutôt être définies. Toutefois, si un ensemble de ressources (par exemple, les rôles et les politiques IAM) dépasse 150 lignes, il est raisonnable de le diviser en ses propres fichiers, tels queiam.tf
. Dans le cas contraire, tout le code de ressource doit être défini dans lemain.tf
. -
Scripts personnalisés : utilisez des scripts uniquement lorsque cela est nécessaire. Terraform ne prend pas en compte ni ne gère l'état des ressources créées par le biais de scripts. Utilisez des scripts personnalisés uniquement lorsque les ressources Terraform ne prennent pas en charge le comportement souhaité. Placez les scripts personnalisés appelés par Terraform dans un
scripts/
répertoire. -
Scripts d'assistance : organisez les scripts d'assistance qui ne sont pas appelés par Terraform dans un répertoire.
helpers/
Documentez des scripts d'assistance dans leREADME.md
fichier avec des explications et des exemples d'invocations. Si les scripts d'assistance acceptent des arguments, fournissez une vérification des arguments et une--help
sortie. -
Fichiers statiques : les fichiers statiques auxquels Terraform fait référence mais n'exécute pas (tels que les scripts de démarrage chargés sur les instances EC2) doivent être organisés dans un répertoire.
files/
Placez les longs documents dans des fichiers externes, séparés de leur HCL. Référencez-les à l'aide de la fonction file (). -
Modèles : pour les fichiers que la fonction Templatefile de Terraform lit, utilisez l'extension de fichier
. .tftpl
Les modèles doivent être placés dans untemplates/
répertoire.
Structure du module racine
Terraform s'exécute toujours dans le contexte d'un seul module racine. Une configuration Terraform complète comprend un module racine et l'arborescence des modules enfants (qui inclut les modules appelés par le module racine, tous les modules appelés par ces modules, etc.).
Exemple de base de la disposition du module racine Terraform :
. ├── data.tf ├── envs │ ├── dev │ │ └── terraform.tfvars │ ├── prod │ │ └── terraform.tfvars │ └── test │ └── terraform.tfvars ├── locals.tf ├── main.tf ├── outputs.tf ├── providers.tf ├── README.md ├── terraform.tfvars ├── variables.tf └── versions.tf
Structure de module réutilisable
Les modules réutilisables suivent les mêmes concepts que les modules racines. Pour définir un module, créez un nouveau répertoire pour celui-ci et placez-y les .tf
fichiers, comme vous définiriez un module racine. Terraform peut charger des modules soit à partir de chemins relatifs locaux, soit à partir de référentiels distants. Si vous vous attendez à ce qu'un module soit réutilisé par de nombreuses configurations, placez-le dans son propre référentiel de contrôle de version. Il est important de garder l'arborescence des modules relativement plate pour faciliter la réutilisation des modules dans différentes combinaisons.
Exemple de base de disposition de module réutilisable Terraform :
. ├── data.tf ├── examples │ ├── multi-az-new-vpc │ │ ├── data.tf │ │ ├── locals.tf │ │ ├── main.tf │ │ ├── outputs.tf │ │ ├── providers.tf │ │ ├── README.md │ │ ├── terraform.tfvars │ │ ├── variables.tf │ │ ├── versions.tf │ │ └── vpc.tf │ └── single-az-existing-vpc │ │ ├── data.tf │ │ ├── locals.tf │ │ ├── main.tf │ │ ├── outputs.tf │ │ ├── providers.tf │ │ ├── README.md │ │ ├── terraform.tfvars │ │ ├── variables.tf │ │ └── versions.tf ├── iam.tf ├── locals.tf ├── main.tf ├── outputs.tf ├── README.md ├── variables.tf └── versions.tf
Structure pour la modularité
En principe, vous pouvez combiner toutes les ressources et autres constructions dans un module, mais l'utilisation excessive de modules imbriqués et réutilisables peut rendre votre configuration globale de Terraform plus difficile à comprendre et à maintenir. Utilisez donc ces modules avec modération.
Lorsque cela est logique, divisez votre configuration en modules réutilisables qui augmentent le niveau d'abstraction en décrivant un nouveau concept de votre architecture construit à partir de types de ressources.
Lorsque vous modularisez votre infrastructure en définitions réutilisables, privilégiez des ensembles logiques de ressources plutôt que des composants individuels ou des collections trop complexes.
N'encapsulez pas des ressources uniques
Vous ne devez pas créer de modules qui constituent des enveloppes fines autour d'autres types de ressources uniques. Si vous ne parvenez pas à trouver un nom différent du nom du type de ressource principal qu'il contient, votre module ne crée probablement pas de nouvelle abstraction, cela ajoute une complexité inutile. Utilisez plutôt le type de ressource directement dans le module d'appel.
Encapsuler les relations logiques
Regroupez des ensembles de ressources connexes telles que les bases du réseau, les niveaux de données, les contrôles de sécurité et les applications. Un module réutilisable doit encapsuler des éléments d'infrastructure qui fonctionnent ensemble pour activer une fonctionnalité.
Maintenir un héritage stable
Lorsque vous imbriquez des modules dans des sous-répertoires, évitez d'aller à plus d'un ou deux niveaux de profondeur. Les structures d'héritage profondément imbriquées compliquent les configurations et le dépannage. Les modules doivent s'appuyer sur d'autres modules, et non créer des tunnels à travers eux.
En concentrant les modules sur des groupements de ressources logiques qui représentent des modèles d'architecture, les équipes peuvent rapidement configurer des bases d'infrastructure fiables. Équilibrez l'abstraction sans suringénierie ou simplification.
Ressources de référence dans les sorties
Pour chaque ressource définie dans un module réutilisable, incluez au moins une sortie qui fait référence à la ressource. Les variables et les sorties vous permettent de déduire les dépendances entre les modules et les ressources. Sans aucune sortie, les utilisateurs ne peuvent pas commander correctement votre module par rapport à leurs configurations Terraform.
Des modules bien structurés qui assurent la cohérence de l'environnement, des regroupements axés sur des objectifs et des références de ressources exportées permettent une collaboration Terraform à grande échelle à l'échelle de l'organisation. Les équipes peuvent assembler l'infrastructure à partir de blocs de construction réutilisables.
Ne configurez pas les fournisseurs
Bien que les modules partagés héritent des fournisseurs des modules appelants, les modules ne doivent pas configurer eux-mêmes les paramètres des fournisseurs. Évitez de spécifier des blocs de configuration du fournisseur dans les modules. Cette configuration ne doit être déclarée qu'une seule fois globalement.
Déclarer les fournisseurs requis
Bien que les configurations des fournisseurs soient partagées entre les modules, les modules partagés doivent également déclarer leurs propres exigences en matière de fournisseur
En déclarant les exigences de version et en évitant la configuration codée en dur des fournisseurs, les modules assurent la portabilité et la réutilisabilité entre les configurations Terraform à l'aide de fournisseurs partagés.
Pour les modules partagés, définissez les versions de fournisseur minimales requises dans un bloc required_providersversions.tf
Pour déclarer qu'un module nécessite une version particulière du AWS fournisseur, utilisez un required_providers
bloc à l'intérieur d'un terraform
bloc :
terraform { required_version = ">= 1.0.0" required_providers { aws = { source = "hashicorp/aws" version = ">= 4.0.0" } } }
Si un module partagé ne prend en charge qu'une version spécifique du AWS fournisseur, utilisez l'opérateur de contrainte pessimiste (~>
), qui autorise uniquement l'incrémentation du composant de version le plus à droite :
terraform { required_version = ">= 1.0.0" required_providers { aws = { source = "hashicorp/aws" version = "~> 4.0" } } }
Dans cet exemple, ~> 4.0
autorise l'installation de 4.57.1
et 4.67.0
mais non5.0.0
. Pour plus d'informations, consultez la section Syntaxe des contraintes de version
Respectez les conventions de dénomination
Des noms clairs et descriptifs simplifient votre compréhension des relations entre les ressources du module et l'objectif des valeurs de configuration. La cohérence avec les directives de style améliore la lisibilité tant pour les utilisateurs du module que pour les responsables de la maintenance.
Suivez les directives relatives à la dénomination des ressources
-
Utilisez snake_case (où les termes minuscules sont séparés par des traits de soulignement) pour que tous les noms de ressources correspondent aux normes de style Terraform. Cette pratique garantit la cohérence avec la convention de dénomination des types de ressources, des types de sources de données et des autres valeurs prédéfinies. Cette convention ne s'applique pas aux arguments relatifs aux noms
. -
Pour simplifier les références à une ressource unique en son genre (par exemple, un équilibreur de charge unique pour un module entier), nommez la ressource
main
outhis
pour plus de clarté. -
Utilisez des noms significatifs qui décrivent l'objectif et le contexte de la ressource, et qui permettent de différencier les ressources similaires (par exemple,
primary
pour la base de données principale etread_replica
pour une réplique en lecture de la base de données). -
Utilisez des noms au singulier et non au pluriel.
-
Ne répétez pas le type de ressource dans le nom de la ressource.
Suivez les directives relatives à la dénomination des variables
-
Ajoutez des unités aux noms des entrées, des variables locales et des sorties qui représentent des valeurs numériques telles que la taille du disque ou la taille de la RAM (par exemple,
ram_size_gb
pour la taille de la RAM en gigaoctets). Cette pratique indique clairement l'unité d'entrée attendue pour les responsables de la configuration. -
Utilisez des unités binaires telles que MiB et GiB pour les tailles de stockage, et des unités décimales telles que Mo ou Go pour les autres métriques.
-
Donnez aux variables booléennes des noms positifs tels que.
enable_external_access
Utiliser les ressources relatives aux pièces jointes
Certaines ressources contiennent des pseudo-ressources intégrées sous forme d'attributs. Dans la mesure du possible, évitez d'utiliser ces attributs de ressource intégrés et utilisez plutôt la ressource unique pour associer cette pseudo-ressource. Ces relations entre les ressources peuvent entraîner des cause-and-effect problèmes propres à chaque ressource.
En utilisant un attribut intégré (évitez ce modèle) :
resource "aws_security_group" "allow_tls" { ... ingress { description = "TLS from VPC" from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = [aws_vpc.main.cidr_block] ipv6_cidr_blocks = [aws_vpc.main.ipv6_cidr_block] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] ipv6_cidr_blocks = ["::/0"] } }
Utilisation des ressources de pièces jointes (de préférence) :
resource "aws_security_group" "allow_tls" { ... } resource "aws_security_group_rule" "example" { type = "ingress" description = "TLS from VPC" from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = [aws_vpc.main.cidr_block] ipv6_cidr_blocks = [aws_vpc.main.ipv6_cidr_block] security_group_id = aws_security_group.allow_tls.id }
Utiliser les balises par défaut
Attribuez des balises à toutes les ressources qui peuvent accepter des balises. Le AWS fournisseur Terraform dispose d'une source de données aws_default_tags
Envisagez d'ajouter les balises nécessaires à toutes les ressources créées par un module Terraform. Voici une liste des balises que vous pouvez associer :
-
Nom : nom de ressource lisible par l'homme
-
AppId: ID de l'application qui utilise la ressource
-
AppRole: fonction technique de la ressource ; par exemple, « serveur Web » ou « base de données »
-
AppPurpose: objectif commercial de la ressource ; par exemple, « interface utilisateur frontale » ou « processeur de paiement »
-
Environnement : environnement logiciel, tel que dev, test ou prod
-
Projet : Les projets qui utilisent la ressource
-
CostCenter: Qui facturer pour l'utilisation des ressources
Répondez aux exigences du registre Terraform
Un référentiel de modules doit répondre à toutes les exigences suivantes pour pouvoir être publié dans un registre Terraform.
Vous devez toujours respecter ces exigences, même si vous ne prévoyez pas de publier le module dans un registre à court terme. Ce faisant, vous pouvez publier le module dans un registre ultérieurement sans avoir à modifier la configuration et la structure du référentiel.
-
Nom du référentiel : pour un référentiel de modules, utilisez le nom en trois parties
terraform-aws-<NAME>
, où<NAME>
reflète le type d'infrastructure géré par le module. Le<NAME>
segment peut contenir des traits d'union supplémentaires (par exemple,terraform-aws-iam-terraform-roles
). -
Structure de module standard : le module doit respecter la structure de référentiel standard. Cela permet au registre d'inspecter votre module et de générer de la documentation, de suivre l'utilisation des ressources, etc.
-
Après avoir créé le dépôt Git, copiez les fichiers du module à la racine du dépôt. Nous vous recommandons de placer chaque module destiné à être réutilisable à la racine de son propre référentiel, mais vous pouvez également référencer des modules à partir de sous-répertoires.
-
Si vous utilisez HCP Terraform, publiez les modules destinés à être partagés dans le registre de votre organisation. Le registre gère les téléchargements et contrôle l'accès à l'aide de jetons d'API HCP Terraform, de sorte que les consommateurs n'ont pas besoin d'accéder au référentiel source du module, même lorsqu'ils exécutent Terraform depuis la ligne de commande.
-
-
Emplacement et autorisations : le référentiel doit se trouver dans l'un de vos fournisseurs de système de contrôle de version (VCS)
configuré, et le compte utilisateur HCP Terraform VCS doit disposer d'un accès administrateur au référentiel. Le registre a besoin d'un accès administrateur pour créer les webhooks permettant d'importer de nouvelles versions de modules. -
balises x.y.z pour les versions : au moins une balise de version doit être présente pour que vous puissiez publier un module. Le registre utilise des balises de version pour identifier les versions des modules. Les noms des balises de version doivent utiliser le versionnement sémantique
, que vous pouvez éventuellement préfixer par un v
(par exemple,v1.1.0
et).1.1.0
Le registre ignore les balises qui ne ressemblent pas à des numéros de version. Pour plus d'informations sur les modules de publication, consultez la documentation Terraform.
Pour plus d'informations, consultez Préparation d'un référentiel de modules
Utiliser les sources de modules recommandées
Terraform utilise l'source
argument d'un bloc de module pour rechercher et télécharger le code source d'un module enfant.
Nous vous recommandons d'utiliser des chemins locaux pour les modules étroitement liés dont l'objectif principal est de factoriser les éléments de code répétés, et d'utiliser un registre de modules Terraform natif ou un fournisseur VCS pour les modules destinés à être partagés par plusieurs configurations.
Les exemples suivants illustrent les types de sources
Registre
Registre Terraform :
module "lambda" { source = "github.com/terraform-aws-modules/terraform-aws-lambda.git?ref=e78cdf1f82944897ca6e30d6489f43cf24539374" #--> v4.18.0 ... }
En épinglant les hachages de validation, vous pouvez éviter de dériver des registres publics vulnérables aux attaques de la chaîne d'approvisionnement.
HCP Terraform :
module "eks_karpenter" { source = "app.terraform.io/my-org/eks/aws" version = "1.1.0" ... enable_karpenter = true }
Terraform Entreprise :
module "eks_karpenter" { source = "terraform.mydomain.com/my-org/eks/aws" version = "1.1.0" ... enable_karpenter = true }
Fournisseurs de VCS
Les fournisseurs de VCS soutiennent l'ref
argument en faveur de la sélection d'une révision spécifique, comme le montrent les exemples suivants.
GitHub (HTTPS) :
module "eks_karpenter" { source = "github.com/my-org/terraform-aws-eks.git?ref=v1.1.0" ... enable_karpenter = true }
Dépôt Git générique (HTTPS) :
module "eks_karpenter" { source = "git::https://example.com/terraform-aws-eks.git?ref=v1.1.0" ... enable_karpenter = true }
Dépôt Git générique (SSH) :
Avertissement
Vous devez configurer les informations d'identification pour accéder aux référentiels privés.
module "eks_karpenter" { source = "git::ssh://username@example.com/terraform-aws-eks.git?ref=v1.1.0" ... enable_karpenter = true }
Respectez les normes de codage
Appliquez des règles et des styles de formatage Terraform cohérents à tous les fichiers de configuration. Appliquez les normes en utilisant des contrôles de style automatisés dans les pipelines CI/CD. Lorsque vous intégrez les meilleures pratiques de codage dans les flux de travail d'équipe, les configurations restent lisibles, maintenables et collaboratives, car leur utilisation se répand largement au sein de l'organisation.
Suivez les directives de style
-
Formatez tous les fichiers Terraform (
.tf
fichiers) avec la commande terraform fmtconformément aux normes de style. HashiCorp -
Utilisez la commande terraform validate
pour vérifier la syntaxe et la structure de votre configuration. -
Analysez statiquement la qualité du code à l'aide de TFlint
. Ce linter vérifie les meilleures pratiques de Terraform au-delà du simple formatage et échoue aux builds lorsqu'il rencontre des erreurs.
Configurer les hooks de pré-validation
Configurez des hooks de pré-validation côté client qui exécutentterraform fmt
, tflint
checkov
, et d'autres analyses de code et vérifications de style avant d'autoriser les validations. Cette pratique vous permet de valider la conformité aux normes plus tôt dans les flux de travail des développeurs.
Utilisez des frameworks de pré-validation tels que le pré-commit
Le transfert des contrôles de style et de qualité vers des hooks de pré-validation locaux fournit un feedback rapide aux développeurs avant l'introduction des modifications. Les normes font partie du flux de travail de codage.