Déplacé de Terraform vers CloudFormation - et regretté

La présentation de l'infrastructure sous forme de code au format texte reproductible est une pratique exemplaire simple pour les systèmes avec lesquels vous n'avez pas besoin de vous déplacer. Cette pratique a un nom - Infrastructure as Code , et jusqu'à présent, il existe deux outils populaires pour sa mise en œuvre, en particulier dans AWS: Terraform et CloudFormation .



Comparez l'expérience avec Terraform et CloudFormation


Avant de rejoindre Twitch (alias Amazon Jr. ), j'ai travaillé dans une startup et utilisé Terraform pendant trois ans. Dans un nouvel endroit, j'ai également utilisé Terraform avec force et main, puis la société a poussé la transition vers tout ce qui se passe sur Amazon, y compris CloudFormation. J'ai travaillé dur pour développer les meilleures pratiques pour les deux, et j'ai utilisé les deux outils dans des workflows très complexes à travers l'organisation. Plus tard, après avoir soigneusement examiné les conséquences du passage de Terraform à CloudFormation, je suis devenu convaincu que Terraform était probablement le meilleur choix pour l'organisation.


Terraform Horrible


Logiciel bêta


Terraform n'a même pas sorti la version 1.0, et c'est une bonne raison de ne pas l'utiliser. Depuis que je l'ai testé moi-même, il a beaucoup changé, mais l' terraform apply s'est souvent cassée après plusieurs mises à jour ou juste après quelques années de fonctionnement. Je dirais que "maintenant tout est différent", mais ... alors tout le monde semble dire non? Il y a des changements qui sont incompatibles avec les versions précédentes, bien qu'ils soient appropriés, et même le sentiment est que la syntaxe et les abstractions des stockages de ressources sont maintenant ce dont vous avez besoin. L'outil semblait être meilleur, mais ...: -0


AWS, d'autre part, a fait du bon travail pour maintenir la compatibilité avec les versions précédentes. Tout cela, probablement, parce que leurs services sont souvent bien testés au sein de l'organisation et seulement alors, renommés, publiés. Donc, "essayé dur" est encore faiblement dit. Il est extrêmement difficile de maintenir la compatibilité avec les versions précédentes de l'API pour un système aussi multivarié et complexe comme AWS. Quiconque a dû prendre en charge des API accessibles au public qui sont utilisées aussi largement devrait comprendre à quel point cela a été difficile pendant tant d'années. Mais le comportement de CloudFormation dans ma mémoire n'a jamais changé au fil des ans.


Rencontrez la jambe ... c'est une balle


Pour autant que je sache, il n'est pas possible de supprimer une ressource de pile CloudFormation tierce de ma pile CF. La situation est similaire avec Terraform. Il vous permet d'importer des ressources existantes dans votre pile. On pourrait dire que la fonction est impressionnante, mais avec une grande puissance vient une grande responsabilité. Il suffit de placer la ressource sur la pile, et pendant que vous travaillez avec votre pile, vous ne pouvez pas supprimer ou modifier cette ressource. Une fois arrivé. D'une manière ou d'une autre, sur un site Twitch, quelqu'un, sans rien tracer de mal, a accidentellement importé un groupe de sécurité AWS dans sa propre pile Terraform. J'ai entré plusieurs commandes et ... le groupe de sécurité (ainsi que le trafic entrant) a disparu.


Terraform Great


Récupération partielle


Parfois, CloudFormation ne peut pas passer complètement d'un état à un autre. En même temps, il tentera de revenir à la précédente. Désolé, ce n'est pas toujours possible. Ensuite, le débogage de ce qui s'est passé est effrayant - vous ne savez jamais si CloudFormation sera ravi qu'il soit fissuré - même pour la réparation. Mais réussira-t-il ou ne reviendra-t-il pas à l'état précédent, il ne sait vraiment pas comment le déterminer, et par défaut il se bloque pendant des heures en attendant un miracle.


Terraform, au contraire, est enclin à se remettre des transitions infructueuses beaucoup plus élégamment et propose des outils de débogage avancés.


