Je suis passé de Terraform à CloudFormation - et je l'ai regretté

ReprĂ©senter l'infrastructure sous forme de code dans un format texte reproductible est une bonne pratique simple pour les systĂšmes qui ne nĂ©cessitent pas de manipuler des souris. Cette pratique a un nom - L'infrastructure comme code, et jusqu'Ă  prĂ©sent, il existe deux outils populaires pour l'implĂ©menter, notamment dans AWS : Terraform Đž Formation Nuage.

Je suis passé de Terraform à CloudFormation - et je l'ai regretté
Comparaison de l'expérience avec Terraform et CloudFormation

Avant de venir à Twitch (Aka Amazon Jr.) J'ai travaillé dans une startup et a utilisé Terraform pendant trois ans. Dans mon nouvel endroit, j'ai également utilisé Terraform de toutes mes forces, puis l'entreprise a poussé la transition vers tout ce qui est à la Amazon, y compris CloudFormation. J'ai développé avec diligence les meilleures pratiques pour les deux et j'ai utilisé les deux outils dans des flux de travail trÚs complexes à l'échelle de l'organisation. Plus tard, aprÚs avoir soigneusement pesé les implications de la migration de Terraform vers CloudFormation, je suis devenu convaincu que Terraform était probablement le meilleur choix pour l'organisation.

Terraforme Horrible

Logiciel bĂȘta

Terraform n'a mĂȘme pas encore publiĂ© la version 1.0, ce qui est une bonne raison pour ne pas l'utiliser. Cela a beaucoup changĂ© depuis que je l'ai essayĂ© moi-mĂȘme, mais Ă  l'Ă©poque terraform apply souvent en panne aprĂšs plusieurs mises Ă  jour ou simplement aprĂšs quelques annĂ©es d'utilisation. Je dirais que « tout est diffĂ©rent maintenant », mais... c'est ce que tout le monde semble dire, non ? Certains changements sont incompatibles avec les versions prĂ©cĂ©dentes, bien qu'ils soient appropriĂ©s, et il semble mĂȘme que la syntaxe et les abstractions des magasins de ressources soient dĂ©sormais ce dont nous avons besoin. L'instrument semble s'ĂȘtre vraiment amĂ©liorĂ©, mais... :-0

D'un autre cÎté, AWS a fait du bon travail en maintenant la rétrocompatibilité. Cela est probablement dû au fait que leurs services sont souvent testés de maniÚre approfondie au sein de l'organisation et ensuite seulement, renommés, sont publiés. Donc « ils ont fait de gros efforts » est un euphémisme. Maintenir la compatibilité ascendante avec les API pour un systÚme aussi varié et complexe qu'AWS est incroyablement difficile. Quiconque a dû gérer des API publiques aussi largement utilisées doit comprendre à quel point il est difficile de le faire pendant tant d'années. Mais le comportement de CloudFormation, dans ma mémoire, n'a jamais changé au fil des années.

Rencontrez la jambe... c'est une balle

Pour autant que je sache, supprimez la ressource outsider La pile CloudFormation Ă  partir de votre pile CF n'est pas possible. La mĂȘme chose est vraie avec Terraform. Il vous permet d'importer des ressources existantes dans votre pile. La fonction peut ĂȘtre considĂ©rĂ©e comme Ă©tonnante, mais une grande puissance implique de grandes responsabilitĂ©s. Il vous suffit d'ajouter une ressource Ă  la pile, et pendant que vous travaillez avec votre pile, vous ne pouvez pas supprimer ou modifier cette ressource. Un jour, ça s’est retournĂ© contre moi. Un jour sur Twitch, quelqu'un a accidentellement importĂ© le groupe de sĂ©curitĂ© AWS de quelqu'un d'autre dans sa propre pile Terraform sans faire de mal. J'ai entrĂ© plusieurs commandes et... le groupe de sĂ©curitĂ© (ainsi que le trafic entrant) a disparu.

Terraforme génial

Récupération à partir d'états incomplets

