Von Terraform auf CloudFormation umgestiegen – und es bereut

Die Darstellung der Infrastruktur als Code in einem wiederholbaren Textformat ist eine einfache Best Practice für Systeme, die kein Hantieren mit Mäusen erfordern. Diese Praxis hat einen Namen - Infrastruktur als Code, und bisher gibt es zwei beliebte Tools zur Implementierung, insbesondere in AWS: Terraform и Wolkenbildung.

Von Terraform auf CloudFormation umgestiegen – und es bereut
Vergleich der Erfahrungen mit Terraform und CloudFormation

Bevor wir zu uns kommen Twitch (Aka Amazon Jr.) Ich habe gearbeitet in einem Startup und nutzte Terraform drei Jahre lang. Am neuen Standort habe ich auch mit aller Kraft Terraform genutzt, und dann hat das Unternehmen den Übergang zu allem a la Amazon vorangetrieben, einschließlich CloudFormation. Ich habe für beide sorgfältig Best Practices entwickelt und beide Tools in sehr komplexen, unternehmensweiten Arbeitsabläufen eingesetzt. Später, nachdem ich die Auswirkungen der Migration von Terraform zu CloudFormation sorgfältig abgewogen hatte, kam ich zu der Überzeugung, 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, was ein guter Grund ist, sie nicht zu verwenden. Es hat sich sehr verändert, seit ich es zum ersten Mal selbst ausprobiert habe, aber damals terraform apply oft nach mehreren Updates oder einfach nach ein paar Jahren Nutzung kaputt. Ich würde sagen: „Jetzt ist alles anders“, aber... das scheint doch jeder zu sagen, nicht wahr? Es gibt Änderungen, die mit früheren Versionen nicht kompatibel sind, obwohl sie angemessen sind, und es fühlt sich sogar so an, als wären die Syntax und Abstraktionen von Ressourcenspeichern jetzt das, was wir brauchen. Das Instrument scheint wirklich besser geworden zu sein, aber... :-0

Andererseits hat AWS bei der Wahrung der Abwärtskompatibilität gute Arbeit geleistet. Dies liegt wahrscheinlich daran, dass ihre Dienste häufig innerhalb der Organisation gründlich getestet und erst dann, umbenannt, veröffentlicht werden. „Sie haben sich große Mühe gegeben“ ist also eine Untertreibung. Die Aufrechterhaltung der Abwärtskompatibilität mit APIs für ein so vielfältiges und komplexes System wie AWS ist unglaublich schwierig. Jeder, der so weit verbreitete öffentliche APIs pflegen musste, sollte verstehen, wie schwierig es ist, dies über so viele Jahre hinweg zu tun. Aber das Verhalten von CloudFormation hat sich in meiner Erinnerung im Laufe der Jahre nie verändert.

Das ist das Bein... es ist eine Kugel

Soweit ich weiß, löschen Sie die Ressource Außenseiter Ein CloudFormation-Stack von Ihrem CF-Stack ist nicht möglich. Dasselbe gilt auch für Terraform. Es ermöglicht Ihnen, vorhandene Ressourcen in Ihren Stack zu importieren. Man kann sagen, dass die Funktion erstaunlich ist, aber mit großer Kraft geht auch große Verantwortung einher. Sie müssen lediglich eine Ressource zum Stapel hinzufügen. Während Sie mit Ihrem Stapel arbeiten, können Sie diese Ressource nicht löschen oder ändern. Eines Tages ging es nach hinten los. Eines Tages importierte jemand auf Twitch versehentlich die AWS-Sicherheitsgruppe einer anderen Person in seinen eigenen Terraform-Stack, ohne etwas Unheil zu begehen. Ich habe mehrere Befehle eingegeben und ... die Sicherheitsgruppe (zusammen mit dem eingehenden Datenverkehr) ist verschwunden.

Terraform Großartig

Wiederherstellung aus unvollständigen Zuständen