Changements plus clairs dans l'état du document


"D'accord, l'équilibreur de charge, vous changez. Mais comment?"

—Un ingénieur inquiet prêt à appuyer sur le bouton d'acceptation.

Parfois, j'ai besoin de faire quelques manipulations avec l'équilibreur de charge dans la pile CloudFormation - par exemple, ajouter un numéro de port ou changer un groupe de sécurité. Les modifications de CloudFormation s'affichent faiblement. Comme pour les aiguilles, je revérifie le fichier yaml dix fois pour m'assurer que je n'ai pas effacé tout ce dont j'avais besoin et que je n'en ai pas ajouté trop.


Terraform est beaucoup plus transparent à cet égard. Parfois, il est même trop transparent (lire: l'obtient). Heureusement, la dernière version comprenait un affichage amélioré des modifications - vous pouvez maintenant voir clairement ce qui change.


Flexibilité


Écrivez le logiciel de l'opposé.

Pour le dire franchement, la caractéristique distinctive la plus importante d'un logiciel à longue durée de vie est sa capacité à s'adapter au changement. Écrivez n'importe quel logiciel du contraire. J'ai souvent percé que j'avais pris un service "simple", puis j'ai commencé à tout pousser dans une seule pile CloudFormation ou Terraform. Et bien sûr, des mois plus tard, il a été révélé que j'avais tout mal compris, et le service n'est en fait pas simple! Et donc je dois en quelque sorte casser une grande pile en petits composants. Lorsque vous travaillez avec CloudFormation, il est possible de le faire uniquement en recréant d'abord la pile existante, mais je ne le fais pas avec mes bases de données. Terraform, d'autre part, a permis de disséquer la pile et de la diviser en plus petites parties plus compréhensibles.


Modules en git


Le partage de code Terraform sur plusieurs piles est beaucoup plus facile que le partage de code CloudFormation. Avec Terraform, vous pouvez mettre du code dans un référentiel git et y accéder en utilisant le 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 pas une seule raison pour laquelle nous devrions abandonner complètement git en faveur de S3.


L'organisation s'est développée et la capacité de partager des piles partagées a atteint un niveau critique. Avec Terraform, tout cela est facile et naturel, tandis que CloudFormation vous fera sauter à travers les anneaux avant d'obtenir quelque chose de similaire.


Opérations comme code


"Let's script et d'accord."

—Un ingénieur 3 ans avant d'inventer le vélo Terraform.

En matière de développement logiciel, Go ou un programme Java n'est pas seulement du code.



Code comme code


Après tout, il reste l'infrastructure sur laquelle il fonctionne.



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?



Opérations comme code


Être développeur de logiciels ne consiste pas seulement à écrire du code.

Pas AWS One: vous devez utiliser d'autres fournisseurs. SignalFx, PagerDuty ou Github. Peut-être avez-vous un serveur Jenkins interne pour CI / CD ou un panneau de contrôle Grafana interne pour la surveillance. Infra as Code est choisi pour diverses raisons, et tout est également important pour tout ce qui concerne les logiciels.


Lorsque je travaillais chez Twitch, nous avons accéléré les services au sein des systèmes embarqués mixtes d'Amazon et des systèmes AWS. Nous avons tamponné et pris en charge de nombreux microservices, augmentant ainsi les coûts d'exploitation. Les discussions ont eu lieu dans la veine suivante:


  • Moi : Merde, beaucoup de gestes pour disperser un microservice. Je vais devoir utiliser ces ordures pour créer un compte AWS (nous sommes allés à 2 comptes pour le microservice ), puis celui-ci pour configurer les notifications, celui-ci pour le référentiel de code, et celui-ci pour la liste des adresses e-mail, et celui-ci .. .
  • Lead : Let's script et d'accord.
  • Moi : Frets, mais le script lui-même va changer. Vous aurez besoin d'un moyen de vérifier que tous ces gadgets amazon intégrés sont à jour.
  • Plomb : Ça sonne bien. Et pour cela, nous allons écrire un script.
  • Moi : Génial! Et le script devra probablement encore définir les paramètres. Va-t-il les accepter?
  • Lead : Oui, il le fera, où ira-t-il!
  • Moi : Le processus peut changer, la rétrocompatibilité sera perdue. Il faudra un certain contrôle de version sémantique.
  • Lead : Excellente idée!
  • Moi : Les outils peuvent être modifiés manuellement, à l'intérieur de l'interface utilisateur. Nous avons besoin d'un moyen de vérifier et de corriger cela.

... 3 ans plus tard:


  • Lead : Et nous avons eu la terraform.

La morale de la fable est la suivante: même si vous êtes dans tous les états d'Amazon , vous utilisez toujours quelque chose qui n'est pas d'AWS, et ces services ont un état que le langage utilise pour la configuration afin de synchroniser cet état.


CloudFormation lambda vs git modules terraform


lambda est la solution de CloudFormation pour les problèmes de logique personnalisée. Avec lambda, vous pouvez créer des macros ou une ressource personnalisée . Cette approche présente des difficultés supplémentaires que Terraform n'a pas dans le contrôle de version sémantique des modules git. Pour moi, le problème le plus urgent était la gestion des autorisations pour tous ces lambda personnalisés (qui sont des dizaines de comptes AWS). Un autre en importance était un problème comme «qu'est-il arrivé avant - un poulet ou un œuf?»: Il était associé au code lambda. Cette fonction elle-même est une infrastructure et du code, et elle-même nécessite une surveillance et des mises à jour. Le dernier point fort du cercueil a été la difficulté de mettre à jour sémantiquement les modifications du code lambda; il fallait également s'assurer que les actions de la pile sans commande directe ne changent pas entre les démarrages.


Je me souviens en quelque sorte que je voulais créer un déploiement canari pour l'environnement Elastic Beanstalk avec un équilibreur de charge classique. Le moyen le plus simple serait de faire un deuxième déploiement pour EB à côté de l'environnement de production, en franchissant une autre étape: en combinant le groupe de déploiement canary automatiquement évolutif avec le LB de déploiement dans l'environnement de production. Et comme Terraform utilise le beantalk ASG en sortie , il faudra 4 lignes de code supplémentaires dans Terraform. Quand j'ai demandé s'il y avait une solution comparable dans CloudFormation, ils m'ont indiqué un référentiel entier dans git avec un pipeline de déploiement et plus encore: tout cela pour ce que les malheureuses 4 lignes de code Terraform pouvaient faire.


Il détecte mieux la dérive


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

La détection de dérive est une opération très puissante en tant que code, car elle permet de s'assurer que la réalité répond aux attentes. Il est disponible avec CloudFormation et Terraform. Mais à mesure que la pile de travail augmentait, la recherche de dérive de CloudFormation retournait de plus en plus de faux positifs.


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


CDK et l'avenir de CloudFormation


CloudFormation est difficile à gérer à grande échelle et multi-infrastructures. Beaucoup de ces difficultés sont reconnues, et l'outil a besoin de choses comme aws-cdk , un cadre pour définir une infrastructure cloud dans le code et la faire passer par AWS CloudFormation. Il sera curieux de voir ce que aws-cdk aura à l'avenir, mais il lui sera difficile de rivaliser avec les autres avantages de Terraform; pour resserrer CloudFormation, des changements globaux seront nécessaires.


Terraform ne déçoit donc pas


Il s'agit de «l'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 d'abord involontairement comme un format de texte qui doit être converti en l'infrastructure souhaitée. NE LE FAITES PAS.


Les vérités courantes d'un bon développement logiciel s'appliquent à Terraform


J'ai vu combien de pratiques adoptées pour créer un bon code sont 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 vérités courantes d'un bon développement logiciel s'appliquent également à Terraform.


Comment le code ne peut-il pas être documenté?


Je suis tombé sur d'énormes piles Terraform sans aucune documentation. Comment puis-je écrire du code dans les pages - complètement sans documentation? Ajoutez une documentation qui explique votre code Terraform (l'accent est mis ici sur le mot "code"), pourquoi cette section est si importante et ce que vous faites.