Parfois, CloudFormation ne parvient pas Ă  passer complĂštement d'un Ă©tat Ă  un autre. En mĂȘme temps, il tentera de revenir au prĂ©cĂ©dent. C'est dommage que cela ne soit pas toujours rĂ©alisable. Il peut ĂȘtre assez effrayant de dĂ©boguer ce qui s'est passĂ© plus tard - on ne sait jamais si CloudFormation sera content qu'il soit piratĂ© - mĂȘme juste pour le rĂ©parer. Qu'il soit ou non possible de revenir Ă  l'Ă©tat antĂ©rieur, il ne sait vraiment pas comment le dĂ©terminer et, par dĂ©faut, reste suspendu pendant des heures en attendant un miracle.

Terraform, en revanche, a tendance à récupérer beaucoup plus facilement des transitions échouées et propose des outils de débogage avancés.

Des changements plus clairs dans l’état du document

« D'accord, Ă©quilibreur de charge, vous changez. Mais comment?"

—ingĂ©nieur anxieux, prĂȘt Ă  appuyer sur le bouton « accepter Â».

Parfois, je dois effectuer quelques manipulations avec l'équilibreur de charge dans la pile CloudFormation, comme ajouter un numéro de port ou modifier un groupe de sécurité. ClouFormation affiche mal les changements. Moi, sur des épingles et des aiguilles, je revérifie le fichier yaml dix fois pour m'assurer que je n'ai rien effacé de nécessaire et que je n'ai rien ajouté d'inutile.

Terraform est beaucoup plus transparent Ă  cet Ă©gard. Parfois, il est mĂȘme trop transparent (lire : ennuyeux). Heureusement, la derniĂšre version inclut un affichage amĂ©liorĂ© des modifications afin que vous puissiez dĂ©sormais voir exactement ce qui change.

Flexibilité

Écrivez le logiciel à l’envers.

Pour parler franchement, la caractĂ©ristique la plus importante d’un logiciel Ă  long terme est la capacitĂ© de s’adapter au changement. Écrivez n’importe quel logiciel Ă  l’envers. Le plus souvent, j'ai commis des erreurs en prenant un service « simple », puis en commençant Ă  tout regrouper dans une seule pile CloudFormation ou Terraform. Et bien sĂ»r, des mois plus tard, il s’est rĂ©vĂ©lĂ© que j’avais tout mal compris, et que le service n’était en fait pas simple ! Et maintenant, je dois d'une maniĂšre ou d'une autre diviser une grande pile en petits composants. Lorsque vous travaillez avec CloudFormation, cela ne peut ĂȘtre fait qu'en recrĂ©ant d'abord la pile existante, et je ne le fais pas avec mes bases de donnĂ©es. Terraform, en revanche, a permis de dissĂ©quer la pile et de la diviser en parties plus petites plus comprĂ©hensibles.

Modules dans Git

Le partage de code Terraform sur plusieurs piles est beaucoup plus simple que le partage de code CloudFormation. Avec Terraform, vous pouvez placer votre code dans un rĂ©fĂ©rentiel git et y accĂ©der Ă  l'aide du contrĂŽle de version sĂ©mantique. Toute personne ayant accĂšs Ă  ce rĂ©fĂ©rentiel peut rĂ©utiliser le code partagĂ©. L'Ă©quivalent de CloudFormation est S3, mais il n'a pas les mĂȘmes avantages, et il n'y a aucune raison pour que nous abandonnions git au profit de S3.

L'organisation s'est développée et la capacité à partager des piles communes a atteint un niveau critique. Terraform rend tout cela simple et naturel, tandis que CloudFormation vous fera franchir des obstacles avant de pouvoir faire fonctionner quelque chose comme ça.

Opérations en tant que code

"Écrivons-le et d'accord."

—ingĂ©nieur 3 ans avant d'inventer le vĂ©lo Terraform.

Lorsqu'il s'agit de développement de logiciels, Go ou un programme Java n'est pas seulement du code.

Je suis passé de Terraform à CloudFormation - et je l'ai regretté
Coder en tant que code

Il y a aussi l'infrastructure sur laquelle cela fonctionne.

Je suis passé de Terraform à CloudFormation - et je l'ai regretté
L'infrastructure comme code

Mais d'oĂč vient-elle ? Comment le surveiller ? OĂč rĂ©side votre code ? Les dĂ©veloppeurs ont-ils besoin d’une autorisation d’accĂšs ?

Je suis passé de Terraform à CloudFormation - et je l'ai regretté
Opérations en tant que code

