{"id":52367,"date":"2019-11-07T00:00:00","date_gmt":"2019-11-06T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/pereshel-s-terraform-na-cloudformation-i-pozhalel"},"modified":"2020-02-18T14:00:04","modified_gmt":"2020-02-18T11:00:04","slug":"pereshel-s-terraform-na-cloudformation-i-pozhalel","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","title":{"rendered":"Wechsel von Terraform zu CloudFormation \u2013 und bereut","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Die Darstellung von Infrastruktur als Code in einem wiederholbaren Textformat ist eine bew\u00e4hrte Praxis f\u00fcr Systeme, die kein Mausef\u00e4llchen erfordert. Diese Praxis hat den Namen - <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Infrastructure_as_code\">Infrastructure as Code<\/a><\/noindex>, und bisher gibt es daf\u00fcr, insbesondere in AWS, zwei beliebte Werkzeuge: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/\">Terraform<\/a><\/noindex> und <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/cloudformation\/\">CloudFormation<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wechsel von Terraform zu CloudFormation \u2013 und bereut\" src=\"\/wp-content\/uploads\/2019\/11\/e33084fb81ca06107b341eef01e69adc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Ich vergleiche die Erfahrungen mit Terraform und CloudFormation<\/em><\/p>\n<p><\/p>\n<p>Vor meinem Wechsel zu <noindex><a rel=\"nofollow\" href=\"https:\/\/www.twitch.tv\/\">Twitch<\/a><\/noindex> (auch bekannt als <noindex><a rel=\"nofollow\" href=\"https:\/\/www.businessinsider.com\/amazon-buys-twitch-2014-8\">Amazon Jr.<\/a><\/noindex>) war ich besch\u00e4ftigt <noindex><a rel=\"nofollow\" href=\"https:\/\/www.signalfx.com\/\">in einem Startup<\/a><\/noindex> und habe etwa drei Jahre Terraform verwendet. An meinem neuen Arbeitsplatz habe ich ebenfalls intensiv Terraform genutzt, bis das Unternehmen den Wechsel zu allem was Amazon angeht, einschlie\u00dflich CloudFormation, durchgesetzt hat. Ich habe eifrig die besten Praktiken f\u00fcr beide Werkzeuge entwickelt und beide in sehr komplexen Arbeitsabl\u00e4ufen im Unternehmensma\u00dfstab eingesetzt. Sp\u00e4ter, nachdem ich die Folgen des Wechsels von Terraform zu CloudFormation sorgf\u00e4ltig abgewogen hatte, stellte ich fest, dass Terraform wahrscheinlich die beste Wahl f\u00fcr das Unternehmen ist.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"terraform-uzhasnyy\">Terraform ist schrecklich<\/h2>\n<p><\/p>\n<h3 id=\"beta-versiya-po\">Die Beta-Version der Software<\/h3>\n<p><\/p>\n<p>Terraform hat noch nicht einmal Version 1.0 erreicht, und das ist ein gewichtiges Argument, es nicht zu verwenden. Seit ich es das erste Mal ausprobiert habe, hat es sich stark ver\u00e4ndert, aber damals <code>terraform apply<\/code> Es ist oft nach mehreren Updates oder einfach nach ein paar Jahren der Benutzung ausgefallen. Ich w\u00fcrde sagen, dass \"jetzt alles anders ist\", aber... so sagen es wohl alle, oder? Es gibt \u00c4nderungen, die mit fr\u00fcheren Versionen inkompatibel sind, auch wenn sie sinnvoll sind, und sogar das Gef\u00fchl, dass die Syntax und die Abstraktionen von Ressourcenspeichern jetzt genau richtig sind. Das Tool scheint tats\u00e4chlich besser geworden zu sein, aber\u2026 :-0<\/p>\n<p><\/p>\n<p>Andererseits hat AWS gute Arbeit geleistet, indem es die Kompatibilit\u00e4t mit vorherigen Versionen unterst\u00fctzt hat. Das liegt wahrscheinlich daran, dass ihre Dienste oft gr\u00fcndlich intern getestet werden, bevor sie umbenannt ver\u00f6ffentlicht werden. Daher ist \"gut gemacht\" eigentlich noch geschmeichelt. Die Kompatibilit\u00e4t mit vorherigen API-Versionen f\u00fcr ein so vielschichtiges und komplexes System wie AWS aufrechtzuerhalten, ist unglaublich schwierig. Jeder, der \u00f6ffentliche APIs, die so weit verbreitet verwendet werden, warten musste, sollte verstehen, wie schwierig es ist, das \u00fcber so viele Jahre hinweg zu tun. Aber das Verhalten von CloudFormation hat sich meiner Erinnerung nach \u00fcber die Jahre nie ge\u00e4ndert.<\/p>\n<p><\/p>\n<h3 id=\"znakomsya-noga-eto-pulya\">Lerne kennen, Fu\u00df\u2026 das ist eine Kugel<\/h3>\n<p><\/p>\n<p>Soweit ich wei\u00df, l\u00e4sst sich ein Ressource <strong>von Dritten nicht l\u00f6schen<\/strong> Es ist nicht m\u00f6glich, einen CloudFormation-Stack aus einem eigenen CF-Stack zu stehlen. \u00c4hnlich verh\u00e4lt es sich mit Terraform. Es erm\u00f6glicht, bestehende Ressourcen in seinen Stack zu importieren. Man kann sagen, diese Funktion ist erstaunlich, aber mit gro\u00dfer Kraft kommt gro\u00dfe Verantwortung. Sobald man eine Ressource in den Stack aufnimmt, kann man diese Ressource nicht mehr l\u00f6schen oder \u00e4ndern, w\u00e4hrend man mit seinem Stack arbeitet. Einmal kam das zur\u00fcck, um einen zu bei\u00dfen. Irgendwo auf der Webseite von Twitch hat jemand, ohne b\u00f6se Absichten, versehentlich die AWS-Sicherheitsgruppe eines anderen in seinen eigenen Terraform-Stack importiert. Er gab ein paar Befehle ein und\u2026 die Sicherheitsgruppe (nebst dem eingehenden Datenverkehr) verschwand.<\/p>\n<p><\/p>\n<h2 id=\"terraform-velikiy\">Terraform Gro\u00dfartig<\/h2>\n<p><\/p>\n<h3 id=\"vosstanovlenie-iz-nepolnyh-sostoyaniy\">Wiederherstellung aus unvollst\u00e4ndigen Zust\u00e4nden<\/h3>\n<p><\/p>\n<p>Manchmal kann CloudFormation nicht vollst\u00e4ndig von einem Zustand in einen anderen \u00fcbergehen. In diesem Fall versucht es, zum vorherigen Zustand zur\u00fcckzukehren. Schade, dass das nicht immer machbar ist. Es kann ganz sch\u00f6n be\u00e4ngstigend sein, das, was am Ende herauskommt, zu debuggen \u2014 man wei\u00df nie, ob CloudFormation sich freut, dass man es hackt \u2014 wenn auch nur zur Reparatur. Ob es gelingt oder nicht, zum vorherigen Zustand zur\u00fcckzukehren, kann es nicht wirklich bestimmen und wartet standardm\u00e4\u00dfig stundenlang auf ein Wunder.<\/p>\n<p><\/p>\n<p>Terraform hingegen neigt dazu, nach fehlgeschlagenen \u00dcberg\u00e4ngen viel eleganter wiederherzustellen und bietet erweiterte Debugging-Tools an.<\/p>\n<p><\/p>\n<h3 id=\"bolee-yasnye-izmeneniya-v-sostoyaniya-dokumenta\">Klarere \u00c4nderungen im Dokumentzustand<\/h3>\n<p><\/p>\n<blockquote><p>\"Okay, Lastenausgleich, du \u00e4nderst dich. Aber wie?\"<\/p>\n<p>- besorgter Ingenieur, bereit, die Schaltfl\u00e4che \"Akzeptieren\" zu dr\u00fccken.<\/p><\/blockquote>\n<p>Manchmal muss ich ein paar Manipulationen mit dem Lastenausgleich im CloudFormation-Stack durchf\u00fchren \u2014 zum Beispiel eine Portnummer hinzuf\u00fcgen oder die Sicherheitsgruppe \u00e4ndern. CloudFormation zeigt \u00c4nderungen schwach an. Ich hingegen bin ganz nerv\u00f6s und pr\u00fcfe die YAML-Datei mindestens zehnmal, um sicherzustellen, dass ich nichts Wichtiges gel\u00f6scht oder etwas \u00dcberfl\u00fcssiges hinzugef\u00fcgt habe.<\/p>\n<p><\/p>\n<p>Terraform ist in dieser Hinsicht viel transparenter. Manchmal ist es sogar zu transparent (sprich: nervig). Gl\u00fccklicherweise wurde in die letzte Version eine verbesserte Anzeige von \u00c4nderungen aufgenommen \u2014 jetzt sieht man genau, was sich \u00e4ndert.<\/p>\n<p><\/p>\n<h3 id=\"gibkost\">Flexibilit\u00e4t<\/h3>\n<p><\/p>\n<blockquote><p>Schreibt Software von hinten.<\/p><\/blockquote>\n<p>Um es klar zu sagen, das wichtigste Merkmal langlebiger Software ist die F\u00e4higkeit, sich an Ver\u00e4nderungen anzupassen. Jegliche Software sollte man r\u00fcckblickend entwickeln. Ich habe meistens dadurch Fehler gemacht, dass ich einen \"einfachen\" Dienst genommen habe und dann versucht habe, alles in einen einzigen CloudFormation- oder Terraform-Stack zu zw\u00e4ngen. Und nat\u00fcrlich stellte sich Monate sp\u00e4ter heraus, dass ich alles falsch verstanden hatte und der Dienst in Wirklichkeit gar nicht einfach war! Ich musste den gro\u00dfen Stack somehow in kleinere Komponenten zerlegen. Wenn man mit CloudFormation arbeitet, ist das nur m\u00f6glich, wenn man den bestehenden Stack zuvor wiederherstellt, was ich mit meinen DBs nicht mache. Terraform hingegen erlaubte es, den Stack auseinanderzunehmen und in verst\u00e4ndlichere, kleinere Teile zu zerlegen.<\/p>\n<p><\/p>\n<h3 id=\"moduli-v-git\">Module in git<\/h3>\n<p><\/p>\n<p>Code zwischen zahlreichen Stacks in Terraform zu teilen ist viel einfacher als in CloudFormation. Mit Terraform kannst du den Code in ein Git-Repository speichern und ihn unter Verwendung von semantischer Versionskontrolle darauf zugreifen. Jeder, der Zugang zu diesem Repository hat, kann den gemeinsamen Code wiederverwenden. Das Pendant in CloudFormation ist S3, aber es hat nicht die gleichen Vorteile, und es gibt keinen Grund, warum wir \u00fcberhaupt auf Git zu Gunsten von S3 verzichten sollten.<\/p>\n<p><\/p>\n<p>Die Organisation wuchs, und die F\u00e4higkeit, gemeinsame Stacks zu teilen, erreichte ein kritisches Niveau. Mit Terraform gelingt das leicht und nat\u00fcrlich, w\u00e4hrend CloudFormation dich dazu zwingt, durch viele Ringe zu springen, bevor du etwas \u00c4hnliches zum Laufen bringst.<\/p>\n<p><\/p>\n<h3 id=\"operations-as-code\">Operations als Code<\/h3>\n<p><\/p>\n<blockquote><p>\"Lass uns das skripten und fertig!\"<\/p>\n<p>\u2013 Ingenieur drei Jahre bevor er das Fahrrad Terraform erfand.<\/p><\/blockquote>\n<p>Wenn es um Softwareentwicklung geht, ist Go oder ein Programm in Java nicht nur Code.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wechsel von Terraform zu CloudFormation \u2013 und bereut\" src=\"\/wp-content\/uploads\/2019\/11\/a5c61fd318b9b5aa62ebb69e38ca1b0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Code als Code<\/em><\/p>\n<p><\/p>\n<p>Es gibt auch die Infrastruktur, auf der sie l\u00e4uft.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wechsel von Terraform zu CloudFormation \u2013 und bereut\" src=\"\/wp-content\/uploads\/2019\/11\/301c0323baa18563f05503e701af069b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Infrastructure as Code<\/em><\/p>\n<p><\/p>\n<p>Aber woher kommt die dort? Wie \u00fcberwacht man sie? Wo lebt dein Code? Brauchen Entwickler eine Genehmigung, um darauf zuzugreifen?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wechsel von Terraform zu CloudFormation \u2013 und bereut\" src=\"\/wp-content\/uploads\/2019\/11\/5cb0b6f720682b7bb6d5f485287b618b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Operations als Code<\/em><\/p>\n<p><\/p>\n<blockquote><p>Ein Softwareentwickler zu sein bedeutet nicht nur, Code zu schreiben.<\/p><\/blockquote>\n<p>Nicht nur AWS: Du nutzt sicher auch die Dienste anderer Anbieter. SignalFx, PagerDuty oder Github. Vielleicht hast du einen internen Jenkins-Server f\u00fcr CI\/CD oder ein internes Grafana-Dashboard zur \u00dcberwachung. Infra as Code wird aus verschiedenen Gr\u00fcnden gew\u00e4hlt, und jeder ist f\u00fcr alles, was mit Software zu tun hat, gleich wichtig.<\/p>\n<p><\/p>\n<p>Als ich bei Twitch arbeitete, beschleunigten wir Dienste innerhalb gemischter eingebetteter Systeme und des AWS-Systems von Amazon. Wir stellten eine Vielzahl von Mikrodiensten her und unterst\u00fctzten sie, wodurch die Betriebskosten stiegen. Die Diskussionen verliefen in etwa so:<\/p>\n<p><\/p>\n<ul>\n<li><strong>Ich<\/strong>: Mann, das sind ganz sch\u00f6n viele Handgriffe, um einen Mikrodienst zu starten. Ich muss dieses Ding benutzen, um ein AWS-Konto zu erstellen (wir strebten zwei Konten an auf <strong>Mikrodienst<\/strong>), dann diesen - um Benachrichtigungen einzurichten, noch diesen - f\u00fcr das Code-Repository, und diesen - f\u00fcr die Liste von E-Mail-Adressen, und dann diesen hier\u2026<\/li>\n<li><strong>Lead<\/strong>: Lass uns ein Skript schreiben und gut ist.<\/li>\n<li><strong>Ich<\/strong>: In Ordnung, aber das Skript wird sich \u00e4ndern. Es wird eine M\u00f6glichkeit ben\u00f6tigt, um zu \u00fcberpr\u00fcfen, dass all diese integrierten Amazon-Gadgets auf dem neuesten Stand sind.<\/li>\n<li><strong>Lead<\/strong>: Klingt gut. Und daf\u00fcr werden wir ein Skript schreiben.<\/li>\n<li><strong>Ich<\/strong>: Ausgezeichnet! Und das Skript muss sicherlich auch Parameter annehmen. Nimmt es die entgegen?<\/li>\n<li><strong>Lead<\/strong>: Nat\u00fcrlich, was sollte es sonst tun?<\/li>\n<li><strong>Ich<\/strong>: Der Prozess k\u00f6nnte sich \u00e4ndern, die Abw\u00e4rtskompatibilit\u00e4t k\u00f6nnte verloren gehen. Wir werden eine Art semantische Versionskontrolle ben\u00f6tigen.<\/li>\n<li><strong>Lead<\/strong>: Gro\u00dfartige Idee!<\/li>\n<li><strong>Ich<\/strong>: Die Werkzeuge k\u00f6nnen manuell im Benutzerinterface ge\u00e4ndert werden. Wir ben\u00f6tigen einen Weg, um das zu \u00fcberpr\u00fcfen und zu beheben.<\/li>\n<\/ul>\n<p><\/p>\n<p><em>\u20263 Jahre sp\u00e4ter:<\/em><\/p>\n<p><\/p>\n<ul>\n<li><strong>Lead<\/strong>: Und so haben wir Terraform.<\/li>\n<\/ul>\n<p><\/p>\n<p>Die Moral der Geschichte: selbst wenn Sie bis zur Halskrause in allem Amazon sind, verwenden Sie immer noch etwas, das nicht von AWS stammt, und diese Dienste haben einen Zustand, der eine Sprache zur Konfiguration verwendet, um diesen Zustand zu synchronisieren. <strong>bis \u00fcber beide Ohren in alles Amazonm\u00e4\u00dfige<\/strong>Lambda ist die L\u00f6sung von CloudFormation f\u00fcr das Thema benutzerdefinierte Logik. Mit Lambda kann man<\/p>\n<p><\/p>\n<h3 id=\"cloudformation-lambda-vs-git-moduli-terraform\">Makros<\/h3>\n<p><\/p>\n<p>benutzerdefinierte Ressourcen <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/macros-example.html\">. Dieser Ansatz bringt zus\u00e4tzliche Komplikationen mit sich, die es in der semantischen Versionskontrolle von Git-Modulen bei Terraform nicht gibt. F\u00fcr mich wurde die dringlichste Herausforderung die Verwaltung von Berechtigungen f\u00fcr all diese benutzerdefinierten Lambdas (und das sind Dutzende von AWS-Konten). Ein weiteres wichtiges Problem war die Frage \u201eWas war zuerst \u2013 das Huhn oder das Ei?\u201c: Sie hing mit dem Lambda-Code zusammen. Diese Funktion selbst ist Infrastruktur und Code, und sie ben\u00f6tigt selbst Monitoring und Updates. Der letzte Nagel im Sarg war die Schwierigkeit, semantische Aktualisierungen im Lambda-Code vorzunehmen; au\u00dferdem musste sichergestellt werden, dass die Aktionen des Stacks nicht ohne direkten Befehl zwischen den Ausf\u00fchrungen \u00e4nderten.<\/a><\/noindex> oder <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/walkthrough-custom-resources-lambda-lookup-amiids.html\">benutzerdefinierte Ressourcen<\/a><\/noindex>. Dieser Ansatz bringt zus\u00e4tzliche Herausforderungen mit sich, die es bei der semantischen Versionskontrolle von Git-Modulen in Terraform nicht gibt. Das dr\u00e4ngendste Problem f\u00fcr mich war die Verwaltung von Berechtigungen f\u00fcr all diese benutzerdefinierten Lambda-Funktionen (und das sind Dutzende von AWS-Konten). Ein weiteres wichtiges Problem war die Frage \u201eWas war zuerst \u2014 das Huhn oder das Ei?\u201c: Es war mit dem Lambda-Code verbunden. Diese Funktion selbst stellt sowohl Infrastruktur als auch Code dar und ben\u00f6tigt \u00dcberwachung und Aktualisierungen. Der letzte Nagel im Sarg war die Schwierigkeit beim semantischen Aktualisieren von \u00c4nderungen am Lambda-Code; es musste auch sichergestellt werden, dass die Aktionen des Stacks ohne direkte Aufforderung zwischen den Ausf\u00fchrungen unver\u00e4ndert blieben.<\/p>\n<p><\/p>\n<p>Ich erinnere mich, dass ich irgendwann einen Canary-Deploy f\u00fcr die Elastic Beanstalk-Umgebung mit einem klassischen Load Balancer erstellen wollte. Am einfachsten w\u00e4re es gewesen, ein zweites Deployment f\u00fcr EB neben der Produktionsumgebung zu machen, indem ich einen weiteren Schritt gehe: die automatisch skalierbare Gruppe des Canary-Deployments mit dem LB-Deployment in die Produktionsumgebung zu kombinieren. Da Terraform verwendet <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/providers\/aws\/r\/elastic_beanstalk_environment.html#autoscaling_groups\">ASG beantalk als Ausgabe<\/a><\/noindex>, ben\u00f6tigt es 4 zus\u00e4tzliche Zeilen Code in Terraform. Als ich nach einer vergleichbaren L\u00f6sung in CloudFormation fragte, wurde ich auf ein ganzes Repository auf Git hingewiesen, das ein Deployment-Pipeline und mehr enth\u00e4lt: und all das nur, damit man die ungl\u00fccklichen 4 Zeilen Terraform-Code machen k\u00f6nnte.<\/p>\n<p><\/p>\n<h3 id=\"on-luchshe-obnaruzhivaet-dreyf\">Es erkennt Drift besser<\/h3>\n<p><\/p>\n<blockquote><p>Stellen Sie sicher, dass die Realit\u00e4t Ihren Erwartungen entspricht.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/blogs\/aws\/new-cloudformation-drift-detection\/\">Drift-Erkennung<\/a><\/noindex> ist eine sehr leistungsstarke Funktion von Operations as Code, da sie sicherstellt, dass die Realit\u00e4t Ihren Erwartungen entspricht. Sie ist sowohl mit CloudFormation als auch mit Terraform verf\u00fcgbar. Aber mit zunehmendem Wachstum des Stacks sorgte die Drift-Suche in CloudFormation f\u00fcr immer mehr Fehlalarme.<\/p>\n<p><\/p>\n<p>Mit Terraform haben Sie viel fortgeschrittenere Lebenszyklus-Hooks zur Drift-Erkennung. Zum Beispiel geben Sie den Befehl <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/configuration\/resources.html#ignore_changes\">ignore_changes<\/a><\/noindex> direkt in die ECS-Aufgabendefinition ein, wenn Sie \u00c4nderungen an einer bestimmten Aufgabe ignorieren m\u00f6chten, ohne dabei \u00c4nderungen am gesamten ECS-Deployment zu ignorieren.<\/p>\n<p><\/p>\n<h2 id=\"cdk-i-buduschee-cloudformation\">CDK und die Zukunft von CloudFormation<\/h2>\n<p><\/p>\n<p>CloudFormation ist schwer zu verwalten in gro\u00dfen, bereichs\u00fcbergreifenden Ma\u00dfst\u00e4ben. Viele dieser Schwierigkeiten sind anerkannt, und das Tool ben\u00f6tigt Dinge wie <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/en_pv\/cdk\/latest\/guide\/home.html\">aws-cdk<\/a><\/noindex>, eine Struktur zur Definition der Cloud-Infrastruktur im Code und zur Durchf\u00fchrung \u00fcber AWS CloudFormation. Es wird interessant sein zu sehen, was die Zukunft f\u00fcr aws-cdk bereith\u00e4lt, aber es wird schwierig sein, mit den anderen Vorteilen von Terraform zu konkurrieren; um CloudFormation aufzuholen, werden umfassende \u00c4nderungen notwendig sein.<\/p>\n<p><\/p>\n<h3 id=\"chtoby-terraform-ne-razocharoval\">Damit Terraform nicht entt\u00e4uscht<\/h3>\n<p><\/p>\n<blockquote><p>Das ist doch \u201eInfrastruktur als CODE\u201c, nicht \u201eals TEXT\u201c.<\/p><\/blockquote>\n<p>Mein erster Eindruck von Terraform war ziemlich negativ. Ich denke, ich habe den Ansatz einfach nicht verstanden. Fast alle Ingenieure sehen es zun\u00e4chst unfreiwillig als Textformat, das in die gew\u00fcnschte Infrastruktur umgewandelt werden muss. DAS MUSS NICHT SEIN.<\/p>\n<p><\/p>\n<h3 id=\"propisnye-istiny-horoshey-razrabotki-po-otnosyatsya-i-k-terraform\">Die einfachen Wahrheiten guter Softwareentwicklung gelten auch f\u00fcr Terraform.<\/h3>\n<p><\/p>\n<p>Ich habe gesehen, dass viele Praktiken, die zur Erstellung guten Codes beitragen, in Terraform ignoriert werden. Sie haben jahrelang gelernt, um ein guter Programmierer zu werden. Geben Sie diese Erfahrung nicht einfach auf, nur weil Sie mit Terraform arbeiten. Grundsatzweisheiten guter Softwareentwicklung gelten auch f\u00fcr Terraform.<\/p>\n<p><\/p>\n<h3 id=\"kak-uzh-kod-i-ne-zadokumentirovat\">Wie kann man Code nicht dokumentieren?<\/h3>\n<p><\/p>\n<p>Ich habe riesige Terraform-Stacks ohne jede Dokumentation gesehen. Wie kann man Code seitenweise schreiben \u2014 v\u00f6llig ohne Dokumentation? F\u00fcgen Sie Dokumentation hinzu, die erkl\u00e4rt, was Ihr <strong>Code<\/strong> Terraform (die Betonung hier liegt auf dem Wort \u201eCode\u201c), warum dieser Abschnitt so wichtig ist und was Sie tun sollten.<\/p>\n<p><\/p>\n<h3 id=\"kak-mozhno-razvorachivat-servisy-kotorye-nekogda-byli-odnoy-bolshoy-funkciey-main\">Wie k\u00f6nnen Sie Dienste bereitstellen, die einst eine gro\u00dfe Funktion main() waren?<\/h3>\n<p><\/p>\n<p>Mir sind sehr komplexe Terraform-Stacks begegnet, die als einzelnes Modul dargestellt wurden. Warum implementieren wir Software nicht so? Warum teilen wir gro\u00dfe Funktionen in kleinere auf? Die gleichen Antworten gelten auch f\u00fcr Terraform. Wenn Ihr Modul zu gro\u00df ist \u2014 sollten Sie es in kleinere Module aufteilen.<\/p>\n<p><\/p>\n<h3 id=\"razve-vasha-kompaniya-ne-polzuetsya-bibliotekami\">Benutzt Ihr Unternehmen etwa keine Bibliotheken?<\/h3>\n<p><\/p>\n<p>Ich habe gesehen, wie Ingenieure, die ein neues Projekt mit Terraform aufziehen, einfach riesige Teile aus anderen Projekten kopieren und einf\u00fcgen, w\u00e4hrend sie ihre eigenen erstellen, und dann daran herumbasteln, bis es funktioniert. W\u00fcrden Sie in Ihrer Firma so mit \u201eProduktions\u201c-Code arbeiten? Wir verwenden Bibliotheken nicht ohne Grund. Ja, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=PAAkCSZUG1c&amp;t=9m28s\">nicht alles sollte eine Bibliothek sein,<\/a><\/noindex> aber wo w\u00e4ren wir ohne gemeinsame Bibliotheken im Prinzip?!<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-polzuetes-pep8-ili-gofmt\">Benutzen Sie nicht PEP8 oder gofmt?<\/h3>\n<p><\/p>\n<p>In den meisten Programmiersprachen gibt es ein standardisiertes Formatierungschema. In Python ist es PEP8. In Go \u2014 gofmt. Terraform hat sein eigenes: <code>terraform fmt<\/code>. Nutzen Sie es gerne! <\/p>\n<p><\/p>\n<h3 id=\"vy-stanete-polzovatsya-react-ne-znaya-javascript\">W\u00fcrden Sie React verwenden, ohne JavaScript zu kennen?<\/h3>\n<p><\/p>\n<p>Terraform-Module k\u00f6nnen einen Teil der von Ihnen erstellten komplexen Infrastruktur vereinfachen, aber das bedeutet nicht, dass Sie \u00fcberhaupt nichts davon verstehen k\u00f6nnen. M\u00f6chten Sie Terraform korrekt verwenden, ohne die Ressourcen zu verstehen? Sie sind zum Scheitern verurteilt: Die Zeit vergeht, und Sie werden Terraform nicht erlernen.<\/p>\n<p><\/p>\n<h3 id=\"vy-kodite-singltonami-ili-vnedryaya-zavisimosti\">Programmieren Sie mit Singletons oder durch Injektion von Abh\u00e4ngigkeiten?<\/h3>\n<p><\/p>\n<p>Dependency Injection ist eine anerkannte Best Practice f\u00fcr die Softwareentwicklung, die von Singleton-Architekturen bevorzugt wird. Wie kann das in Terraform n\u00fctzlich sein? Mir sind Terraform-Module begegnet, die von einem Remote-Status abh\u00e4ngen. Anstatt Module zu schreiben, die den Remote-Status abrufen, sollten Sie ein Modul erstellen, das Parameter akzeptiert. \u00dcbergeben Sie dann diese Parameter an das Modul.<\/p>\n<p><\/p>\n<h3 id=\"vashi-biblioteki-delayut-desyat-veschey-horosho-ili-odnu---otlichno\">Machen Ihre Bibliotheken zehn Dinge gut oder eins \u2013 hervorragend?<\/h3>\n<p><\/p>\n<p>Am besten funktionieren Bibliotheken, die sich auf eine einzige Aufgabe konzentrieren, die sie ausgezeichnet erf\u00fcllen. Anstatt gro\u00dfe Terraform-Module zu schreiben, die versuchen, alles auf einmal zu erledigen, teilen Sie sie in Komponenten auf, die jeweils eine Sache gut machen. Kombinieren Sie diese dann nach Bedarf.<\/p>\n<p><\/p>\n<h3 id=\"kak-vy-proizvodite-izmeneniya-v-bibliotekah-bez-obratnoy-sovmestimosti\">Wie bringen Sie \u00c4nderungen in Bibliotheken ohne Abw\u00e4rtskompatibilit\u00e4t ein?<\/h3>\n<p><\/p>\n<p>Ein allgemeines Terraform-Modul, ebenso wie eine normale Bibliothek, muss den Benutzern auf irgendeine Weise \u00fcber \u00c4nderungen ohne Abw\u00e4rtskompatibilit\u00e4t berichten. Wenn solche \u00c4nderungen in Bibliotheken vorgenommen werden, ist das \u00e4rgerlich, und es ist genau so \u00e4rgerlich, wenn Abw\u00e4rtskompatibilit\u00e4t in Terraform-Modulen verletzt wird. Es wird empfohlen, git-Tags und semver beim Einsatz von Terraform-Modulen zu verwenden.<\/p>\n<p><\/p>\n<h3 id=\"proizvodstvennyy-servis-zapuschen-u-vas-na-noutbuke-ili-v-datacentre\">L\u00e4uft der Produktionsdienst auf Ihrem Laptop oder in einem Rechenzentrum?<\/h3>\n<p><\/p>\n<p>Hashicorp hat Tools wie <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/cloud\/index.html\">terraform cloud<\/a><\/noindex> um Ihr Terraform auszuf\u00fchren. Diese zentralisierten Dienste erleichtern die Verwaltung, Pr\u00fcfung und Genehmigung von \u00c4nderungen in Terraform.<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-pishete-testy\">Schreiben Sie keine Tests?<\/h3>\n<p><\/p>\n<p>Ingenieure erkennen an, dass Code getestet werden muss, aber oft ignorieren sie die \u00dcberpr\u00fcfungen, w\u00e4hrend sie mit Terraform arbeiten. F\u00fcr die Infrastruktur kann das t\u00fcckische Folgen haben. Ich empfehle, \u201eTests\u201c durchzuf\u00fchren oder \u201eBeispiele\u201c von Stacks mit Modulen zu erstellen, die korrekt bereitgestellt werden k\u00f6nnen, um w\u00e4hrend CI\/CD getestet zu werden.<\/p>\n<p><\/p>\n<h3 id=\"terraform-i-mikroservisy\">Terraform und Microservices<\/h3>\n<p><\/p>\n<blockquote><p>Die Existenz und das Versagen von Microservice-Unternehmen h\u00e4ngt von der Geschwindigkeit, Aktualisierung und dem Abbau neuer microservice-basierten Arbeits-Stacks ab.<\/p><\/blockquote>\n<p>Das am h\u00e4ufigsten genannte negative Element im Zusammenhang mit Microservice-Architekturen, von dem man sich nicht befreien kann, h\u00e4ngt mit der Arbeit und nicht mit dem Code zusammen. Wenn Sie Terraform nur als Mittel zur Automatisierung des infrastrukturellen Teils einer Microservice-Architektur betrachten, berauben Sie sich der echten Vorteile dieses Systems. Jetzt schon <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=HcmPi7-IVQo\">alles \u2013 als Code<\/a><\/noindex>.<\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/474546\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u0434\u0430 \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u044b\u0448\u0435\u0432\u043e\u0437\u0438\u0442\u044c. \u0417\u0430 \u044d\u0442\u043e\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439 \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u043b\u043e\u0441\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u2014 Infrastructure as Code, \u0438 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0434\u043b\u044f \u0435\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0438\u044f, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 AWS, \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430: Terraform \u0438 CloudFormation. \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Terraform \u0438 CloudFormation \u0414\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u0432 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-52367","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u0434\u0430 \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u044b\u0448\u0435\u0432\u043e\u0437\u0438\u0442\u044c.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0435\u0440\u0435\u0448\u0435\u043b \u0441 Terraform \u043d\u0430 CloudFormation \u2014 \u0438 \u043f\u043e\u0436\u0430\u043b\u0435\u043b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u0434\u0430 \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u044b\u0448\u0435\u0432\u043e\u0437\u0438\u0442\u044c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-11-06T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:00:04+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Wechsel von Terraform zu CloudFormation \u2014 und bereut es | ProHoster","description":"Die Infrastruktur in Form von Code in einem wiederholbaren Textformat darzustellen, ist eine einfache Best Practice f\u00fcr Systeme, die keine Mausf\u00fchrung erfordern.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0435\u0440\u0435\u0448\u0435\u043b \u0441 Terraform \u043d\u0430 CloudFormation \u2014 \u0438 \u043f\u043e\u0436\u0430\u043b\u0435\u043b | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u0434\u0430 \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u044b\u0448\u0435\u0432\u043e\u0437\u0438\u0442\u044c.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-11-06T21:00:00+00:00","article:modified_time":"2020-02-18T11:00:04+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52367","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 03:23:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:44:44","updated":"2026-01-24 03:23:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/52367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=52367"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/52367\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=52367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=52367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=52367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}