Von Terraform zu CloudFormation gewechselt - und es bereut

Die Darstellung der Infrastruktur als Code in einem wiederholbaren Textformat ist eine einfache bewährte Methode für Systeme, mit denen Sie nichts zu tun haben. Diese Vorgehensweise hat einen Namen - Infrastruktur als Code . Bisher gibt es zwei beliebte Tools für die Implementierung, insbesondere in AWS: Terraform und CloudFormation .



Vergleichen Sie die Erfahrungen mit Terraform und CloudFormation


Bevor ich zu Twitch (aka Amazon Jr. ) kam, arbeitete ich in einem Startup und benutzte Terraform drei Jahre lang. An einem neuen Ort habe ich Terraform auch mit Macht und Kraft verwendet, und dann hat das Unternehmen den Übergang zu allem a la Amazon vorangetrieben, einschließlich CloudFormation. Ich habe hart gearbeitet, um Best Practices für beide zu entwickeln, und ich habe beide Tools in sehr komplexen Workflows im gesamten Unternehmen verwendet. Später, nachdem ich die Konsequenzen des Wechsels von Terraform zu CloudFormation sorgfältig geprüft hatte, wurde ich überzeugt, dass Terraform wahrscheinlich die beste Wahl für das Unternehmen war.


Terraform schrecklich


Beta-Software


Terraform hat noch nicht einmal Version 1.0 veröffentlicht, und dies ist ein guter Grund, sie nicht zu verwenden. Seit ich es zum ersten Mal selbst getestet habe, hat es sich stark verändert, aber dann ist die terraform apply oft nach mehreren Updates oder nur nach ein paar Betriebsjahren unterbrochen. Ich würde sagen, dass "jetzt alles anders ist", aber ... also scheint jeder nein zu sagen? Es gibt Änderungen, die mit früheren Versionen nicht kompatibel sind, obwohl sie angemessen sind, und sogar das Gefühl ist, dass die Syntax und Abstraktionen von Ressourcenspeichern jetzt genau das sind, was Sie brauchen. Das Tool schien besser zu sein, aber ...: -0


AWS hingegen hat gute Arbeit geleistet, um die Kompatibilität mit früheren Versionen aufrechtzuerhalten. Alle, wahrscheinlich, weil ihre Dienste innerhalb der Organisation häufig gut getestet und erst dann umbenannt und veröffentlicht werden. Also "bemüht" wird immer noch schwach gesagt. Die Kompatibilität mit früheren Versionen der API für ein derart multivariates und komplexes System wie AWS aufrechtzuerhalten, ist unglaublich schwierig. Jeder, der öffentlich verfügbare APIs unterstützen musste, die genauso häufig verwendet werden, sollte verstehen, wie schwierig dies seit so vielen Jahren ist. Aber das Verhalten von CloudFormation in meinem Gedächtnis hat sich im Laufe der Jahre nie geändert.


Treffen Sie das Bein ... es ist eine Kugel


Soweit ich weiß, ist es nicht möglich, eine CloudFormation-Stack-Ressource eines Drittanbieters von meinem CF-Stack zu entfernen. Ähnlich ist die Situation bei Terraform. Hiermit können Sie vorhandene Ressourcen in Ihren Stack importieren. Die Funktion, könnte man sagen, ist großartig, aber mit großer Kraft geht große Verantwortung einher. Sie müssen nur die Ressource auf den Stapel legen, und während Sie mit Ihrem Stapel arbeiten, können Sie diese Ressource nicht löschen oder ändern. Einmal kam es vorbei. Irgendwie hat auf einer Twitch-Site jemand versehentlich eine AWS-Sicherheitsgruppe in seinen eigenen Terraform-Stapel importiert, ohne dass ein Fehler aufgetreten ist. Ich habe mehrere Befehle eingegeben und ... die Sicherheitsgruppe (zusammen mit dem eingehenden Datenverkehr) ist verschwunden.


Terraform Großartig


Teilweise Wiederherstellung