Manchmal schafft es CloudFormation nicht, vollständig von einem Zustand in einen anderen überzugehen. Gleichzeitig wird er versuchen, zum vorherigen zurückzukehren. Schade, dass dies nicht immer machbar ist. Es kann beängstigend sein, später zu debuggen, was passiert ist – man weiß nie, ob CloudFormation froh sein wird, dass es gehackt wird – selbst wenn es nur darum geht, das Problem zu beheben. Ob es möglich sein wird, zum vorherigen Zustand zurückzukehren, weiß er wirklich nicht und wartet standardmäßig stundenlang auf ein Wunder.

Terraform hingegen erholt sich nach fehlgeschlagenen Übergängen tendenziell viel sanfter und bietet erweiterte Debugging-Tools.

Deutlichere Änderungen am Dokumentstatus

„Okay, Load Balancer, Sie ändern sich. Aber wie?"

– besorgter Ingenieur, bereit, die „Akzeptieren“-Taste zu drücken.

Manchmal muss ich einige Manipulationen am Load Balancer im CloudFormation-Stack vornehmen, z. B. das Hinzufügen einer Portnummer oder das Ändern einer Sicherheitsgruppe. ClouFormation zeigt Änderungen schlecht an. Ich überprüfe die Yaml-Datei auf Nadel und Faden zehnmal, um sicherzugehen, dass ich nichts Notwendiges gelöscht und nichts Unnötiges hinzugefügt habe.

Terraform ist in dieser Hinsicht viel transparenter. Manchmal ist er sogar zu durchsichtig (sprich: langweilig). Glücklicherweise enthält die neueste Version eine verbesserte Anzeige von Änderungen, sodass Sie jetzt genau sehen können, was sich ändert.

Flexibilität

Schreiben Sie Software rückwärts.

Um es ganz klar auszudrücken: Das wichtigste Merkmal langlebiger Software ist die Fähigkeit, sich an Veränderungen anzupassen. Schreiben Sie jede Software rückwärts. Meistens habe ich Fehler gemacht, indem ich einen „einfachen“ Dienst genommen und dann angefangen habe, alles in einen einzigen CloudFormation- oder Terraform-Stack zu packen. Und natürlich stellte sich Monate später heraus, dass ich alles falsch verstanden hatte und der Service tatsächlich nicht einfach war! Und jetzt muss ich einen großen Stapel irgendwie in kleine Komponenten aufteilen. Wenn Sie mit CloudFormation arbeiten, ist dies nur möglich, indem Sie zunächst den vorhandenen Stack neu erstellen. Bei meinen Datenbanken mache ich das nicht. Terraform hingegen ermöglichte es, den Stapel zu zerlegen und in verständlichere kleinere Teile zu zerlegen.

Module in Git

Das Teilen von Terraform-Code über mehrere Stacks hinweg ist viel einfacher als das Teilen von CloudFormation-Code. Mit Terraform können Sie Ihren Code in einem Git-Repository ablegen und mithilfe der semantischen Versionskontrolle darauf zugreifen. Jeder, der Zugriff auf dieses Repository hat, kann den freigegebenen Code wiederverwenden. Das Äquivalent von CloudFormation ist S3, bietet jedoch nicht die gleichen Vorteile und es gibt keinen Grund, warum wir Git überhaupt zugunsten von S3 aufgeben sollten.

Die Organisation wuchs und die Fähigkeit, gemeinsame Stacks zu teilen, erreichte ein kritisches Niveau. Terraform macht dies alles einfach und natürlich, während CloudFormation Sie durch Hürden springen lässt, bevor Sie so etwas zum Laufen bringen können.

Operationen als Code

„Lass es uns schreiben und okay.“

– ein Ingenieur, 3 Jahre vor der Erfindung des Terraform-Fahrrads.

Wenn es um Softwareentwicklung geht, ist Go oder ein Java-Programm nicht nur Code.

Von Terraform auf CloudFormation umgestiegen – und es bereut
Code als Code

