arrow-left

Only this pageAll pages
gitbookPowered by GitBook
1 of 15

Français (French)

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Bienvenue

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.

Terraformarrow-up-right, 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/arrow-up-right

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.

hashtag
Sponsors

Please if you want to become a sponsor.

hashtag
Translations

Contactez-moi si vous voulez aider Ă  traduire ce livre dans d'autres langues.

hashtag
Contributions

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 !)

hashtag
Authors

Ce livre est maintenu par Anton Babenko avec l'aide de différents contributeurs et traducteurs. Nicanor Foping l'a traduit en français.

hashtag
License

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.

— Terraform Compliance Simplified. Make your Terraform modules compliance-ready.

—

contact mearrow-up-right
Ű§Ù„ŰčŰ±ŰšÙŠŰ© (Arabic)chevron-right
Bosanski (Bosnian)chevron-right
PortuguĂȘs (Brazilian Portuguese)chevron-right
Englishchevron-right
áƒ„áƒáƒ áƒ—áƒŁáƒšáƒ˜ (Georgian)chevron-right
Deutsch (German)chevron-right
ΔλληΜÎčÎșÎŹ (Greek)chevron-right
ŚąŚ‘ŚšŚ™ŚȘ (Hebrew)chevron-right
à€čà€żà€‚à€Šà„€ (Hindi)chevron-right
Bahasa Indonesia (Indonesian)chevron-right
Italiano (Italian)chevron-right
æ—„æœŹèȘž (Japanese)chevron-right
àȕàČšàłàČšàČĄ (Kannada)chevron-right
한ꔭ얎 (Korean)chevron-right
Polski (Polish)chevron-right
Romùnă (Romanian)chevron-right
çź€äœ“äž­æ–‡ (Simplified Chinese)chevron-right
Español (Spanish)chevron-right
TĂŒrkçe (Turkish)chevron-right
ĐŁĐșŃ€Đ°Ń—ĐœŃŃŒĐșа (Ukrainian)chevron-right
Ű§Ű±ŰŻÙˆ (Urdu)chevron-right
arrow-up-right
Compliance.tfarrow-up-right

Terragrunt

Infrastructure de petite taille avec Terraform

Source: https://github.com/antonbabenko/terraform-best-practices/tree/master/examples/small-terraformarrow-up-right

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.

circle-check
  • 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, )

  • Bon pour un petit nombre de ressources (moins de 20-30)

circle-exclamation

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)

Infrastructure de grande taille avec Terraform

Source:

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