Manchmal kann CloudFormation nicht vollständig von einem Status in einen anderen wechseln. Gleichzeitig wird er versuchen, zum vorherigen zurückzukehren. Sorry, das ist nicht immer machbar. Dann ist das Debuggen von Ereignissen beängstigend - Sie wissen nie, ob CloudFormation sich darüber freuen wird, dass es geknackt ist - selbst zur Reparatur. Aber wird er Erfolg haben oder nicht in den vorherigen Zustand zurückkehren, weiß er wirklich nicht, wie er es bestimmen soll, und standardmäßig hängt er stundenlang auf ein Wunder.


Terraform hingegen neigt dazu, sich von erfolglosen Übergängen viel eleganter zu erholen, und bietet fortschrittliche Debugging-Tools.


Deutlichere Änderungen im Dokumentstatus


"Okay, Load Balancer, Sie wechseln. Aber wie?"

- Ein besorgter Ingenieur, der bereit ist, die Bestätigungstaste zu drücken.

Manchmal muss ich mit dem Lastenausgleich im CloudFormation-Stapel einige Änderungen vornehmen, z. B. eine Portnummer hinzufügen oder eine Sicherheitsgruppe ändern. CloudFormation-Änderungen werden schwach angezeigt. Wie bei Nadeln überprüfe ich die Yaml-Datei zehnmal, um sicherzustellen, dass ich nichts gelöscht habe, was ich brauchte, und nicht zu viel hinzugefügt habe.


Terraform ist in dieser Hinsicht viel transparenter. Manchmal ist es sogar zu transparent (lesen: bekommt es). Glücklicherweise enthielt die neueste Version eine verbesserte Anzeige von Änderungen - jetzt können Sie deutlich sehen, was sich ändert.


Flexibilität


Schreiben Sie Software vom Gegenteil.

Kurz gesagt, das wichtigste Unterscheidungsmerkmal langlebiger Software ist ihre Fähigkeit, sich an Veränderungen anzupassen. Schreiben Sie eine Software vom Gegenteil. Ich habe oft gemerkt, dass ich einen "einfachen" Dienst in Anspruch genommen habe und dann angefangen habe, alles in einen einzelnen CloudFormation- oder Terraform-Stapel zu packen. Und natürlich stellte sich Monate später heraus, dass ich alles falsch verstanden habe und der Service eigentlich nicht einfach ist! Und so muss ich irgendwie einen großen Stapel in kleine Komponenten aufteilen. Wenn Sie mit CloudFormation arbeiten, ist dies nur möglich, indem Sie zuerst den vorhandenen Stapel neu erstellen. Dies ist jedoch bei meinen Datenbanken nicht der Fall. Terraform hingegen ermöglichte es, den Stapel zu zerlegen und in verständlichere kleinere Teile aufzuteilen.


Module in Git


Das Teilen von Terraform-Code über mehrere Stapel hinweg ist viel einfacher als das Teilen von CloudFormation-Code. Mit Terraform können Sie Code in ein Git-Repository einfügen und mithilfe der semantischen Versionskontrolle darauf zugreifen. Jeder, der Zugriff auf dieses Repository hat, kann den freigegebenen Code wiederverwenden. Das Äquivalent zu CloudFormation ist S3, aber es hat nicht die gleichen Vorteile, und es gibt keinen einzigen Grund, warum wir git vollständig zugunsten von S3 aufgeben sollten.


Die Organisation wuchs und die Fähigkeit, gemeinsam genutzte Stapel zu teilen, erreichte ein kritisches Niveau. Mit Terraform ist dies alles einfach und natürlich, während CloudFormation Sie durch die Ringe springen lässt, bevor Sie etwas Ähnliches erhalten.


Operationen als Code


"Lass uns schreiben und okay."

- Ein Ingenieur 3 Jahre vor der Erfindung des Terraform-Fahrrads.

Bei der Softwareentwicklung ist Go oder ein Java-Programm nicht nur Code.



Code als Code


Immerhin gibt es noch die Infrastruktur, auf der es funktioniert.



Infrastruktur als Code


Aber wo kommt sie her? Wie kann man es überwachen? Wo befindet sich Ihr Code? Benötigen Entwickler Zugriffsberechtigungen?



