Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Source: https://github.com/antonbabenko/terraform-best-practices/tree/master/examples/small-terraform
Cet exemple contient du code comme exemple de structuration des configurations Terraform pour une infrastructure de petite taille, où aucune dépendance externe n'est utilisée.
Parfait pour commencer et refactoriser au fur et à mesure
Parfait pour les petits modules de ressources
Bon pour les petits modules d'infrastructure linéaires (par exemple, terraform-aws-atlantis)
Bon pour un petit nombre de ressources (moins de 20-30)
Un fichier d'état unique pour toutes les ressources peut ralentir le processus de travail avec Terraform si le nombre de ressources augmente (envisagez d'utiliser un argument -target pour limiter le nombre de ressources)
La documentation officielle de Terraform décrit tous les aspects de la configuration en détail. Il faudrait la lire attentivement pour comprendre le reste de cette section
Cette section décrit les concepts clés qui seront utilisés dans le livre.
Une ressource est un objet commeaws_vpc
, aws_db_instance
, etc. Une ressource appartient à un fournisseur, accepte des arguments, génère des attributs et possède des cycles de vie. Une ressource peut être créée, récupérée, mise à jour et supprimée.
Un module de ressources est un ensemble de ressources connectées qui exécutent mutuellement l'action commune (par exemple, le module AWS VPC Terraform crée un VPC, des sous-réseaux, une passerelle NAT, etc.). Il dépend de la configuration du fournisseur, qui peut être définie dans celui-ci, ou dans des structures de niveau supérieur (par exemple, dans le module d'infrastructure).
Un module d'infrastructure est un ensemble de modules de ressources, qui peuvent logiquement ne pas être connectés, mais dans la situation/projet/configuration actuels, ils ont le même objectif. Il définit la configuration des fournisseurs, qui est transmise aux modules de ressources en aval et aux ressources. Il est normalement limité au travail dans une entité par un séparateur logique (par exemple, AWS Region, Google Project).
Par exemple, le module terraform-aws-atlantis utilise des modules de ressources comme terraform-aws-vpc et terraform-aws-security-group pour gérer l'infrastructure requise afin d'opérationneliser Atlantis sur AWS Fargate.
Un autre exemple est le module terraform-aws-cloudquery qui emploie plusieurs modules de terraform-aws-modules ensemble afin de gérer l'infrastructure et utilisent les ressources Docker pour créer, pousser et déployer des images Docker. Tout en un ensemble.
La composition est une collection de modules d'infrastructure, qui peuvent s'étendre sur plusieurs zones logiquement séparées (par exemple, des régions AWS, plusieurs comptes AWS). La composition est utilisée pour décrire l'infrastructure complète requise pour l'ensemble de l'organisation ou du projet.
Une composition est constituée de modules d'infrastructure, qui comprennent des modules de ressources implémentant des ressources individuelles.
La source de données effectue une opération en lecture seule et dépend de la configuration du fournisseur. Elle est utilisée dans un module de ressources et un module d'infrastructure.
La source de données terraform_remote_state
agit comme une colle (lien) pour les modules et les compositions de niveau supérieur.
La source de données externe permet à un programme externe d'agir en tant que source de données, exposant des données arbitraires à utiliser ailleurs dans la configuration Terraform. En voici un exemple à partir du module terraform-aws-lambda où le nom de fichier est obtenu en appelant un script Python externe.
La source de données http envoie une requête HTTP GET à l'URL donnée et exporte des informations liées à la réponse. Ces dernières sont souvent utiles pour obtenir des informations à partir de points de terminaison où un fournisseur Terraform natif n'existe pas.
Les modules et les compositions d'infrastructure doivent conserver leur état Terraform dans un emplacement distant où il peut être récupéré par d'autres de manière contrôlable (par exemple, l'accès spécifique à l'ACL, la gestion des versions, la journalisation).
Les fournisseurs, les commission (provisioner) et quelques autres termes sont très bien décrits dans la documentation officielle et il est inutile de le répéter ici. À mon avis, ils ont peu à voir avec l'écriture de bons modules Terraform.
Alors que les ressources individuelles sont comme des atomes dans l'infrastructure, les modules de ressources sont des molécules. Un module est la plus petite unité versionnable et partageable. Il a une liste exacte d'arguments, implémente une logique de base pour qu'une telle unité remplisse la fonction requise. Par exemple, le module terraform-aws-security-group crée des ressources aws_security_group
etaws_security_group_rule
en fonction de l'entrée. Ce module de ressources en lui-même peut être utilisé avec d'autres modules pour créer le module d'infrastructure.
L'accès aux données à travers les molécules (modules de ressources et modules d'infrastructure) est effectué à l'aide des sorties et des sources de données des modules.
L'accès entre les compositions est souvent effectué à l'aide de sources de données à distance. Il existe plusieurs façons de partager des données entre les configurations.
Lorsque vous mettez les concepts décrits ci-dessus dans des pseudo-relations, cela peut ressembler à ceci :
Cet exemple contient du code comme exemple de structuration des configurations Terraform pour une infrastructure de taille moyenne qui utilise :
2 comptes AWS
2 environnements séparés (prod
et stage
qui ne partagent rien). Chaque environnement réside dans un compte AWS distinct
Chaque environnement utilise la même version d'un module interne modules/network
puisqu'il provient d'un répertoire local.
Parfait pour les projets où l'infrastructure est logiquement séparée (comptes AWS séparés)
Bon lorsqu'il n'est pas nécessaire de modifier les ressources partagées entre les comptes AWS (un environnement = un compte AWS = un fichier d'état)
Bon quand il n'y a pas besoin d'orchestration des changements entre les environnements
Bon lorsque les ressources d'infrastructure sont différentes par environnement à dessein et ne peuvent pas être généralisées (par exemple, certaines ressources sont absentes dans un environnement ou dans certaines régions)
Au fur et à mesure que le projet grandit, il sera plus difficile de maintenir ces environnements à jour les uns avec les autres. Il faudrait envisagez d'utiliser des modules d'infrastructure (prêts à l'emploi ou internes) pour les tâches répétables.
Cet exemple contient du code comme exemple de structuration des configurations Terraform pour une infrastructure de grande taille qui utilise :
2 comptes AWS
2 régions
2 environnements séparés (prod
et stage
qui ne partagent rien). Chaque environnement réside dans un compte AWS distinct et répartit les ressources entre 2 régions
Chaque environnement utilise la même version d'un module interne modules/network
puisqu'il provient d'un répertoire local.
Parfait pour les projets où l'infrastructure est logiquement séparée (comptes AWS séparés)
Bon lorsqu'il n'est pas nécessaire de modifier les ressources partagées entre les comptes AWS (un environnement = un compte AWS = un fichier d'état)
Bon quand il n'y a pas besoin d'orchestration des changements entre les environnements
Bon lorsque les ressources d'infrastructure sont différentes par environnement à dessein et ne peuvent pas être généralisées (par exemple, certaines ressources sont absentes dans un environnement ou dans certaines régions)
Au fur et à mesure que le projet grandit, il sera plus difficile de maintenir ces environnements à jour les uns avec les autres. Il faudrait envisagez d'utiliser des modules d'infrastructure (prêts à l'emploi ou internes) pour les tâches répétables.
Source:
Chaque environnement utilise une version différente du module d'infrastructure standard (alb) provenant de
Source:
Chaque environnement utilise une version différente du module d'infrastructure standard (alb
) provenant de
Dans un grand projet comme décrit ici, les avantages de l'utilisation de Terragrunt deviennent très visibles. Voir .
FTP (Frequent Terraform Problems)
Terragrunt - Outil d'orchestration
tflint - Code linter
tfenv - Gestionnaire de versions
Atlantis - Automation des demandes d'extraction (Pull Request)
pre-commit-terraform - Collection de git hooks pour Terraform à utiliser avec pre-commit framework
Infracost - Estimation des coûts du cloud pour Terraform dans les demandes de pull. Fonctionne aussi avec Terragrunt, Atlantis et pre-commit-terraform
Les versions des modules de ressources et d'infrastructure doivent être spécifiées. Les fournisseurs doivent être configurés en dehors des modules, mais uniquement en composition. La version des fournisseurs et de Terraform peut également être verrouillée.
Il n'y a pas d'outil maître de gestion des dépendances, mais il existe quelques astuces pour rendre l'enfer des dépendances moins problématique. Par exemple, Dependabot peut être utilisé pour automatiser les mises à jour des dépendances. Dependabot crée des demandes d'extraction pour garder vos dépendances sécurisées et à jour. Dependabot prend en charge les configurations Terraform.
locals
pour spécifier des dépendances explicites entre les ressourcesMoyen utile d'indiquer à Terraform que certaines ressources doivent être supprimées au préalable lorsqu'il n'y a pas de dépendance directe dans les configurations Terraform.
https://raw.githubusercontent.com/antonbabenko/terraform-best-practices/master/snippets/locals.tf
L'argument obligatoire index_document
doit être défini, si var.website
n'est pas une map vide.
L'argument optionnel error_document
peut être omis.
Il existe également un atelier pour les personnes qui souhaitent mettre en pratique certaines des choses décrites dans ce guide.
Il y a beaucoup de gens qui créent un excellent contenu et gèrent des projets open source pertinents pour la communauté Terraform, mais je ne peux pas penser à la meilleure structure pour obtenir ces liens répertoriés ici sans copier des listes comme .
- Liste des personnes qui travaillent très activement avec Terraform et qui peuvent vous en dire beaucoup (si vous leur demandez).
- Liste organisée de ressources sur Terraform de HashiCorp.
- "Your Weekly Dose of Terraform" chaine YouTube par Anton Babenko. Live avec des critiques, des interviews, des questions-réponses, du codage en direct et du hacking avec Terraform.
- Infolettre hebdomadaire avec Terraform. Diverses actualités dans le monde Terraform (projets, annonces, discussions) par Anton Babenko.
Le contenu est ici -
Les exemples et les modules Terraform doivent contenir une documentation expliquant les fonctionnalités et comment les utiliser.
Tous les liens dans les fichiers README.md doivent être absolus pour que le site Web Terraform Registry les affiche correctement.
La documentation peut inclure des diagrammes créés avec mermaid et des plans créés avec cloudcraft.co.
Utilisez Terraform pre-commit hooks pour vous assurer que le code est valide, correctement formaté et automatiquement documenté avant qu'il ne soit transmis à git et examiné par des humains
pre-commit est un cadre de gestion et de maintenance des hooks de pré-commit multilingues. Écrit en Python, il est un outil puissant pour faire quelque chose automatiquement sur la machine d'un développeur avant que le code ne soit validé dans un référentiel git. Normalement, il est utilisé pour exécuter des linters et formater du code (voir supported hooks).
Avec les configurations Terraform pre-commit
peut être utilisé pour formater et valider le code, ainsi que pour mettre à jour la documentation.
Vérifiez le pre-commit-terraform repository pour vous familiariser avec lui, et les référentiels existants (par exemple, terraform-aws-vpc) où cela est déjà utilisé.
terraform-docs est un outil qui génère la documentation des modules Terraform dans différents formats de sortie. Vous pouvez l'exécuter manuellement (sans crochets de pré-commit), ou utiliser pre-commit-terraform hooks pour obtenir la documentation mise à jour automatiquement.
@ToDo: Document module versions, release, GH actions
Ce document a pour but de décrire systématiquement les bonnes pratiques dans l’utilisation de Terraform et de fournir des recommandations par rapport aux problèmatiques fréquemment rencontrées.
Terraform, un projet relativement nouveau (comme la plus part des outils Devops actuellement), a été lancé en 2014.
Terraform est un outil puissant (si ce n'est le plus puissant actuellement disponible) et le plus utilisé pour le gestion de l'infrastructure comme code. Il permet aux developpeurs de créer plusieurs codes dont le support et l'intégration seront faciles
Certaines informations décrit dans ce livre pourraient ne pas ressembler aux bonnes pratiques. J'en suis conscient, et pour aider les lecteurs à séparer ce qui établit comme bonnes pratiques et ce que je considère être d'autres méthodes équivalentes, j'utiliserai par moment des indications pour fournir un certain contexte et des icônes pour spécifier le niveau de maturité de chaque sous-section reliée aux bonnes pratiques
Ce livre a été commencé dans une ville de Madrid ensoleillée en 2018 et est disponible gratuitement ici https://www.terraform-best-practices.com/
Quelques années plus tard il a été mis à jour grâce à plusieurs récentes bonnes pratiques disponibles avec Terraform 1.0. Éventuellement ce livre devrait contenir la plupart des bonnes pratiques et recommandations indiscutables pour les utilisateurs de Terraform.
Please contact me if you want to become a sponsor.
Contactez-moi si vous voulez aider à traduire ce livre dans d'autres langues.
Je souhaite toujours obtenir des commentaires et mettre à jour ce livre au fur et à mesure que la communauté mûrit et que de nouvelles idées sont mises en œuvre et vérifiées au fil du temps. Si vous êtes intéressé par certains sujets, veuillez ouvrir un problème ou en indiquer un que vous souhaitez être traiter plus en détail. Si vous sentez que vous avez du contenu et que vous souhaitez y contribuer, rédigez un brouillon et soumettez un pull request (ne vous souciez pas d'écrire un bon texte à ce stade !)
Ce livre est maintenu par Anton Babenko avec l'aide de différents contributeurs et traducteurs. Nicanor Foping l'a traduit en français.
Ce travail est sous licence Apache 2. Voir LICENCE pour plus de détails.
Les auteurs et contributeurs de ce contenu ne peuvent garantir la validité des informations trouvées ici. Veuillez vous assurer que vous comprenez que les informations fournies ici sont fournies librement et qu'aucun type d'accord ou de contrat n'est créé entre vous et toute personne associée à ce contenu ou projet. Les auteurs et les contributeurs n'assument pas et déclinent par la présente toute responsabilité envers toute partie pour toute perte, dommage ou perturbation causé par des erreurs ou des omissions dans les informations contenues dans, associées ou liées à ce contenu, que ces erreurs ou omissions résultent de négligence, accident ou toute autre cause.
Copyright © 2018-2023 Anton Babenko.
Type | Description | Préparation |
---|
Type | Description | Préparation |
---|
moyen | Plusieurs comptes et environnements AWS, modules d'infrastructure prêts à l'emploi utilisant Terragrunt. | No |
grand | Plusieurs régions, besoin urgent de réduire le copier-coller, modules d'infrastructure personnalisés, utilisation intensive des compositions. Utilisation de Terragrunt. | No |
très grand | Plusieurs fournisseurs (AWS, GCP, Azure). Déploiements multi-cloud. Utilisation de Terragrunt. | Non |
CAST AI — Cut your Kubernetes costs by 60%+ on average. First cluster optimization FREE!
Speakeasy — Terraform Providers, SDKs and docs for your API. Make your API enterprise-ready!
Peu de ressources, pas de dépendances externes. Compte AWS unique. Région unique. Environnement unique | Oui |
Plusieurs comptes et environnements AWS, modules d'infrastructure prêts à l'emploi utilisant Terraform. | Oui |
Plusieurs régions, besoin urgent de réduire le copier-coller, modules d'infrastructure personnalisés, utilisation intensive des compositions. Utilisation de Terraform. | TeC(Travail en Cours) |
Très grand | Plusieurs fournisseurs (AWS, GCP, Azure). Déploiements multi-cloud. Utilisation de Terraform. | Non |
Les questions liées à la structure du code Terraform sont de loin les plus fréquentes dans la communauté. Tout le monde a également pensé à la meilleure structure de code pour le projet à un moment donné.
C'est l'une des questions pour lesquelles de nombreuses solutions existent, mais il est très difficile de donner des conseils universels, alors commençons par comprendre à quoi nous avons affaire.
Quelle est la complexité de votre projet?
Nombre de ressources associées
Nombre de fournisseurs Terraform (voir la remarque ci-dessous sur les "fournisseurs logiques")
À quelle fréquence votre infrastructure change-t-elle ?
À partir d'une fois par mois/semaine/jour
À continuellement (à chaque fois qu'il y a un nouveau commit)
Quelles sont les initiateurs de changement de code? Laissez-vous le serveur CI mettre à jour le référentiel lorsqu'un nouvel artefact est créé ?
Seuls les développeurs peuvent pousser vers le référentiel d'infrastructure?
Tout le monde peut proposer un changement à n'importe quoi en ouvrant un PR (y compris les tâches automatisées exécutées sur le serveur CI)
Quelle plate-forme de déploiement ou service de déploiement utilisez-vous ?
AWS CodeDeploy, Kubernetes ou OpenShift nécessitent une approche légèrement différente
Comment les environnements sont-ils regroupés ?
Par environnement, région, projet
Mettre tout le code dans main.tf est une bonne idée lorsque vous débutez ou que vous écrivez un exemple de code. Dans tous les autres cas, il sera préférable d'avoir plusieurs fichiers répartis logiquement comme ceci :
main.tf
- appelle les modules, les variables locals et les sources de données pour créer toutes les ressources
variables.tf
- contient les variables qui seront utilisées dans main.tf
outputs.tf
- contient les sorties des ressources créées dans main.tf
versions.tf
- contient les exigences de version pour Terraform et les fournisseurs
terraform.tfvars
ne doit être utilisé nulle part sauf composition.
Veuillez vous assurer que vous comprenez les concepts clés - resource module, infrastructure module, et composition, tels qu'ils sont utilisés dans les exemples suivants.
Il est plus facile et plus rapide de travailler avec un plus petit nombre de ressources
terraform plan
etterraform apply
effectuent tous deux des appels d'API cloud pour vérifier l'état des ressources
Si vous avez toute votre infrastructure dans une seule composition, cela peut prendre un certain temps
Le surface d'exposition est plus petit avec moins de ressources
Isoler les ressources non liées les unes des autres en les plaçant dans des compositions séparées réduit le risque en cas de problème
Démarrez votre projet en utilisant l'état distant car :
Votre ordinateur portable n'est pas une source fiable pour votre infrastructure
Gérer un fichier tfstate
file dans un git est cauchemar
Plus tard, lorsque les couches d'infrastructure commenceront à se développer dans plusieurs directions (nombre de dépendances ou de ressources), il sera plus facile de garder les choses sous contrôle
Adoptez une structure et une convention de dénomination cohérentes :
Comme tout code procédural, le code Terraform doit être écrit pour permettre d'abord aux gens de le lire. Sa cohérence aidera lorsque des changements se produiront dans une période de six mois
Il est possible de déplacer des ressources dans le fichier d'état Terraform, mais cela peut être plus difficile à faire si vous avez une structure et un nom incohérents
Gardez les modules de ressources aussi clairs que possible
Ne codez pas en dur les valeurs qui peuvent être transmises en tant que variables ou découvertes à l'aide de sources de données
Utilisez les sources de données et terraform_remote_state
spécifiquement comme colle (liaison) entre les modules d'infrastructure au sein de la composition.
Dans ce livre, des exemples de projets sont regroupés par complexité - des petites aux très grandes infrastructures. Cette séparation n'est pas stricte, vérifiez donc également les autres structures.
Avoir une petite infrastructure signifie qu'il y a un petit nombre de dépendances et peu de ressources. Au fur et à mesure que le projet se développe, la nécessité d'enchaîner l'exécution des configurations Terraform, de connecter différents modules d'infrastructure et de transmettre des valeurs au sein d'une composition devient évidente.
On dénombre au moins 5 groupes distincts de solutions d'orchestration utilisées par les développeurs :
Terraform uniquement. Très simple, les développeurs ne doivent connaître que Terraform pour faire le travail.
Terragrunt. Un pur outil d'orchestration qui peut être utilisé pour orchestrer l'ensemble de l'infrastructure ainsi que pour gérer les dépendances. Terragrunt fonctionne nativement avec des modules d'infrastructure et des compositions, ce qui réduit la duplication de code.
Scripts maison (personnel). Ils sont souvent utilisés comme point de départ vers l'orchestration et avant de découvrir Terragrunt.
Ansible ou les outils d'automatisation généraux similaires. Généralement utilisé lorsque Terraform est adopté après Ansible, ou lorsque l'UI Ansible est activement utilisée.
Crossplane et autres solutions inspirées de Kubernetes. Parfois, il est logique d'utiliser l'écosystème Kubernetes et d'employer une fonction de boucle de réconciliation pour atteindre l'état souhaité de vos configurations Terraform. Voir la vidéo Crossplane vs Terraform pour plus d'information.
Avec cela en tête, ce livre passe en revue les deux premières structures de projet ci-dessus, Terraform uniquement ou Terragrunt.
Voir des exemples de structure de code pour Terraform et Terragrunt dans le prochain chapitre.