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 -
Vergleich der Erfahrungen mit Terraform und CloudFormation
Bevor wir zu uns kommen
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.
Code als Code
Es gibt auch die Infrastruktur, auf der es funktioniert.
Infrastruktur als Code
Aber woher kommt sie? Wie kann man es überwachen? Wo lebt Ihr Code? Benötigen Entwickler eine Zugriffsberechtigung?
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
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
Es erkennt Drift besser
Stellen Sie sicher, dass die Realität den Erwartungen entspricht.
Mit Terraform stehen Ihnen weitaus fortschrittlichere Lifecycle-Hooks für die Drifterkennung zur Verfügung. Sie geben beispielsweise den Befehl ein
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
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,
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
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
Source: habr.com