Comment pouvez-vous déployer des services qui étaient autrefois une grande fonction principale ()?


J'ai rencontré des piles Terraform très complexes, présentées comme un module unique. Pourquoi ne déployons-nous pas un logiciel comme celui-ci? Pourquoi diviser les grandes fonctions en plus petites? Les mêmes réponses s'appliquent à Terraform. Si votre module est trop grand, vous devez le diviser en modules plus petits.


Votre entreprise n'utilise-t-elle pas les bibliothèques?


J'ai vu comment des ingénieurs, faisant tourner un nouveau projet en utilisant Terraform, copiaient bêtement d'énormes morceaux d'autres projets dans les leurs, puis les sélectionnaient jusqu'à ce qu'il commence à fonctionner. Travailleriez-vous donc dans votre entreprise avec le code «combat»? Nous n'utilisons pas seulement des bibliothèques. Oui, tout ne devrait pas ê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. À Go - gofmt. Terraform a la sienne: terraform fmt . Utilisez pour la santé!


Allez-vous utiliser React sans connaître JavaScript?


Les modules Terraform peuvent simplifier une partie de l'infrastructure complexe que vous créez, mais cela ne signifie pas que vous pouvez l'ignorer du tout. Vous voulez utiliser Terraform correctement sans comprendre les ressources? Vous êtes condamné: le temps passera, mais vous ne maîtriserez pas Terraform.