Operationen als Code


Als Softwareentwickler müssen Sie nicht nur Code schreiben.

Nicht AWS One: Sie müssen andere Anbieter verwenden. SignalFx, PagerDuty oder Github. Möglicherweise haben Sie einen internen Jenkins-Server für CI / CD oder ein internes Grafana-Bedienfeld zur Überwachung. Infra as Code wird aus verschiedenen Gründen gewählt und jeder ist für alles, was mit Software zu tun hat, gleichermaßen wichtig.


Als ich bei Twitch arbeitete, haben wir die Services in den gemischten eingebetteten Systemen und AWS-Systemen von Amazon beschleunigt. Wir haben viele Microservices abgestempelt und unterstützt, was die Betriebskosten erhöht. Die Diskussionen wurden in etwa folgender Weise geführt:


  • Ich : Verdammt, viele Gesten, um einen Microservice zu zerstreuen. Ich muss diesen Müll verwenden, um ein AWS-Konto zu erstellen (wir haben 2 Konten für Microservice aufgerufen ), dann dieses, um Warnungen einzurichten, dieses für das Code-Repository und dieses für die Liste der E-Mail-Adressen und dieses. .
  • Blei : Lassen Sie uns Skript und okay.
  • Me : Frets, aber das Skript selbst wird sich ändern. Sie müssen überprüfen, ob alle diese eingebauten Amazon Gizmos auf dem neuesten Stand sind.
  • Blei : Hört sich gut an. Und dafür schreiben wir ein Skript.
  • Ich : Großartig! Und das Skript muss wahrscheinlich noch die Parameter einstellen. Wird er sie akzeptieren?
  • Blei : Ja, er wird, wohin wird er gehen!
  • Ich : Der Prozess kann sich ändern, die Abwärtskompatibilität geht verloren. Es wird eine semantische Versionskontrolle erfordern.
  • Blei : Tolle Idee!
  • Ich : Werkzeuge können manuell über die Benutzeroberfläche geändert werden. Wir brauchen eine Möglichkeit, dies zu überprüfen und zu beheben.

... 3 Jahre später:


  • Blei : Und wir haben Terraform.

Die Moral der Fabel lautet: Auch wenn Sie in ganz Amazonien Hals über Kopf sind , verwenden Sie etwas, das nicht von AWS stammt, und diese Dienste haben einen Status, den die Sprache für die Konfiguration verwendet, um diesen Status zu synchronisieren.


CloudFormation Lambda vs Git Module Terraform


Lambda ist die CloudFormation-Lösung für benutzerdefinierte Logikprobleme. Mit Lambda können Sie Makros oder benutzerdefinierte Ressourcen erstellen . Dieser Ansatz bietet zusätzliche Schwierigkeiten, die Terraform bei der semantischen Versionskontrolle von Git-Modulen nicht hat. Für mich war das dringlichste Problem die Verwaltung der Berechtigungen für all diese benutzerdefinierten Lambda (bei denen es sich um Dutzende von AWS-Konten handelt). Ein weiteres wichtiges Problem war ein Problem wie „Was ist vorher passiert - ein Huhn oder ein Ei?“: Es wurde mit dem Lambda-Code in Verbindung gebracht. Diese Funktion selbst ist Infrastruktur und Code und muss selbst überwacht und aktualisiert werden. Das letzte Highlight im Sarg war die Schwierigkeit, Änderungen am Lambda-Code semantisch zu aktualisieren. Es musste auch sichergestellt werden, dass sich die Aktionen des Stapels ohne direkten Befehl zwischen den Starts nicht ändern.