terraform-aws-atlantisarrow-up-right

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 une version diffĂ©rente du module d'infrastructure standard (alb) provenant de Terraform Registryarrow-up-right

  • Chaque environnement utilise la mĂȘme version d'un module interne modules/network puisqu'il provient d'un rĂ©pertoire local.

  • circle-info

    Dans un grand projet comme décrit ici, les avantages de l'utilisation de Terragrunt deviennent trÚs visibles. Voir Code Structures examples with Terragrunt.

    circle-check
    • 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)

    circle-exclamation

    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.

    hashtag

    https://github.com/antonbabenko/terraform-best-practices/tree/master/examples/large-terraformarrow-up-right

    Exemples de structure de code

    hashtag
    Structures de code Terraform

    circle-info

    Ces exemples montrent un fournisseur AWS, mais la majoritĂ© des principes prĂ©sentĂ©s dans les exemples peuvent ĂȘtre appliquĂ©s Ă  d'autres fournisseurs de cloud public ainsi qu'Ă  d'autres types de fournisseurs (DNS, DB, Monitoring, etc.)

    Type
    Description
    Préparation

    hashtag
    Structures de code Terragrunt

    Type
    Description
    Préparation

    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

    trĂšs grand

    Plusieurs fournisseurs (AWS, GCP, Azure). Déploiements multi-cloud. Utilisation de Terragrunt.

    Non

    petit

    Peu de ressources, pas de dépendances externes. Compte AWS unique. Région unique. Environnement unique

    Oui

    moyen

    Plusieurs comptes et environnements AWS, modules d'infrastructure prĂȘts Ă  l'emploi utilisant Terraform.

    Oui

    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

    Concepts clés

    La documentation officielle de Terraform décrit tous les aspects de la configuration en détailarrow-up-right. 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.

    hashtag
    Ressource

    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.

    hashtag
    Module de ressources

    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).

    hashtag
    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 utilise des modules de ressources comme et pour gérer l'infrastructure requise afin d'opérationneliser sur .

    Un autre exemple est le module qui emploie plusieurs modules de 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.

    hashtag
    Composition

    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.

    hashtag
    Source de données

    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_stateagit comme une colle (lien) pour les modules et les compositions de niveau supérieur.

    La source de donnĂ©es 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 oĂč le nom de fichier est obtenu en appelant un script Python externe.

    La source de donnĂ©es 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.

    hashtag
    État distant

    Les modules et les compositions d'infrastructure doivent conserver leur 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).

    hashtag
    Fournisseur, commission etc

    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.

    hashtag
    Pourquoi est ce si difficile?

    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 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 .

    Lorsque vous mettez les concepts décrits ci-dessus dans des pseudo-relations, cela peut ressembler à ceci :

    Style de code

    circle-info
    • 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 et des plans créés avec .

    • Utilisez 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

    hashtag
    Documentation

    hashtag
    Documentation génÚrée automatiquement

    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 ).

    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 pour vous familiariser avec lui, et les rĂ©fĂ©rentiels existants (par exemple, ) oĂč cela est dĂ©jĂ  utilisĂ©.

    hashtag
    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 pour obtenir la documentation mise à jour automatiquement.

    @ToDo: Document module versions, release, GH actions

    hashtag
    Resources

    1. Blog posté par :

    Références

    circle-info

    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 awesome-terraformarrow-up-right.

    https://twitter.com/antonbabenko/lists/terraform-expertsarrow-up-right - Liste des personnes qui travaillent trĂšs activement avec Terraform et qui peuvent vous en dire beaucoup (si vous leur demandez).

    https://github.com/shuaibiyy/awesome-terraformarrow-up-right - Liste organisée de ressources sur Terraform de HashiCorp.

    http://bit.ly/terraform-youtubearrow-up-right - "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.

    Infrastructure de taille moyenne avec Terraform

    Source:

    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

    mermaidarrow-up-right
    cloudcraft.coarrow-up-right
    Terraform pre-commit hooksarrow-up-right
    pre-commitarrow-up-right
    supported hooksarrow-up-right
    pre-commit-terraform repositoryarrow-up-right
    terraform-aws-vpcarrow-up-right
    terraform-docsarrow-up-right
    pre-commit-terraform hooksarrow-up-right
    pre-commit framework homepagearrow-up-right
    Collection of git hooks for Terraform to be used with pre-commit frameworkarrow-up-right
    Dean Wilsonarrow-up-right
    pre-commit hooks and terraform - a safety net for your repositoriesarrow-up-right
    https://weekly.tfarrow-up-right
    grand
    stage
    qui ne partagent rien). Chaque environnement réside dans un compte AWS distinct
  • Chaque environnement utilise une version diffĂ©rente du module d'infrastructure standard (alb) provenant de Terraform Registryarrow-up-right

  • Chaque environnement utilise la mĂȘme version d'un module interne modules/network puisqu'il provient d'un rĂ©pertoire local.

  • circle-check
    • 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)

    circle-exclamation

    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.

    hashtag

    https://github.com/antonbabenko/terraform-best-practices/tree/master/examples/medium-terraformarrow-up-right

    Atélier

    Il existe également un atelier pour les personnes qui souhaitent mettre en pratique certaines des choses décrites dans ce guide.

    Le contenu est ici - https://github.com/antonbabenko/terraform-best-practices-workshoparrow-up-right

    terraform-aws-atlantisarrow-up-right
    terraform-aws-vpcarrow-up-right
    terraform-aws-security-grouparrow-up-right
    Atlantisarrow-up-right
    AWS Fargatearrow-up-right
    terraform-aws-cloudqueryarrow-up-right
    terraform-aws-modulesarrow-up-right
    externe arrow-up-right
    terraform-aws-lambdaarrow-up-right
    http arrow-up-right
    état Terraformarrow-up-right
    terraform-aws-security-grouparrow-up-right
    plusieurs façons de partager des données entre les configurationsarrow-up-right
    Simple infrastructure composition
    composition-1 {
      infrastructure-module-1 {
        data-source-1 => d1
    
        resource-module-1 {
          data-source-2 => d2
          resource-1 (d1, d2)
          resource-2 (d2)
        }
    
        resource-module-2 {
          data-source-3 => d3
          resource-3 (d1, d3)
          resource-4 (d3)
        }
      }
    
    }

    FAQ

    FTP (Frequent Terraform Problems)

    hashtag
    Quels sont les outils que je devrais connaĂźtre et envisager d'utiliser?

    • Terragruntarrow-up-right - Outil d'orchestration

    • - Code linter

    • - Gestionnaire de versions

    • - Automation des demandes d'extraction (Pull Request)

    • - Collection de git hooks pour Terraform Ă  utiliser avec

    • - Estimation des coĂ»ts du cloud pour Terraform dans les demandes de pull. Fonctionne aussi avec Terragrunt, Atlantis et pre-commit-terraform

    hashtag
    Quelles sont les solutions à l'enfer des dépendances avec les modules ?

    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, 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.

    Ecrire des configurations Terraform

    hashtag
    Utilisez locals pour spécifier des dépendances explicites entre les ressources

    Moyen 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.tfarrow-up-right

    hashtag
    Terraform 0.12 - Arguments réquis ou optionnels

    1. L'argument obligatoire index_documentdoit ĂȘtre dĂ©fini, si var.website n'est pas une map vide.

    2. L'argument optionnel error_document peut ĂȘtre omis.

    tflintarrow-up-right
    tfenvarrow-up-right
    Atlantisarrow-up-right
    pre-commit-terraformarrow-up-right
    pre-commit frameworkarrow-up-right
    Infracostarrow-up-right
    Dependabotarrow-up-right
    main.tf
    variable "website" {
      type    = map(string)
      default = {}
    }
    
    resource "aws_s3_bucket" "this" {
      # omitted...
    
      dynamic "website" {
        for_each = length(keys(var.website)) == 0 ? [] : [var.website]
    
        content {
          index_document = website.value.index_document
          error_document = lookup(website.value, "error_document", null)
        }
      }
    }
    terraform.tfvars
    website = {
      index_document = "index.html"
    }

    Structure du code

    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é.

    hashtag
    Comment devrais-je structurer mes configurations Terraform?

    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

    circle-info

    Les fournisseurs logiques fonctionnent entiÚrement dans la logique de Terraform et trÚs souvent n'interagissent avec aucun autre service, nous pouvons donc considérer leur complexité comme O(1). Les fournisseurs logiques les plus courants incluent , , , , .

    hashtag
    Initiation Ă  la structuration des configurations Terraform

    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

    terraform.tfvars ne doit ĂȘtre utilisĂ© nulle part sauf .

    hashtag
    Comment structurer les configurations Terraform?

    circle-info

    Veuillez vous assurer que vous comprenez les concepts clés - , , et , tels qu'ils sont utilisés dans les exemples suivants.

    hashtag
    Recommandations courantes pour structurer le code

    • 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

    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.

    hashtag
    Orchestration des modules d'infrastructure et compositions

    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 :

    1. Terraform uniquement. TrÚs simple, les développeurs ne doivent connaßtre que Terraform pour faire le travail.

    2. 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.

    3. Scripts maison (personnel). Ils sont souvent utilisés comme point de départ vers l'orchestration et avant de découvrir Terragrunt.

    Avec cela en tĂȘte, ce livre passe en revue les deux premiĂšres structures de projet ci-dessus, uniquement ou .

    Voir des exemples de structure de code pour et dans le prochain chapitre.

    outputs.tf - contient les sorties des ressources créées dans main.tf
  • versions.tf - contient les exigences de version pour Terraform et les fournisseurs

  • 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.

  • 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.

  • Crossplanearrow-up-right 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 Terraformarrow-up-right pour plus d'information.

  • randomarrow-up-right
    localarrow-up-right
    terraformarrow-up-right
    nullarrow-up-right
    timearrow-up-right
    composition
    resource module
    infrastructure module
    composition
    Terraform
    Terragrunt
    Terraform
    Terragrunt

    Convention des noms

    hashtag
    Conventions générales

    circle-info

    Il ne devrait y avoir aucune raison de ne pas suivre au moins ces conventions :)

    circle-info

    Prenez notes que les ressources rĂ©elles dans le cloud ont souvent des restrictions dans les noms autorisĂ©s. Certaines ressources, par exemple, ne peuvent pas contenir de tirets, certaines doivent ĂȘtre en camel-case. Les conventions de ce livre font rĂ©fĂ©rence aux noms Terraform eux-mĂȘmes.

    1. Utilisez _ (surligné) au lieu de - (tiret) partout (noms des ressources, noms des sources de données, noms des variables, sorties, etc.).

    2. PrĂ©fĂ©rez les lettres minuscules et les chiffres (mĂȘme si UTF-8 est pris en charge).

    hashtag
    Arguments de ressource et de source de données

    1. Ne répétez pas le type de ressource dans le nom de la ressource (ni partiellement, ni complÚtement) :

    circle-check
    `resource "aws_route_table" "public" {}`
    triangle-exclamation
    `resource "aws_route_table" "public_route_table" {}`
    triangle-exclamation
    `resource "aws_route_table" "public_aws_route_table" {}`
    1. Le nom de la ressource doit ĂȘtre ainsi donnĂ© s'il n'y a plus de nom descriptif et gĂ©nĂ©ral disponible, ou si le module de ressources crĂ©e une seule ressource de ce type (par exemple, dans AWS VPC modulearrow-up-right il y a une seule ressource de type aws_nat_gateway et plusieurs ressources de typeaws_route_table, donc aws_nat_gateway pourrait ĂȘtre nommĂ© this etaws_route_table devrait avoir des noms plus descriptifs - comme private, public, database).

    2. Toujours utilisez des noms au singulier.

    3. Utiliser - Ă  l'intĂ©rieur des valeurs des arguments et aux endroits oĂč la valeur sera exposĂ©e Ă  un humain (par exemple, Ă  l'intĂ©rieur du nom DNS de l'instance RDS).

    4. Inclure l'argument count / for_each à l'intérieur du bloc de ressource ou de source de données comme premier argument en haut et séparé par une nouvelle ligne aprÚs celui-ci.

    5. Inclure l'argument tags,si pris en charge par ressource, comme dernier argument rĂ©el, suivi de depends_on etlifecycle, si necessaire. Tous ces Ă©lĂ©ments doivent ĂȘtre sĂ©parĂ©s par une seule ligne vide.

    6. Lorsque vous utilisez des conditions dans un argumentcount / for_each, il est préférable d'employer les valeurs booléennes au lieu delength ou d'autres expressions.

    hashtag
    Exemples de code de ressource

    hashtag
    Utilisation de count / for_each

    circle-check
    main.tf
    resource "aws_route_table" "public" {
      count = 2
    
      vpc_id = "vpc-12345678"
      # ... remaining arguments omitted
    }
    
    resource "aws_route_table" "private" {
      for_each = toset(["one", "two"])
    
      vpc_id = "vpc-12345678"
      # ... remaining arguments omitted
    }
    triangle-exclamation
    main.tf
    resource "aws_route_table" "public" {
      vpc_id = "vpc-12345678"
      count  = 2
    
      # ... remaining arguments omitted
    }

    hashtag
    Emplacement de tags

    circle-check
    main.tf
    resource "aws_nat_gateway" "this" {
      count = 2
    
      allocation_id = "..."
      subnet_id     = "..."
    
      tags = {
        Name = "..."
      }
    
      depends_on = [aws_internet_gateway.this]
    
      lifecycle {
        create_before_destroy = true
      }
    }   
    triangle-exclamation
    main.tf
    resource "aws_nat_gateway" "this" {
      count = 2
    
      tags = "..."
    
      depends_on = [aws_internet_gateway.this]
    
      lifecycle {
        create_before_destroy = true
      }
    
      allocation_id = "..."
      subnet_id     = "..."
    }

    hashtag
    Conditions dans count

    circle-check
    outputs.tf
    resource "aws_nat_gateway" "that" {    # Best
      count = var.create_public_subnets ? 1 : 0
    }
    
    resource "aws_nat_gateway" "this" {    # Good
      count = length(var.public_subnets) > 0 ? 1 : 0
    }

    hashtag
    Variables

    1. Ne réinventez pas la roue dans les modules de ressources : utilisez le nom, la description et la valeur par défaut des variables telles que définies dans la section "Référence des arguments" pour la ressource avec laquelle vous travaillez.

    2. La prise en charge de la validation dans les variables est plutÎt limitée (par exemple, impossible d'accéder à d'autres variables ou de faire des recherches). Planifiez en conséquence car dans de nombreux cas, cette fonctionnalité est inutile.

    3. Utilisez la forme plurielle dans un nom de variable lorsque type est list(...) ou map(...).

    4. Ordonner les clés dans un bloc variable comme ceci: description , type, default, validation.

    5. Toujours inclure description sur toutes les variables mĂȘme si vous pensez que c'est Ă©vident (vous en aurez besoin Ă  l'avenir).

    6. Préférez l'utilisation de types simples (number, string, list(...), map(...), any) plutÎt qu'un type spécifique comme object() sauf si vous avez besoin d'avoir des contraintes strictes sur chaque clé.

    7. Utilisez des types spĂ©cifiques comme map(map(string))si tous les Ă©lĂ©ments de la carte ont le mĂȘme type (par exemple, string) ou peuvent ĂȘtre convertis en celui-ci (par exemple, le type de nombre peut ĂȘtre converti en string).

    8. Utilisez type any pour dĂ©sactiver la validation de type Ă  partir d'une certaine profondeur ou lorsque plusieurs types doivent ĂȘtre pris en charge.

    9. La Valeur {} est parfois un map mais quelques fois object. Utiliser tomap(...) pour créer une carte car il n'y a aucun moyen de créer un objet.

    hashtag
    Sorties

    Faire les sorties cohĂ©rentes et comprĂ©hensibles en dehors de son champ d'application (lorsqu'un utilisateur utilise un module, le type et l'attribut de la valeur renvoyĂ©e doivent ĂȘtre Ă©vidents).

    1. Le nom de la sortie doit dĂ©crire la propriĂ©tĂ© qu'il contient et ĂȘtre moins libre que vous ne le souhaiteriez normalement.

    2. Une bonne structure pour le nom de la sortie ressemble Ă  {name}_{type}_{attribute} , oĂč:

      1. {name} est le nom de la ressource ou de la source de données sans le préfixe du fournisseur. {name} pour aws_subnet est sous-réseau, pouraws_vpc ce sera vpc.

      2. {type} est le type de ressource

      3. {attribute} est l'attribut retourné par la sortie

      4. .

    3. Si la sortie renvoie une valeur avec des fonctions d'interpolation et plusieurs ressources, {name} et {type} il devrait ĂȘtre aussi gĂ©nĂ©rique que possible (this comme prĂ©fixe ĂȘtre omis). .

    4. Si la valeur renvoyée est une liste, elle doit avoir un nom au pluriel. .

    5. Incluez toujours une description pour toutes les sorties, mĂȘme si vous pensez que c'est Ă©vident.

    6. Évitez de dĂ©finir un argument sensible Ă  moins que vous ne contrĂŽliez entiĂšrement l'utilisation de cette sortie Ă  tous les endroits de tous les modules

    7. Préférez try() (disponible depuis Terraform 0.13) à element(concat(...)) (approche héritée pour la version antérieure à 0.13)

    hashtag
    Exemples de Code de sortie (output)

    Renvoie au plus un ID de groupe de sécurité :

    circle-check
    outputs.tf
    output "security_group_id" {
      description = "The ID of the security group"
      value       = try(aws_security_group.this[0].id, aws_security_group.name_prefix[0].id, "")
    }

    Lorsque vous avez plusieurs ressources du mĂȘme type, cela doit ĂȘtre omis dans le nom de la sortie:

    triangle-exclamation
    outputs.tf
    output "this_security_group_id" {
      description = "The ID of the security group"
      value       = element(concat(coalescelist(aws_security_group.this.*.id, aws_security_group.web.*.id), [""]), 0)
    }

    hashtag
    Utilisez un nom pluriel si la valeur retournée est une liste

    circle-check
    outputs.tf
    output "rds_cluster_instance_endpoints" {
      description = "A list of all cluster instance endpoints"
      value       = aws_rds_cluster_instance.this.*.endpoint
    }
    Voir exemples
    Voir exemple
    Voir exemple

    Terraform