Codez-vous des singletones ou introduisez-vous des dépendances?


L'injection de dépendance est la meilleure pratique reconnue pour le développement de logiciels, qui est préférée par les singletones. Comment est-ce utile dans Terraform? J'ai rencontré des modules Terraform en fonction d'un état distant. Au lieu d'écrire des modules qui extraient d'un état distant, écrivez un module qui accepte des paramètres. Et passez ensuite ces paramètres au module.


Vos bibliothèques font-elles bien dix choses, ou une bonne chose?


Les bibliothèques qui se concentrent sur une seule tâche et qui fonctionnent parfaitement bien. Au lieu d'écrire de grands modules Terraform qui essaient de tout faire en même temps, faites-en des parties qui font bien une chose. Et puis combinez-les comme vous le souhaitez.


Comment apportez-vous des modifications aux bibliothèques sans compatibilité descendante?


Le module général Terraform, comme une bibliothèque ordinaire, doit en quelque sorte informer les utilisateurs des changements sans compatibilité ascendante. Lorsque de tels changements se produisent dans les bibliothèques, c'est ennuyeux et tout aussi ennuyeux lorsque des changements sans compatibilité ascendante sont effectués dans les modules Terraform. Il est recommandé d'utiliser les balises git et semver lors de l'utilisation des modules Terraform.


Le service de production est-il lancé sur votre ordinateur portable ou dans un centre de données?


Hashicorp dispose d'outils comme le terraform cloud pour lancer votre terraform. Ces services centralisés facilitent la gestion, l'audit et l'approbation des modifications de terraform.


Tu ne fais pas de tests?


Les ingénieurs admettent que le code doit être testé, mais ils martèlent souvent eux-mêmes les vérifications lorsqu'ils travaillent avec Terraform. Pour les infrastructures, cela est semé de moments insidieux. Je vous conseille de "tester" ou "créer des exemples" de piles en utilisant des modules qui peuvent être correctement déployés pour vérification lors de CI / CD.


Terraform et microservices


La durée de vie et la mort des sociétés de microservices dépendent de la vitesse, de la mise à jour et de la destruction des nouvelles piles de travaux de microservices.

Le point négatif le plus courant lié aux architectures de microservices et qui ne peut en aucun cas être éliminé est lié au travail et non au code. Si vous prenez Terraform, uniquement pour automatiser uniquement le côté infrastructure de l'architecture de microservices, vous vous privez des véritables avantages de ce système. Maintenant, tout est comme du code .

Source: https://habr.com/ru/post/fr474546/


All Articles