Ich erinnere mich, dass ich irgendwie eine kanarische Bereitstellung für die Elastic Beanstalk-Umgebung mit einem klassischen Load Balancer erstellen wollte. Am einfachsten wäre es, eine zweite Bereitstellung für EB neben der Produktionsumgebung vorzunehmen und einen weiteren Schritt zu unternehmen: indem die automatisch skalierbare Canary-Bereitstellungsgruppe mit der Bereitstellungs-LB in der Produktionsumgebung kombiniert wird. Und da Terraform den ASG-Antrag als Ausgabe verwendet , werden in Terraform 4 zusätzliche Codezeilen benötigt. Als ich fragte, ob es eine vergleichbare Lösung in CloudFormation gibt, verwiesen sie mich auf ein ganzes Repository in Git mit einer Bereitstellungspipeline und mehr: all dies, um die unglücklichen 4 Zeilen Terraform-Code zu unterstützen.


Er erkennt besser Drift


Stellen Sie sicher, dass die Realität den Erwartungen entspricht.

Die Drifterkennung ist eine sehr leistungsfähige Operation als Code, da sie dazu beiträgt, dass die Realität den Erwartungen entspricht. Es ist sowohl mit CloudFormation als auch mit Terraform verfügbar. Mit der Zunahme des Arbeitsstapels ergab die Driftsuche von CloudFormation jedoch immer mehr Fehlalarme.


Mit Terraform verfügen Sie über wesentlich fortschrittlichere Lifecycle-Hooks zur Drifterkennung. Beispielsweise geben Sie den Befehl ignore_changes direkt in die Definition einer ECS-Aufgabe ein, wenn Sie Änderungen in der Definition einer bestimmten Aufgabe ignorieren möchten, ohne Änderungen in der gesamten ECS-Bereitstellung zu ignorieren.


CDK und die Zukunft von CloudFormation


CloudFormation ist im großen, infrastrukturübergreifenden Maßstab schwer zu verwalten. Viele dieser Schwierigkeiten werden erkannt, und das Tool benötigt Dinge wie aws-cdk , ein Framework zum Definieren einer Cloud-Infrastruktur im Code und zum Weiterleiten über AWS CloudFormation. Er wird gespannt sein, was aws-cdk in Zukunft haben wird, aber es wird schwierig für ihn sein, mit den anderen Vorteilen von Terraform zu konkurrieren. Um CloudFormation zu straffen, sind globale Änderungen erforderlich.


Terraform enttäuscht also nicht


Dies ist "Infrastruktur als CODE", nicht "als Text".

Mein erster Eindruck von Terraform war ziemlich schlecht. Ich glaube, ich habe den Ansatz einfach nicht verstanden. Fast alle Ingenieure nehmen es zunächst unfreiwillig als Textformat wahr, das in die gewünschte Infrastruktur konvertiert werden muss. NICHT SO.


Gemeinsame Wahrheiten einer guten Softwareentwicklung gelten für Terraform


Ich habe gesehen, wie viele Methoden zum Erstellen von gutem Code in Terraform ignoriert werden. Sie haben jahrelang studiert, um ein guter Programmierer zu werden. Geben Sie diese Erfahrung nicht einfach auf, weil Sie mit Terraform arbeiten. Die allgemeinen Wahrheiten einer guten Softwareentwicklung gelten auch für Terraform.


Wie kann der Code nicht dokumentiert werden?


Ich stieß auf riesige Terraform-Stapel ohne Dokumentation. Wie kann ich Code in Seiten schreiben - ganz ohne Dokumentation? Fügen Sie eine Dokumentation hinzu, die Ihren Terraform- Code erklärt (der Schwerpunkt liegt hier auf dem Wort "Code"), warum dieser Abschnitt so wichtig ist und was Sie tun.


Wie können Sie Dienste bereitstellen, die einst eine große main () - Funktion waren?


Ich traf sehr komplexe Terraform-Stapel, die als einzelnes Modul präsentiert wurden. Warum stellen wir keine solche Software bereit? Warum große Funktionen in kleinere aufteilen? Die gleichen Antworten gelten für Terraform. Wenn Ihr Modul zu groß ist, müssen Sie es in kleinere Module aufteilen.


Verwendet Ihr Unternehmen keine Bibliotheken?