Es gibt auch die Infrastruktur, auf der es funktioniert.

Von Terraform auf CloudFormation umgestiegen – und es bereut
Infrastruktur als Code

Aber woher kommt sie? Wie kann man es überwachen? Wo lebt Ihr Code? Benötigen Entwickler eine Zugriffsberechtigung?

Von Terraform auf CloudFormation umgestiegen – und es bereut
Operationen als Code

Softwareentwickler zu sein bedeutet nicht nur, Code zu schreiben.

AWS ist nicht der einzige: Sie nutzen wahrscheinlich andere Anbieter. SignalFx, PagerDuty oder Github. Möglicherweise verfügen Sie über einen internen Jenkins-Server für CI/CD oder ein internes Grafana-Dashboard 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 gearbeitet habe, haben wir Dienste innerhalb der gemischten eingebetteten und AWS-Systeme von Amazon beschleunigt. Wir haben viele Microservices entwickelt und unterstützt, was die Betriebskosten erhöht hat. Die Diskussionen verliefen etwa so:

  • Я: Verdammt, das sind viele Gesten, um einen Mikrodienst zu übertakten. Ich muss diesen Müll verwenden, um ein AWS-Konto zu erstellen (wir sind auf 2 Konten umgestiegen). Mikroservice), dann dieses zum Einrichten von Warnungen, dieses für ein Code-Repository und dieses für eine E-Mail-Liste und dann dieses ...
  • Führen: Lass es uns schreiben und okay.
  • Я: Okay, aber das Drehbuch selbst wird sich ändern. Wir benötigen eine Möglichkeit, um zu überprüfen, ob alle integrierten Amazon-Gizmos auf dem neuesten Stand sind.
  • Führen: Hört sich gut an. Und wir werden ein Skript dafür schreiben.
  • Я: Großartig! Und das Skript muss wahrscheinlich noch Parameter festlegen. Wird er sie akzeptieren?
  • Führen: Lass ihn gehen, wohin er geht!
  • Я: Der Prozess kann sich ändern und die Abwärtskompatibilität geht verloren. Eine Art semantische Versionskontrolle ist erforderlich.
  • Führen: Eine super Idee!
  • Я: Werkzeuge können manuell innerhalb der Benutzeroberfläche geändert werden. Wir brauchen eine Möglichkeit, dies zu überprüfen und zu beheben.

…3 Jahre später:

  • Führen: Und wir haben Terraform.

Die Moral der Geschichte lautet: Auch wenn Sie Hals über Kopf in alles Amazonverwenden Sie immer noch etwas, das nicht von AWS stammt, und diese Dienste haben einen Status, der eine Konfigurationssprache verwendet, um diesen Status synchron zu halten.

CloudFormation Lambda vs. Git-Module Terraform

Lambda ist die Lösung von CloudFormation für das Problem der benutzerdefinierten Logik. Mit Lambda ist das möglich Makros erstellen oder Benutzerressource. Dieser Ansatz führt zu zusätzlichen Komplexitäten, die in der semantischen Versionierung von Git-Modulen durch Terraform nicht vorhanden sind. Für mich war das drängendste Problem die Verwaltung der Berechtigungen für all diese Benutzer-Lambdas (und das sind Dutzende von AWS-Konten). Ein weiteres wichtiges Problem war das „Was war zuerst, das Huhn oder das Ei?“: Es hing mit dem Lambda-Code zusammen. Diese Funktion selbst besteht aus Infrastruktur und Code und muss überwacht und aktualisiert werden. Der letzte Nagel im Sarg war die Schwierigkeit, Lambda-Codeänderungen semantisch zu aktualisieren; Wir mussten auch sicherstellen, dass sich die Stack-Aktionen ohne direkten Befehl zwischen den Läufen nicht änderten.