Être dĂ©veloppeur de logiciels ne signifie pas seulement Ă©crire du code.

AWS n'est pas le seul : vous faites probablement appel Ă  d'autres fournisseurs. SignalFx, PagerDuty ou Github. Peut-ĂȘtre disposez-vous d'un serveur Jenkins interne pour CI/CD ou d'un tableau de bord Grafana interne pour la surveillance. Infra as Code est choisi pour diffĂ©rentes raisons, et chacune est tout aussi importante pour tout ce qui concerne les logiciels.

Lorsque je travaillais chez Twitch, nous avons accĂ©lĂ©rĂ© les services au sein des systĂšmes mixtes intĂ©grĂ©s et AWS d'Amazon. Nous avons produit et pris en charge de nombreux microservices, augmentant ainsi les coĂ»ts opĂ©rationnels. Les discussions se sont dĂ©roulĂ©es Ă  peu prĂšs comme ceci :

  • ĐŻ: Bon sang, ça fait beaucoup de gestes pour overclocker un microservice. Je vais devoir utiliser ces dĂ©chets pour crĂ©er un compte AWS (nous sommes allĂ©s sur 2 comptes sur microservice), puis celui-ci pour configurer des alertes, celui-ci pour un rĂ©fĂ©rentiel de code, et celui-ci pour une liste de diffusion, et puis celui-ci...
  • Conduire: Écrivons-le et d'accord.
  • ĐŻ: D'accord, mais le script lui-mĂȘme va changer. Nous aurons besoin d'un moyen de vĂ©rifier que tous ces gadgets Amazon intĂ©grĂ©s sont Ă  jour.
  • Conduire: Ça a l'air bien. Et nous Ă©crirons un script pour cela.
  • ĐŻ: Super! Et le script devra probablement encore dĂ©finir des paramĂštres. Les acceptera-t-il ?
  • Conduire: Laissez-le l'emmener partout oĂč il va !
  • ĐŻ: Le processus peut changer et la compatibilitĂ© ascendante sera perdue. Une sorte de contrĂŽle de version sĂ©mantique sera nĂ©cessaire.
  • Conduire: Bonne idĂ©e!
  • ĐŻ: Les outils peuvent ĂȘtre modifiĂ©s manuellement, dans l'interface utilisateur. Nous aurons besoin d'un moyen de vĂ©rifier et de rĂ©soudre ce problĂšme.


3 années plus tard:

  • Conduire: Et nous avons eu Terraform.

La morale de l'histoire est la suivante : mĂȘme si vous Ă©perdument dans tout ce qui concerne Amazon, vous utilisez toujours quelque chose qui ne vient pas d'AWS, et ces services ont un Ă©tat qui utilise un langage de configuration pour maintenir cet Ă©tat synchronisĂ©.

CloudFormation lambda vs modules git terraform

lambda est la solution de CloudFormation au problĂšme de logique personnalisĂ©e. Avec Lambda, vous pouvez crĂ©er des macros ou ressource utilisateur. Cette approche introduit des complexitĂ©s supplĂ©mentaires qui ne sont pas prĂ©sentes dans la gestion des versions sĂ©mantiques des modules git de Terraform. Pour moi, le problĂšme le plus urgent Ă©tait de gĂ©rer les autorisations pour tous ces utilisateurs lambdas (et ce sont des dizaines de comptes AWS). Un autre problĂšme important Ă©tait celui de « qu’est-ce qui est arrivĂ© en premier, la poule ou l’Ɠuf ? » : il Ă©tait liĂ© au code lambda. Cette fonction elle-mĂȘme est une infrastructure et du code, et elle nĂ©cessite elle-mĂȘme une surveillance et des mises Ă  jour. Le dernier clou du cercueil Ă©tait la difficultĂ© de mettre Ă  jour sĂ©mantiquement les modifications du code lambda ; nous devions Ă©galement nous assurer que les actions de pile sans commande directe ne changeaient pas entre les exĂ©cutions.