Ich habe gesehen, wie Ingenieure, die mit Terraform ein neues Projekt gestartet haben, dummerweise riesige Teile aus anderen Projekten in ihre eigenen kopiert haben und sie dann ausgewählt haben, bis es zu funktionieren begann. Würden Sie in Ihrem Unternehmen mit dem „Kampf“ -Code arbeiten? Wir benutzen nicht nur Bibliotheken. Ja, nicht alles sollte eine Bibliothek sein, aber wo sind wir im Prinzip ohne gemeinsam genutzte Bibliotheken ?!


Verwenden Sie nicht PEP8 oder gofmt?


Die meisten Sprachen haben ein standardmäßig akzeptiertes Formatierungsschema. In Python ist dies PEP8. In Go - gofmt. Terraform hat seine eigene: terraform fmt . Gebrauch für Gesundheit!


Wirst du React verwenden, ohne JavaScript zu kennen?


Terraform-Module können einen Teil der komplexen Infrastruktur, die Sie erstellen, vereinfachen. Dies bedeutet jedoch nicht, dass Sie sie überhaupt überspringen können. Möchten Sie Terraform richtig verwenden, ohne die Ressourcen zu verstehen? Du bist zum Scheitern verurteilt: Die Zeit wird vergehen, aber du wirst Terraform nicht beherrschen.


Codieren Sie Singletones oder führen Sie Abhängigkeiten ein?


Die Abhängigkeitsinjektion ist die anerkannte Best Practice für die Softwareentwicklung, die von Singletones bevorzugt wird. Wie ist das in Terraform nützlich? Ich habe Terraform-Module je nach Remote-Status getroffen. Anstatt Module zu schreiben, die aus einem Remote-Status extrahiert werden, schreiben Sie ein Modul, das Parameter akzeptiert. Übergeben Sie diese Parameter dann an das Modul.


Machen Ihre Bibliotheken zehn Dinge gut oder eine Sache großartig?


Bibliotheken, die sich auf eine einzelne Aufgabe konzentrieren und die am besten funktionieren. Anstatt große Terraform-Module zu schreiben, die versuchen, alles auf einmal zu erledigen, sollten Sie Teile davon erstellen, die eine Sache gut machen. Und kombinieren Sie sie dann nach Ihren Wünschen.


Wie nehmen Sie Änderungen an Bibliotheken ohne Abwärtskompatibilität vor?


Das allgemeine Terraform-Modul muss wie eine reguläre Bibliothek Benutzer irgendwie über Änderungen informieren, ohne abwärtskompatibel zu sein. Wenn solche Änderungen in Bibliotheken auftreten, ist dies ärgerlich und ebenso ärgerlich, wenn Änderungen ohne Abwärtskompatibilität in Terraform-Modulen vorgenommen werden. Es wird empfohlen, Git-Tags und Semver zu verwenden, wenn Terraform-Module verwendet werden.


Wird der Produktionsdienst auf Ihrem Laptop oder in einem Rechenzentrum gestartet?


Hashicorp verfügt über Tools wie die Terraform Cloud zum Starten Ihrer Terraform. Diese zentralisierten Dienste erleichtern die Verwaltung, Prüfung und Genehmigung von Terraform-Änderungen.


Schreibst du keine Tests?


Ingenieure geben zu, dass der Code getestet werden muss, hämmern jedoch häufig selbst auf Überprüfungen, wenn sie mit Terraform arbeiten. Für die Infrastruktur ist dies mit schleichenden Momenten behaftet. Ich empfehle Ihnen, Stapel mithilfe von Modulen zu "testen" oder "Beispiele zu erstellen", die zur Überprüfung während CI / CD ordnungsgemäß bereitgestellt werden können.


Terraform und Microservices


Leben und Tod von Microservice-Unternehmen hängen von der Geschwindigkeit, Aktualisierung und Zerstörung neuer Microservice-Arbeitsstapel ab.

Der häufigste negative Punkt in Bezug auf Mikrodienstarchitekturen, der in keiner Weise beseitigt werden kann, hängt mit der Arbeit und nicht mit dem Code zusammen. Wenn Sie Terraform nur verwenden, um nur die Infrastrukturseite der Microservice-Architektur zu automatisieren, berauben Sie sich der wahren Vorteile dieses Systems. Jetzt ist alles wie Code .

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


All Articles