Ich erinnere mich, dass ich einmal eine Canary-Bereitstellung für die Elastic Beanstalk-Umgebung mit einem klassischen Load Balancer erstellen wollte. Am einfachsten wäre es, ein zweites Deployment für den EB neben der Produktionsumgebung durchzuführen und noch einen Schritt weiter zu gehen: die Autoscaling-Canary-Deployment-Gruppe mit dem Deployment-LB in der Produktionsumgebung zu kombinieren. Und da Terraform verwendet ASG-Beantalk als Fazit, hierfür sind 4 zusätzliche Codezeilen in Terraform erforderlich. Als ich fragte, ob es in CloudFormation eine vergleichbare Lösung gäbe, verwiesen sie mich auf ein komplettes Git-Repository mit einer Deployment-Pipeline und allem, und das alles nur, um etwas zu erreichen, was schlechte vier Zeilen Terraform-Code leisten könnten.

Es erkennt Drift besser

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

Drifterkennung ist eine sehr leistungsstarke Operation-as-Code-Funktion, da sie dazu beiträgt, sicherzustellen, dass die Realität den Erwartungen entspricht. Es ist sowohl mit CloudFormation als auch mit Terraform verfügbar. Doch als der Produktionsstapel wuchs, führte die Suche nach Drift in CloudFormation zu immer mehr Fehlerkennungen.

Mit Terraform stehen Ihnen weitaus fortschrittlichere Lifecycle-Hooks für die Drifterkennung zur Verfügung. Sie geben beispielsweise den Befehl ein ignoriere_Änderungen direkt in der ECS-Aufgabendefinition, wenn Sie Änderungen an einer bestimmten Aufgabendefinition ignorieren möchten, ohne Änderungen an Ihrer 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 sind erkannt und das Tool benötigt Dinge wie aws-cdk, ein Framework zum Definieren der Cloud-Infrastruktur im Code und zum Ausführen dieser über AWS CloudFormation. Es wird interessant sein zu sehen, was die Zukunft für aws-cdk bereithält, aber es wird schwierig sein, mit den anderen Stärken von Terraform zu konkurrieren; Um CloudFormation auf den neuesten Stand zu bringen, sind globale Änderungen erforderlich.

Damit Terraform nicht enttäuscht

Dabei handelt es sich um „Infrastruktur als Code“ und nicht „als Text“.

Mein erster Eindruck von Terraform war eher schlecht. Ich glaube, ich habe den Ansatz einfach nicht verstanden. Fast alle Ingenieure nehmen es unwillkürlich als Textformat wahr, das in die gewünschte Infrastruktur umgewandelt werden muss. NICHT SO.

Die Binsenweisheiten einer guten Softwareentwicklung gelten auch für Terraform.

Ich habe viele Praktiken zur Erstellung guten Codes gesehen, die in Terraform ignoriert wurden. Sie haben jahrelang studiert, um ein guter Programmierer zu werden. Geben Sie diese Erfahrung nicht auf, nur weil Sie mit Terraform arbeiten. Die Binsenweisheiten einer guten Softwareentwicklung gelten auch für Terraform.

Wie kann der Code nicht dokumentiert werden?

Ich habe riesige Terraform-Stacks ohne jegliche Dokumentation gesehen. Wie kann man Code in Seiten schreiben – ganz ohne Dokumentation? Fügen Sie eine Dokumentation hinzu, die Ihre erläutert Code Terraform (Betonung des Wortes „Code“), warum dieser Abschnitt so wichtig ist und was Sie tun.

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

Ich habe sehr komplexe Terraform-Stacks gesehen, die als einzelnes Modul dargestellt wurden. Warum stellen wir Software nicht auf diese Weise bereit? Warum teilen wir große Funktionen in kleinere auf? Die gleichen Antworten gelten für Terraform. Wenn Ihr Modul zu groß ist, müssen Sie es in kleinere Module aufteilen.

Benutzt Ihr Unternehmen keine Bibliotheken?