Je me souviens d'une fois, j'ai voulu crĂ©er un dĂ©ploiement Canary pour l'environnement Elastic Beanstalk avec un Ă©quilibreur de charge classique. La chose la plus simple Ă  faire serait d'effectuer un deuxiĂšme dĂ©ploiement pour l'EB Ă  cĂŽtĂ© de l'environnement de production, en allant encore plus loin : en combinant le groupe de dĂ©ploiement Canary Ă  mise Ă  l'Ă©chelle automatique avec le LB de dĂ©ploiement dans l'environnement de production. Et puisque Terraform utilise ASG beantalk en conclusion, cela nĂ©cessitera 4 lignes de code supplĂ©mentaires dans Terraform. Quand j'ai demandĂ© s'il existait une solution comparable dans CloudFormation, ils m'ont indiquĂ© un rĂ©fĂ©rentiel git complet avec un pipeline de dĂ©ploiement et tout, le tout dans le but de quelque chose que de pauvres 4 lignes de code Terraform pourraient faire.

Il détecte mieux la dérive

Assurez-vous que la réalité correspond aux attentes.

Détection de dérive est une fonctionnalité d'opérations en tant que code trÚs puissante car elle permet de garantir que la réalité correspond aux attentes. Il est disponible avec CloudFormation et Terraform. Mais à mesure que la pile de production grandissait, la recherche de dérives dans CloudFormation produisait de plus en plus de fausses détections.

Avec Terraform, vous disposez de crochets de cycle de vie beaucoup plus avancés pour la détection des dérives. Par exemple, vous entrez la commande ignore_changes directement dans la définition de tùche ECS si vous souhaitez ignorer les modifications apportées à une définition de tùche spécifique sans ignorer les modifications apportées à l'ensemble de votre déploiement ECS.

CDK et l'avenir de CloudFormation

CloudFormation est difficile à gérer à grande échelle et entre infrastructures. Beaucoup de ces difficultés sont reconnues et l'outil a besoin de choses comme aws-cdk, un cadre permettant de définir l'infrastructure cloud dans le code et de l'exécuter via AWS CloudFormation. Il sera intéressant de voir ce que l'avenir réserve à aws-cdk, mais il aura du mal à rivaliser avec les autres atouts de Terraform ; pour mettre CloudFormation à jour, des changements globaux seront nécessaires.

Pour que Terraform ne déçoive pas

Il s’agit d’une « infrastructure en tant que code » et non « en tant que texte ».

Ma premiĂšre impression de Terraform Ă©tait plutĂŽt mauvaise. Je pense que je n'ai tout simplement pas compris l'approche. Presque tous les ingĂ©nieurs le perçoivent involontairement comme un format de texte qui doit ĂȘtre converti en l'infrastructure souhaitĂ©e. NE LE FAITES PAS DE CETTE FAÇON.

Les truismes d'un bon développement logiciel s'appliquent également à Terraform.

J'ai vu de nombreuses pratiques adoptées pour créer un bon code ignorées dans Terraform. Vous avez étudié pendant des années pour devenir un bon programmeur. N'abandonnez pas cette expérience simplement parce que vous travaillez avec Terraform. Les truismes d'un bon développement logiciel s'appliquent à Terraform.

Comment le code peut-il ne pas ĂȘtre documentĂ© ?

J'ai vu d'Ă©normes piles Terraform sans aucune documentation. Comment pouvez-vous Ă©crire du code dans des pages - sans aucune documentation ? Ajoutez une documentation qui explique votre code Terraform (accent mis sur le mot « code »), pourquoi cette section est si importante et ce que vous faites.

Comment pouvons-nous dĂ©ployer des services qui Ă©taient autrefois une grande fonction main() ?

J'ai vu des piles Terraform trĂšs complexes prĂ©sentĂ©es comme un seul module. Pourquoi ne dĂ©ployons-nous pas les logiciels de cette façon ? Pourquoi divisons-nous les grandes fonctions en fonctions plus petites ? Les mĂȘmes rĂ©ponses s'appliquent Ă  Terraform. Si votre module est trop volumineux, vous devez le diviser en modules plus petits.

Votre entreprise n'utilise-t-elle pas de bibliothĂšques ?

J'ai vu comment des ingĂ©nieurs, lançant un nouveau projet Ă  l'aide de Terraform, copiaient bĂȘtement d'Ă©normes morceaux d'autres projets dans le leur, puis les bricolaient jusqu'Ă  ce qu'ils commencent Ă  fonctionner. Travailleriez-vous ainsi avec le code « combat » dans votre entreprise ? Nous n'utilisons pas seulement les bibliothĂšques. Oui, tout ne doit pas nĂ©cessairement ĂȘtre une bibliothĂšque, mais oĂč en sommes-nous sans bibliothĂšques partagĂ©es en principe ?!

