Bonnes pratiques pour la structure et l'organisation de la base de code - AWS Conseils prescriptifs

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.

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 un examples 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-docs pour 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 quedisk_size), fournissez des valeurs par défaut.

    • Pour les variables qui ont des valeurs spécifiques à l'environnement (telles queproject_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. providerles 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 variables d'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 le envs/ dossier.

  • Modules imbriqués : les modules imbriqués doivent exister dans le modules/ sous-répertoire. Tout module imbriqué doté d'un README.md est considéré comme utilisable par un utilisateur externe. Si un README.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 le examples/ 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 le README.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 un templates/ 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. Cette pratique permet à Terraform de s'assurer qu'il existe une seule version du fournisseur compatible avec tous les modules de la configuration et de spécifier l'adresse source qui sert d'identifiant global (indépendant du module) au fournisseur. Cependant, les exigences du fournisseur spécifiques au module ne spécifient aucun des paramètres de configuration qui déterminent les points de terminaison distants auxquels le fournisseur aura accès, tels qu'un. Région AWS

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_providers dans. versions.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 dans la HashiCorp documentation.

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 ou this 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 et read_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 que vous devez utiliser dans le module racine.

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 partiesterraform-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 dans la documentation Terraform.

Utiliser les sources de modules recommandées

Terraform utilise l'sourceargument 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 les plus courants et les plus recommandés pour le partage de modules. Les modules de registre prennent en charge le versionnement. Vous devez toujours fournir une version spécifique, comme indiqué dans les exemples suivants.

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'refargument 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 (.tffichiers) avec la commande terraform fmt conformé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, tflintcheckov, 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 pour ajouter le linting, le formatage et le scan de code Terraform comme points d'ancrage sur votre machine locale. Les hooks s'exécutent à chaque validation Git et échouent si les vérifications ne sont pas validées.

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.