Ich habe gesehen, wie Ingenieure, die mit Terraform ein neues Projekt starteten, dummerweise riesige Teile aus anderen Projekten kopierten und in ihre eigenen einfügten und dann daran herumbastelten, bis es anfing zu funktionieren. Würden Sie in Ihrem Unternehmen so mit „Kampfcode“ arbeiten? Wir nutzen nicht nur Bibliotheken. Ja, nicht alles muss eine Bibliothek sein, aber wo wären wir im Prinzip ohne Shared Libraries?!

Benutzt du nicht PEP8 oder gofmt?

Die meisten Sprachen verfügen über ein standardmäßiges, akzeptiertes Formatierungsschema. In Python ist dies PEP8. In Go - gofmt. Terraform hat sein eigenes: terraform fmt. Genießen Sie es für Ihre Gesundheit!

Werden Sie React verwenden, ohne JavaScript zu kennen?

Terraform-Module können einen Teil der von Ihnen erstellten komplexen Infrastruktur vereinfachen, aber das bedeutet nicht, dass Sie überhaupt nicht daran herumbasteln können. Möchten Sie Terraform richtig nutzen, ohne die Ressourcen zu verstehen? Sie sind dem Untergang geweiht: Die Zeit wird vergehen und Sie werden Terraform niemals beherrschen.

Codieren Sie mit Singletons oder Dependency-Injection?

Abhängigkeitsinjektion ist eine anerkannte Best Practice für die Softwareentwicklung und wird Singletons vorgezogen. Wie ist das in Terraform nützlich? Ich habe Terraform-Module gesehen, die vom Remote-Status abhängen. Anstatt Module zu schreiben, die den Remote-Status abrufen, schreiben Sie ein Modul, das Parameter entgegennimmt. Und übergeben Sie diese Parameter dann an das Modul.

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

Bibliotheken, die am besten funktionieren, sind diejenigen, die sich auf eine Aufgabe konzentrieren, die sie sehr gut erledigen. Anstatt große Terraform-Module zu schreiben, die versuchen, alles auf einmal zu erledigen, bauen Sie Teile davon, die eine Sache gut machen. Und kombinieren Sie sie dann nach Bedarf.

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

Ein allgemeines Terraform-Modul muss, wie eine normale Bibliothek, den Benutzern Änderungen irgendwie mitteilen, ohne abwärtskompatibel zu sein. Es ist ärgerlich, wenn diese Änderungen in Bibliotheken stattfinden, und es ist genauso ärgerlich, wenn nicht abwärtskompatible Änderungen in Terraform-Modulen vorgenommen werden. Es wird empfohlen, bei der Verwendung von Terraform-Modulen Git-Tags und Semver zu verwenden.

Läuft Ihr Produktionsservice auf Ihrem Laptop oder in einem Rechenzentrum?

Hashicorp hat Tools wie Terraform-Wolke um deine Terraform zu betreiben. Diese zentralisierten Dienste erleichtern die Verwaltung, Prüfung und Genehmigung von Terraform-Änderungen.

Schreiben Sie keine Tests?

Ingenieure erkennen, dass der Code getestet werden muss, aber sie selbst vergessen oft das Testen, wenn sie mit Terraform arbeiten. Für die Infrastruktur ist dies mit tückischen Momenten behaftet. Mein Rat ist, Stacks mit Modulen zu „testen“ oder „Beispiel“ zu erstellen, die zum Testen während CI/CD korrekt bereitgestellt werden können.

Terraform und Microservices

Leben und Tod von Microservices-Unternehmen hängen von der Geschwindigkeit, Innovation und Störung neuer Microservice-Workstacks ab.

Der häufigste negative Aspekt, der mit Microservice-Architekturen verbunden ist und nicht beseitigt werden kann, hängt mit der Arbeit und nicht mit dem Code zusammen. Wenn Sie Terraform nur als eine Möglichkeit betrachten, nur die Infrastrukturseite einer Microservices-Architektur zu automatisieren, verpassen Sie die wahren Vorteile des Systems. Jetzt ist es schon soweit alles ist wie Code.

Source: habr.com

Kommentar hinzufügen