{"id":52367,"date":"2019-11-07T00:00:00","date_gmt":"2019-11-06T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/pereshel-s-terraform-na-cloudformation-i-pozhalel"},"modified":"2020-02-18T14:00:04","modified_gmt":"2020-02-18T11:00:04","slug":"pereshel-s-terraform-na-cloudformation-i-pozhalel","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","title":{"rendered":"Je suis pass\u00e9 de Terraform \u00e0 CloudFormation - et j'ai regrett\u00e9","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Repr\u00e9senter l'infrastructure sous forme de code dans un format texte r\u00e9p\u00e9table est une bonne pratique simple pour les syst\u00e8mes, avec laquelle on n'a pas besoin d'embrouiller. Cette pratique est d\u00e9sign\u00e9e par le terme \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Infrastructure_as_code\">Infrastructure as Code<\/a><\/noindex>, et jusqu'\u00e0 pr\u00e9sent, pour sa mise en \u0153uvre, surtout sur AWS, il existe deux outils populaires : <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/\">Terraform<\/a><\/noindex> et <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/cloudformation\/\">CloudFormation<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Je suis pass\u00e9 de Terraform \u00e0 CloudFormation - et j&#039;ai regrett\u00e9\" src=\"\/wp-content\/uploads\/2019\/11\/e33084fb81ca06107b341eef01e69adc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Je compare l'exp\u00e9rience avec Terraform et CloudFormation<\/em><\/p>\n<p><\/p>\n<p>Avant d'arriver chez <noindex><a rel=\"nofollow\" href=\"https:\/\/www.twitch.tv\/\">Twitch<\/a><\/noindex> (aussi connu sous le nom de <noindex><a rel=\"nofollow\" href=\"https:\/\/www.businessinsider.com\/amazon-buys-twitch-2014-8\">Amazon Jr.<\/a><\/noindex>) j'ai travaill\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.signalfx.com\/\">dans une startup<\/a><\/noindex> et j'ai utilis\u00e9 Terraform pendant environ trois ans. \u00c0 mon nouveau poste, j'ai \u00e9galement largement utilis\u00e9 Terraform, puis l'entreprise a pouss\u00e9 pour la transition vers tout ce qui est Amazon, y compris CloudFormation. J'ai travaill\u00e9 dur pour d\u00e9velopper les meilleures pratiques pour les deux, et j'ai utilis\u00e9 les deux outils dans des processus de travail tr\u00e8s complexes \u00e0 l'\u00e9chelle de l'organisation. Plus tard, apr\u00e8s avoir r\u00e9fl\u00e9chi aux implications du passage de Terraform \u00e0 CloudFormation, j'ai r\u00e9alis\u00e9 que Terraform est probablement le meilleur choix pour une organisation.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"terraform-uzhasnyy\">Terraform Horrible<\/h2>\n<p><\/p>\n<h3 id=\"beta-versiya-po\">Version b\u00eata du logiciel<\/h3>\n<p><\/p>\n<p>Terraform n'a m\u00eame pas encore atteint la version 1.0, et c'est une raison valable de ne pas l'utiliser. Depuis que je l'ai essay\u00e9 pour la premi\u00e8re fois, il a beaucoup chang\u00e9, mais \u00e0 l'\u00e9poque, <code>terraform apply<\/code> Il tombait souvent en panne apr\u00e8s quelques mises \u00e0 jour ou simplement apr\u00e8s quelques ann\u00e9es d'utilisation. Je dirais que \u00ab maintenant c'est diff\u00e9rent \u00bb, mais\u2026 tout le monde dit \u00e7a, non ? Il y a des changements incompatibles avec les versions pr\u00e9c\u00e9dentes, m\u00eame s'ils sont justifi\u00e9s, et j'ai m\u00eame l'impression que la syntaxe et les abstractions de stockage de ressources sont maintenant \u00e0 la hauteur. L'outil semble vraiment s'\u00eatre am\u00e9lior\u00e9, mais\u2026 :-0<\/p>\n<p><\/p>\n<p>D'un autre c\u00f4t\u00e9, AWS a bien fait, en maintenant la compatibilit\u00e9 avec les versions pr\u00e9c\u00e9dentes. C'est probablement parce que leurs services sont souvent soigneusement test\u00e9s en interne avant d'\u00eatre publi\u00e9s sous un nouveau nom. Donc, dire qu'\u00ab ils ont bien travaill\u00e9 \u00bb est encore une faible expression. Maintenir la compatibilit\u00e9 avec les versions pr\u00e9c\u00e9dentes de l'API pour un syst\u00e8me aussi variable et complexe qu'AWS est incroyablement difficile. Quiconque a d\u00fb g\u00e9rer des API publiques utilis\u00e9es aussi largement sait \u00e0 quel point cela peut \u00eatre compliqu\u00e9 au fil des ans. Quant au comportement de CloudFormation, il n'a jamais chang\u00e9 au fil des ans, autant que je me souvienne.<\/p>\n<p><\/p>\n<h3 id=\"znakomsya-noga-eto-pulya\">Salut, pied... c'est une balle<\/h3>\n<p><\/p>\n<p>\u00c0 ma connaissance, supprimer une ressource <strong>externe<\/strong> Il est impossible d'importer une stack CloudFormation dans sa propre stack CF. C'est \u00e0 peu pr\u00e8s la m\u00eame chose avec Terraform. Il permet d'importer des ressources existantes dans sa propre stack. C'est une fonctionnalit\u00e9, on peut dire, impressionnante, mais avec un grand pouvoir vient une grande responsabilit\u00e9. Il suffit d'ajouter une ressource \u00e0 la stack et, tant que vous travaillez avec votre stack, cette ressource ne peut pas \u00eatre supprim\u00e9e ou modifi\u00e9e. Une fois, cela a eu des cons\u00e9quences. Un jour, sur le site de Twitch, quelqu'un, sans mauvaise intention, a accidentellement import\u00e9 le groupe de s\u00e9curit\u00e9 AWS de quelqu'un d'autre dans sa propre stack Terraform. Il a entr\u00e9 quelques commandes et... le groupe de s\u00e9curit\u00e9 (avec le trafic entrant) a disparu.<\/p>\n<p><\/p>\n<h2 id=\"terraform-velikiy\">Terraform le Grand<\/h2>\n<p><\/p>\n<h3 id=\"vosstanovlenie-iz-nepolnyh-sostoyaniy\">R\u00e9cup\u00e9ration \u00e0 partir d'\u00e9tats incomplets<\/h3>\n<p><\/p>\n<p>Parfois, CloudFormation ne peut pas passer compl\u00e8tement d'un \u00e9tat \u00e0 un autre. Dans ce cas, il essaiera de revenir \u00e0 l'\u00e9tat pr\u00e9c\u00e9dent. Malheureusement, ce n'est pas toujours possible. D\u00e9boguer ce qui en r\u00e9sulte peut s'av\u00e9rer assez angoissant - on ne sait jamais si CloudFormation va appr\u00e9cier qu'on le modifie, m\u00eame pour le r\u00e9parer. Et il ne sait pas vraiment comment revenir \u00e0 l'\u00e9tat pr\u00e9c\u00e9dent et attend par d\u00e9faut pendant des heures un miracle.<\/p>\n<p><\/p>\n<p>Terraform, en revanche, a tendance \u00e0 se r\u00e9tablir apr\u00e8s des transitions rat\u00e9es de mani\u00e8re beaucoup plus \u00e9l\u00e9gante et propose des outils de d\u00e9bogage avanc\u00e9s.<\/p>\n<p><\/p>\n<h3 id=\"bolee-yasnye-izmeneniya-v-sostoyaniya-dokumenta\">Des changements plus clairs dans l'\u00e9tat du document<\/h3>\n<p><\/p>\n<blockquote><p>\u00ab Alors, l'\u00e9quilibreur de charge, tu \u00e9volues. Mais comment ? \u00bb<\/p>\n<p>\u2014 un ing\u00e9nieur inquiet, pr\u00eat \u00e0 appuyer sur le bouton \u00ab accepter \u00bb.<\/p><\/blockquote>\n<p>Parfois, j'ai besoin d'effectuer certaines manipulations avec l'\u00e9quilibreur de charge dans la stack CloudFormation - par exemple, ajouter un num\u00e9ro de port ou modifier le groupe de s\u00e9curit\u00e9. Les modifications de CloudFormation sont faiblement affich\u00e9es. \u00c0 chaque fois, je v\u00e9rifie le fichier yaml \u00e0 plusieurs reprises, pour m'assurer que je n'ai rien supprim\u00e9 d'important et que je n'ai rien ajout\u00e9 de superflu.<\/p>\n<p><\/p>\n<p>Terraform est, \u00e0 cet \u00e9gard, beaucoup plus transparent. Parfois, il est m\u00eame trop transparent (lire : aga\u00e7ant). Heureusement, la derni\u00e8re version a inclus une meilleure visualisation des modifications - on peut d\u00e9sormais voir exactement ce qui change.<\/p>\n<p><\/p>\n<h3 id=\"gibkost\">Flexibilit\u00e9<\/h3>\n<p><\/p>\n<blockquote><p>\u00c9crivez le logiciel \u00e0 l'envers.<\/p><\/blockquote>\n<p>Pour \u00eatre franc, la caract\u00e9ristique la plus importante d'un logiciel durable est sa capacit\u00e9 \u00e0 s'adapter aux changements. \u00c9crivez toujours un logiciel \u00e0 l'envers. C'est souvent l\u00e0 que je me suis plant\u00e9, en prenant un service \u00ab simple \u00bb, puis en essayant de tout int\u00e9grer dans un unique stack CloudFormation ou Terraform. Et bien s\u00fbr, des mois plus tard, je d\u00e9couvrais que je m'\u00e9tais compl\u00e8tement tromp\u00e9 et que le service n'\u00e9tait en r\u00e9alit\u00e9 pas si simple ! Et l\u00e0, je dois trouver un moyen de d\u00e9composer le grand stack en petites parties. Lorsque vous travaillez avec CloudFormation, cela n'est possible que si vous recr\u00e9ez d'abord le stack existant, ce que je ne fais pas avec mes bases de donn\u00e9es. Terraform, en revanche, permettait de d\u00e9cortiquer le stack et de le diviser en parties plus compr\u00e9hensibles.<\/p>\n<p><\/p>\n<h3 id=\"moduli-v-git\">Modules dans git<\/h3>\n<p><\/p>\n<p>Partager du code Terraform entre de nombreux stacks est beaucoup plus simple que de le faire avec CloudFormation. Avec Terraform, vous pouvez mettre le code dans un d\u00e9p\u00f4t git et y acc\u00e9der en utilisant un contr\u00f4le de version s\u00e9mantique. Quiconque a acc\u00e8s \u00e0 ce d\u00e9p\u00f4t peut r\u00e9utiliser le code commun. L'\u00e9quivalent pour CloudFormation est S3, mais il n'a pas les m\u00eames avantages, et il n'y a aucune raison de renoncer \u00e0 git au profit de S3.<\/p>\n<p><\/p>\n<p>L'organisation a grandi et la capacit\u00e9 de partager des stacks communs a atteint un niveau critique. Avec Terraform, tout cela se fait facilement et naturellement, tandis que CloudFormation vous obligera \u00e0 sauter \u00e0 travers des cerceaux avant que quelque chose de similaire ne fonctionne.<\/p>\n<p><\/p>\n<h3 id=\"operations-as-code\">Operations as code<\/h3>\n<p><\/p>\n<blockquote><p>\u00ab Scriptage et c'est tout. \u00bb<\/p>\n<p>\u2014 un ing\u00e9nieur trois ans avant d'inventer le v\u00e9lo Terraform.<\/p><\/blockquote>\n<p>Quand il s'agit de d\u00e9veloppement logiciel, Go ou un programme en Java n'est pas juste du code.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Je suis pass\u00e9 de Terraform \u00e0 CloudFormation - et j&#039;ai regrett\u00e9\" src=\"\/wp-content\/uploads\/2019\/11\/a5c61fd318b9b5aa62ebb69e38ca1b0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Code as Code<\/em><\/p>\n<p><\/p>\n<p>Il y a aussi l'infrastructure sur laquelle il fonctionne.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Je suis pass\u00e9 de Terraform \u00e0 CloudFormation - et j&#039;ai regrett\u00e9\" src=\"\/wp-content\/uploads\/2019\/11\/301c0323baa18563f05503e701af069b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Infrastructure as Code<\/em><\/p>\n<p><\/p>\n<p>Mais d'o\u00f9 vient-elle ? Comment la surveiller ? O\u00f9 r\u00e9side votre code ? Les d\u00e9veloppeurs doivent-ils obtenir l'autorisation d'acc\u00e8s ?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Je suis pass\u00e9 de Terraform \u00e0 CloudFormation - et j&#039;ai regrett\u00e9\" src=\"\/wp-content\/uploads\/2019\/11\/5cb0b6f720682b7bb6d5f485287b618b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Operations as Code<\/em><\/p>\n<p><\/p>\n<blockquote><p>\u00catre d\u00e9veloppeur software, ce n'est pas juste \u00e9crire du code.<\/p><\/blockquote>\n<p>Pas que AWS : vous utilisez s\u00fbrement les services d'autres fournisseurs. SignalFx, PagerDuty ou Github. Peut-\u00eatre avez-vous un serveur Jenkins interne pour CI\/CD ou un tableau de bord Grafana interne pour la surveillance. L'Infra as Code est choisi pour diverses raisons, et toutes sont \u00e9galement importantes pour tout ce qui concerne le logiciel.<\/p>\n<p><\/p>\n<p>Lorsque je travaillais chez Twitch, nous acc\u00e9l\u00e9rions les services au sein de syst\u00e8mes int\u00e9gr\u00e9s mixtes et des syst\u00e8mes AWS d'Amazon. Nous produisions et maintenions de nombreux microservices, augmentant ainsi les co\u00fbts d'exploitation. Les discussions se d\u00e9roulaient g\u00e9n\u00e9ralement comme suit :<\/p>\n<p><\/p>\n<ul>\n<li><strong>Je<\/strong>: Mince, \u00e7a fait pas mal de mouvements pour faire d\u00e9marrer un seul microservice. Je vais devoir utiliser cette chose pour cr\u00e9er un compte AWS (nous avions deux comptes pour <strong>microservice<\/strong>), puis celle-ci \u2014 pour configurer les alertes, encore celle-ci \u2014 pour le d\u00e9p\u00f4t de code, et celle-ci \u2014 pour la liste d'e-mails, et puis celle-ci\u2026<\/li>\n<li><strong>Lead<\/strong>: On va le mettre sous script, c'est parti.<\/li>\n<li><strong>Je<\/strong>: D'accord, mais le script lui-m\u00eame va changer. Il nous faudra un moyen de v\u00e9rifier que toutes ces int\u00e9grations d'Amazon sont \u00e0 jour.<\/li>\n<li><strong>Lead<\/strong>: \u00c7a sonne bien. Et pour cela, on va \u00e9crire un script.<\/li>\n<li><strong>Je<\/strong>: Super ! Et le script va probablement avoir besoin de param\u00e8tres. Est-ce qu'il peut les prendre ?<\/li>\n<li><strong>Lead<\/strong>: Oui, il peut les prendre, il n'y a pas de souci !<\/li>\n<li><strong>Je<\/strong>: Le processus peut changer, ce qui risque de faire perdre la r\u00e9trocompatibilit\u00e9. Il va falloir un contr\u00f4le de version s\u00e9mantique.<\/li>\n<li><strong>Lead<\/strong>: Excellente id\u00e9e !<\/li>\n<li><strong>Je<\/strong>: Les outils peuvent \u00eatre modifi\u00e9s manuellement, dans l'interface utilisateur. Nous aurons besoin d'un moyen de v\u00e9rifier et de corriger cela.<\/li>\n<\/ul>\n<p><\/p>\n<p><em>\u20263 ans plus tard :<\/em><\/p>\n<p><\/p>\n<ul>\n<li><strong>Lead<\/strong>: Et nous avons r\u00e9ussi \u00e0 obtenir Terraform.<\/li>\n<\/ul>\n<p><\/p>\n<p>La morale de cette fable est la suivante : m\u00eame si vous \u00eates <strong>les pieds dans tout ce qui est amazonien.<\/strong>, vous utilisez quand m\u00eame quelque chose qui ne vient pas d'AWS, et ces services ont un \u00e9tat qui utilise un langage pour la configuration pour synchroniser cet \u00e9tat.<\/p>\n<p><\/p>\n<h3 id=\"cloudformation-lambda-vs-git-moduli-terraform\">CloudFormation lambda contre les modules git de Terraform<\/h3>\n<p><\/p>\n<p>lambda est la solution de CloudFormation pour la logique utilisateur. Avec lambda, vous pouvez <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/macros-example.html\">cr\u00e9er des macros<\/a><\/noindex> ou <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/walkthrough-custom-resources-lambda-lookup-amiids.html\">ressource personnalis\u00e9e<\/a><\/noindex>. Cette approche pr\u00e9sente des complexit\u00e9s suppl\u00e9mentaires qui n'existent pas dans le contr\u00f4le s\u00e9mantique des versions des modules git de Terraform. Pour moi, le probl\u00e8me le plus urgent a \u00e9t\u00e9 la gestion des permissions pour toutes ces lambdas personnalis\u00e9es (ce qui implique des dizaines de comptes AWS). Une autre question importante \u00e9tait celle de \u00ab qui est venu en premier, l'\u0153uf ou la poule ? \u00bb : cela concernait le code lambda. Cette fonction est \u00e0 la fois l'infrastructure et le code, et elle n\u00e9cessite \u00e9galement une surveillance et des mises \u00e0 jour. La derni\u00e8re difficult\u00e9 a \u00e9t\u00e9 le probl\u00e8me de la mise \u00e0 jour s\u00e9mantique des changements de code lambda ; il fallait aussi faire en sorte que les actions de la pile ne changent pas entre les ex\u00e9cutions sans commande directe.<\/p>\n<p><\/p>\n<p>Je me souviens qu'un jour j'ai eu envie de cr\u00e9er un d\u00e9ploiement canari pour un environnement Elastic Beanstalk avec un \u00e9quilibreur de charge classique. Le plus simple aurait \u00e9t\u00e9 de faire un second d\u00e9ploiement pour EB \u00e0 c\u00f4t\u00e9 de l'environnement de production, en ajoutant une \u00e9tape suppl\u00e9mentaire : en liant le groupe de d\u00e9ploiement canari \u00e9volutif automatiquement avec l'\u00e9quilibreur de charge de l'environnement de production. Et puisque Terraform utilise <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/providers\/aws\/r\/elastic_beanstalk_environment.html#autoscaling_groups\">ASG beantalk comme sortie<\/a><\/noindex>, cela n\u00e9cessitera 4 lignes de code suppl\u00e9mentaires dans Terraform. Lorsque j'ai demand\u00e9 s'il n'y avait pas de solution comparable dans CloudFormation, on m'a indiqu\u00e9 tout un r\u00e9pertoire sur git avec un pipeline de d\u00e9ploiement et autres : tout \u00e7a juste pour ce que l'on pourrait faire avec 4 malheureuses lignes de code Terraform.<\/p>\n<p><\/p>\n<h3 id=\"on-luchshe-obnaruzhivaet-dreyf\">Il d\u00e9tecte mieux le drift<\/h3>\n<p><\/p>\n<blockquote><p>Assurez-vous que la r\u00e9alit\u00e9 correspond aux attentes.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/blogs\/aws\/new-cloudformation-drift-detection\/\">D\u00e9tection de drift<\/a><\/noindex> \u2014 c'est une fonction tr\u00e8s puissante des op\u00e9rations en tant que code, car elle permet de s'assurer que la r\u00e9alit\u00e9 correspond aux attentes. Elle est disponible \u00e0 la fois avec CloudFormation et avec Terraform. Mais au fur et \u00e0 mesure que la pile de travail grandit, la recherche du drift dans CloudFormation produit de plus en plus de faux positifs.<\/p>\n<p><\/p>\n<p>Avec Terraform, vous disposez de hooks de cycle de vie beaucoup plus avanc\u00e9s pour la d\u00e9tection du drift. Par exemple, vous entrez la commande <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/configuration\/resources.html#ignore_changes\">ignore_changes<\/a><\/noindex> directement dans la d\u00e9finition de la t\u00e2che ECS, si vous souhaitez ignorer les modifications sur la d\u00e9finition d'une t\u00e2che particuli\u00e8re, sans ignorer pour autant les modifications de l'ensemble du d\u00e9ploiement ECS.<\/p>\n<p><\/p>\n<h2 id=\"cdk-i-buduschee-cloudformation\">CDK et l'avenir de CloudFormation<\/h2>\n<p><\/p>\n<p>CloudFormation est difficile \u00e0 g\u00e9rer \u00e0 grande \u00e9chelle, inter-infrastructure. Beaucoup de ces difficult\u00e9s ont \u00e9t\u00e9 reconnues, et l'outil a besoin de choses comme <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/en_pv\/cdk\/latest\/guide\/home.html\">aws-cdk<\/a><\/noindex>, une structure pour d\u00e9finir l'infrastructure cloud en code et la faire passer par AWS CloudFormation. Il sera int\u00e9ressant de voir ce qui attend aws-cdk \u00e0 l'avenir, mais il sera difficile pour lui de rivaliser avec les autres avantages de Terraform ; pour rattraper CloudFormation, des changements globaux seront n\u00e9cessaires.<\/p>\n<p><\/p>\n<h3 id=\"chtoby-terraform-ne-razocharoval\">Pour que Terraform ne d\u00e9\u00e7oive pas<\/h3>\n<p><\/p>\n<blockquote><p>C'est de l'\u00ab infrastructure en tant que CODE \u00bb, pas de l'\u00ab infrastructure en tant que texte \u00bb.<\/p><\/blockquote>\n<p>Ma premi\u00e8re impression de Terraform a \u00e9t\u00e9 plut\u00f4t mauvaise. Je pense que je n'ai simplement pas compris l'approche. Presque tous les ing\u00e9nieurs le per\u00e7oivent involontairement au d\u00e9part comme un format texte \u00e0 transformer en infrastructure souhait\u00e9e. NE FAITES PAS \u00c7A.<\/p>\n<p><\/p>\n<h3 id=\"propisnye-istiny-horoshey-razrabotki-po-otnosyatsya-i-k-terraform\">Les v\u00e9rit\u00e9s \u00e9videntes d'un bon d\u00e9veloppement logiciel s'appliquent \u00e9galement \u00e0 Terraform.<\/h3>\n<p><\/p>\n<p>J'ai constat\u00e9 que de nombreuses pratiques recommand\u00e9es pour \u00e9crire un bon code sont ignor\u00e9es dans Terraform. Vous avez pass\u00e9 des ann\u00e9es \u00e0 devenir un bon programmeur. Ne renoncez pas \u00e0 cette exp\u00e9rience simplement parce que vous travaillez avec Terraform. Les v\u00e9rit\u00e9s fondamentales du bon d\u00e9veloppement logiciel s'appliquent \u00e9galement \u00e0 Terraform.<\/p>\n<p><\/p>\n<h3 id=\"kak-uzh-kod-i-ne-zadokumentirovat\">Comment pourrait-on coder sans documenter ?<\/h3>\n<p><\/p>\n<p>J'ai rencontr\u00e9 d'\u00e9normes stacks Terraform compl\u00e8tement d\u00e9pourvus de documentation. Comment peut-on \u00e9crire du code sur des pages enti\u00e8res \u2014 sans aucune documentation ? Ajoutez de la documentation expliquant votre <strong>code<\/strong> Terraform (l'accent ici est mis sur le mot \u00ab code \u00bb), pourquoi cette section est-elle si importante et que faites-vous.<\/p>\n<p><\/p>\n<h3 id=\"kak-mozhno-razvorachivat-servisy-kotorye-nekogda-byli-odnoy-bolshoy-funkciey-main\">Comment peut-on d\u00e9ployer des services qui \u00e9taient autrefois une grande fonction main() ?<\/h3>\n<p><\/p>\n<p>J'ai vu des stacks Terraform tr\u00e8s complexes pr\u00e9sent\u00e9s sous la forme d'un seul module. Pourquoi ne d\u00e9ployons-nous pas les logiciels de cette fa\u00e7on ? Pourquoi d\u00e9composons-nous des grandes fonctions en plus petites ? Les m\u00eames r\u00e9ponses s'appliquent \u00e0 Terraform. Si votre module est trop vaste, il faut le diviser en modules plus petits.<\/p>\n<p><\/p>\n<h3 id=\"razve-vasha-kompaniya-ne-polzuetsya-bibliotekami\">Votre entreprise n'utilise-t-elle pas de biblioth\u00e8ques ?<\/h3>\n<p><\/p>\n<p>J'ai vu des ing\u00e9nieurs, en lan\u00e7ant un nouveau projet avec Terraform, copier-coller de grandes sections d'autres projets dans les leurs, puis les bricoler jusqu'\u00e0 ce que \u00e7a commence \u00e0 fonctionner. Dans votre entreprise, travailleriez-vous de cette fa\u00e7on sur du code \u00ab en production \u00bb ? Nous n'utilisons pas les biblioth\u00e8ques sans raison. Oui, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=PAAkCSZUG1c&amp;t=9m28s\">tout ne devrait pas \u00eatre une biblioth\u00e8que,<\/a><\/noindex> mais que ferions-nous sans biblioth\u00e8ques communes en g\u00e9n\u00e9ral ?!<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-polzuetes-pep8-ili-gofmt\">N'utilisez-vous pas PEP8 ou gofmt ?<\/h3>\n<p><\/p>\n<p>Dans la plupart des langages, il existe un sch\u00e9ma de formatage standard accept\u00e9. En Python, c'est PEP8. En Go \u2014 gofmt. Terraform a le sien : <code>terraform fmt<\/code>. Utilisez-le \u00e0 votre guise ! <\/p>\n<p><\/p>\n<h3 id=\"vy-stanete-polzovatsya-react-ne-znaya-javascript\">Utiliserez-vous React sans conna\u00eetre JavaScript ?<\/h3>\n<p><\/p>\n<p>Les modules Terraform peuvent simplifier une certaine partie de l'infrastructure complexe que vous cr\u00e9ez, mais cela ne signifie pas que vous pouvez l'utiliser sans comprendre les ressources. Voulez-vous utiliser correctement Terraform sans comprendre ? Vous \u00eates condamn\u00e9 : le temps va passer et vous n'apprendrez jamais Terraform.<\/p>\n<p><\/p>\n<h3 id=\"vy-kodite-singltonami-ili-vnedryaya-zavisimosti\">Codez-vous des singletons, ou injectez-vous des d\u00e9pendances ?<\/h3>\n<p><\/p>\n<p>L'injection de d\u00e9pendances est une pratique reconnue comme la meilleure pour le d\u00e9veloppement logiciel, souvent privil\u00e9gi\u00e9e par les singletons. Comment cela peut-il \u00eatre utile dans Terraform ? J'ai rencontr\u00e9 des modules Terraform qui d\u00e9pendent d'un \u00e9tat distant. Au lieu d'\u00e9crire des modules qui extraient de cet \u00e9tat, \u00e9crivez un module qui prend des param\u00e8tres. Ensuite, transmettez ces param\u00e8tres au module.<\/p>\n<p><\/p>\n<h3 id=\"vashi-biblioteki-delayut-desyat-veschey-horosho-ili-odnu---otlichno\">Vos biblioth\u00e8ques r\u00e9alisent-elles dix choses bien ou une seule - mais parfaitement ?<\/h3>\n<p><\/p>\n<p>Les biblioth\u00e8ques qui se concentrent sur une seule t\u00e2che, qu'elles accomplissent \u00e0 la perfection, fonctionnent le mieux. Au lieu d'\u00e9crire de grands modules Terraform qui tentent de tout faire \u00e0 la fois, d\u00e9composez-les en parties qui effectuent chacune une t\u00e2che sp\u00e9cifique avec excellence. Ensuite, combinez-les comme il faut.<\/p>\n<p><\/p>\n<h3 id=\"kak-vy-proizvodite-izmeneniya-v-bibliotekah-bez-obratnoy-sovmestimosti\">Comment apportez-vous des modifications aux biblioth\u00e8ques sans r\u00e9trocompatibilit\u00e9 ?<\/h3>\n<p><\/p>\n<p>Un module Terraform commun, tout comme une biblioth\u00e8que traditionnelle, doit informer ses utilisateurs des changements sans r\u00e9trocompatibilit\u00e9. Lorsque des modifications surviennent dans les biblioth\u00e8ques, c'est frustrant, et il en va de m\u00eame lorsque des changements sans r\u00e9trocompatibilit\u00e9 sont effectu\u00e9s dans les modules Terraform. Il est recommand\u00e9 d'appliquer des tags git et de la semver lors de l'utilisation des modules Terraform.<\/p>\n<p><\/p>\n<h3 id=\"proizvodstvennyy-servis-zapuschen-u-vas-na-noutbuke-ili-v-datacentre\">Votre service de production tourne sur votre ordinateur portable ou dans un centre de donn\u00e9es ?<\/h3>\n<p><\/p>\n<p>Hashicorp propose des outils comme <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/cloud\/index.html\">terraform cloud<\/a><\/noindex> pour ex\u00e9cuter votre terraform. Ces services centralis\u00e9s facilitent la gestion, l'audit et l'approbation des modifications terraform.<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-pishete-testy\">N'\u00e9crivez-vous pas de tests ?<\/h3>\n<p><\/p>\n<p>Les ing\u00e9nieurs reconnaissent qu'il faut tester le code, mais ils n\u00e9gligent souvent les v\u00e9rifications en travaillant avec Terraform. Pour l'infrastructure, cela entra\u00eene des moments d\u00e9licats. Je recommande de \u00ab tester \u00bb ou de \u00ab cr\u00e9er des exemples \u00bb de piles en utilisant des modules qui peuvent \u00eatre correctement d\u00e9ploy\u00e9s pour v\u00e9rification durant le CI\/CD.<\/p>\n<p><\/p>\n<h3 id=\"terraform-i-mikroservisy\">Terraform et microservices<\/h3>\n<p><\/p>\n<blockquote><p>La vie et la mort des entreprises de microservices d\u00e9pendent de la rapidit\u00e9, de la mise \u00e0 jour et de la destruction de nouveaux stacks de microservices.<\/p><\/blockquote>\n<p>Le principal inconv\u00e9nient commun associ\u00e9 aux architectures de microservices, dont on ne peut pas se d\u00e9barrasser, concerne le travail, et non le code. Si vous percevez Terraform uniquement comme un moyen d'automatiser le c\u00f4t\u00e9 infrastructure des architectures de microservices, vous vous privez des v\u00e9ritables avantages de ce syst\u00e8me. Maintenant d\u00e9j\u00e0, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=HcmPi7-IVQo\">tout est trait\u00e9 comme du code.<\/a><\/noindex>.<\/p>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/474546\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u0434\u0430 \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u044b\u0448\u0435\u0432\u043e\u0437\u0438\u0442\u044c. \u0417\u0430 \u044d\u0442\u043e\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439 \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u043b\u043e\u0441\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u2014 Infrastructure as Code, \u0438 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0434\u043b\u044f \u0435\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0438\u044f, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 AWS, \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430: Terraform \u0438 CloudFormation. \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Terraform \u0438 CloudFormation \u0414\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u0432 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-52367","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u0434\u0430 \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u044b\u0448\u0435\u0432\u043e\u0437\u0438\u0442\u044c.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0435\u0440\u0435\u0448\u0435\u043b \u0441 Terraform \u043d\u0430 CloudFormation \u2014 \u0438 \u043f\u043e\u0436\u0430\u043b\u0435\u043b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u0434\u0430 \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u044b\u0448\u0435\u0432\u043e\u0437\u0438\u0442\u044c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-11-06T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:00:04+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47J'ai migr\u00e9 de Terraform vers CloudFormation \u2014 et j'ai regrett\u00e9 | ProHoster","description":"Repr\u00e9senter l'infrastructure sous forme de code dans un format texte r\u00e9p\u00e9table est une meilleure pratique simple pour les syst\u00e8mes, sans n\u00e9cessiter de manipulation complexe.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0435\u0440\u0435\u0448\u0435\u043b \u0441 Terraform \u043d\u0430 CloudFormation \u2014 \u0438 \u043f\u043e\u0436\u0430\u043b\u0435\u043b | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u0434\u0430 \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u044b\u0448\u0435\u0432\u043e\u0437\u0438\u0442\u044c.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-11-06T21:00:00+00:00","article:modified_time":"2020-02-18T11:00:04+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52367","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 03:23:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:44:44","updated":"2026-01-24 03:23:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/52367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=52367"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/52367\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=52367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=52367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=52367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}