N'utilisez-vous pas PEP8 ou gofmt ?

La plupart des langues ont un schĂ©ma de formatage standard acceptĂ©. En Python, c'est PEP8. Dans Go - gofmt. Terraform a les siens : terraform fmt. Profitez-en pour votre santĂ© !

Utiliserez-vous React sans connaĂźtre JavaScript ?

Les modules Terraform peuvent simplifier certaines parties de l'infrastructure complexe que vous crĂ©ez, mais cela ne signifie pas que vous ne pouvez pas du tout la bricoler. Vous souhaitez utiliser Terraform correctement sans comprendre les ressources ? Vous ĂȘtes condamnĂ© : le temps passera et vous ne maĂźtriserez jamais Terraform.

Codez-vous avec des singletons ou une injection de dĂ©pendances ?

L'injection de dĂ©pendances est une bonne pratique reconnue pour le dĂ©veloppement de logiciels et est prĂ©fĂ©rĂ©e aux singletons. En quoi est-ce utile dans Terraform ? J'ai vu des modules Terraform qui dĂ©pendent de l'Ă©tat distant. Au lieu d'Ă©crire des modules qui rĂ©cupĂšrent l'Ă©tat distant, Ă©crivez un module qui prend des paramĂštres. Et puis transmettez ces paramĂštres au module.

Vos bibliothĂšques font-elles dix choses bien ou une chose gĂ©niale ?

Les bibliothĂšques qui fonctionnent le mieux sont celles qui se concentrent sur une tĂąche qu’elles accomplissent trĂšs bien. Au lieu d'Ă©crire de gros modules Terraform qui essaient de tout faire en mĂȘme temps, crĂ©ez-en des parties qui font bien une chose. Et puis combinez-les selon vos besoins.

Comment apporter des modifications aux bibliothĂšques sans rĂ©trocompatibilitĂ© ?

Un module Terraform commun, comme une bibliothĂšque classique, doit d'une maniĂšre ou d'une autre communiquer les modifications aux utilisateurs sans ĂȘtre rĂ©trocompatible. C'est ennuyeux lorsque ces changements se produisent dans les bibliothĂšques, et c'est tout aussi ennuyeux lorsque des modifications non rĂ©trocompatibles sont apportĂ©es aux modules Terraform. Il est recommandĂ© d'utiliser les balises git et semver lors de l'utilisation des modules Terraform.

Votre service de production fonctionne-t-il sur votre ordinateur portable ou dans un centre de donnĂ©es ?

Hashicorp dispose d'outils comme nuage terraformé pour exécuter votre terraform. Ces services centralisés facilitent la gestion, l'audit et l'approbation des modifications Terraform.

Vous n'écrivez pas de tests ?

Les ingĂ©nieurs reconnaissent que le code doit ĂȘtre testĂ©, mais eux-mĂȘmes oublient souvent les tests lorsqu'ils travaillent avec Terraform. Pour les infrastructures, c'est semĂ© d'embĂ»ches. Mon conseil est de « tester » ou de « crĂ©er des exemples » de piles en utilisant des modules qui peuvent ĂȘtre dĂ©ployĂ©s correctement pour les tests pendant CI/CD.

Terraform et microservices

La vie et la mort des entreprises de microservices dĂ©pendent de la rapiditĂ©, de l’innovation et de la perturbation des nouvelles piles de travail de microservices.

L’aspect nĂ©gatif le plus courant associĂ© aux architectures de microservices, et qui ne peut ĂȘtre Ă©liminĂ©, est liĂ© au travail et non au code. Si vous considĂ©rez Terraform comme un simple moyen d'automatiser uniquement le cĂŽtĂ© infrastructure d'une architecture de microservices, vous passez Ă  cĂŽtĂ© des vĂ©ritables avantages du systĂšme. Maintenant c'est dĂ©jĂ  tout est comme du code.

Source: habr.com

Achetez un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Achetez un hĂ©bergement web fiable avec protection DDoS, serveurs VPS et VDS | ProHoster