{"id":98123,"date":"2020-10-24T14:42:52","date_gmt":"2020-10-24T12:42:52","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens"},"modified":"2020-11-18T00:58:49","modified_gmt":"2020-11-17T22:58:49","slug":"patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","title":{"rendered":"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/ec13125c702f42863bbe774cd805442b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es scheint, dass die Entwickler von Terraform ausreichend n\u00fctzliche Best Practices f\u00fcr die Arbeit mit AWS-Infrastrukturen anbieten. Aber es gibt einen Haken. Im Laufe der Zeit vermehrt sich die Anzahl der Umgebungen, wobei jede ihre eigenen Besonderheiten aufweist. Es entsteht fast eine Kopie des Anwendungsstacks in einer benachbarten Region. Und der Terraform-Code muss sorgf\u00e4ltig kopiert und an die neuen Anforderungen angepasst oder als Schneeflocke erstellt werden.<\/p>\n<p><\/p>\n<p>Meine Pr\u00e4sentation \u00fcber Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine in gro\u00dfen, langfristigen Projekten.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Video:<\/p>\n<p>\n<center><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5f92845c017bf613f0899d88\" frameborder=\"0\" allowfullscreen><\/iframe><\/center><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8c67c45e486d6c03793dd08c33a16313.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ich bin 40 Jahre alt und seit 20 Jahren im IT-Bereich t\u00e4tig. Seit 12 Jahren arbeite ich bei Ixtens. Wir besch\u00e4ftigen uns mit ecommerce-driven Development. Und seit 5 Jahren praktiziere ich DevOps-Praktiken.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8b14b3adaa45d69278d76580baa99042.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mein Bericht wird \u00fcber die Erfahrungen in einem Projekt eines Unternehmens handeln, dessen Name ich aus Gr\u00fcnden der Geheimhaltung nicht nennen werde. <\/p>\n<p><\/p>\n<p>Die Zahlen auf der Folie dienen dazu, den Umfang des Projekts zu verdeutlichen. Und alles, was ich anschlie\u00dfend sagen werde, bezieht sich auf Amazon.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/3742217a2abaf1fcf2163979d82eac14.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ich bin vor 4 Jahren zu diesem Projekt gesto\u00dfen. Zu diesem Zeitpunkt habe ich die Infrastruktur umgestaltet, weil das Projekt gewachsen ist. Die bisherigen Muster waren nicht mehr passend. Angesichts des geplanten Wachstums des Projekts musste etwas Neues her. <\/p>\n<p><\/p>\n<p>Danke an Matwei, der mir gestern erz\u00e4hlt hat, was bei Dodo Pizza passiert ist. Das ist etwas, das bei uns vor 4 Jahren geschehen ist. <\/p>\n<p><\/p>\n<p>Die Entwickler kamen und begannen, infrastrukturellen Code zu erstellen. <\/p>\n<p><\/p>\n<p>Die offensichtlichsten Gr\u00fcnde, warum dies erforderlich war, waren der Time-to-Market. Es musste sichergestellt werden, dass das DevOps-Team kein Engpass beim Rollout war. Au\u00dferdem wurden auf der ersten Ebene Terraform und Puppet verwendet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/13d6df6a324d2e1162acef77ca2ad0dc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terraform ist ein Open-Source-Projekt von HashiCorp. F\u00fcr diejenigen, die damit nicht vertraut sind, folgen hier die n\u00e4chsten Folien. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/61726d4205d1f4f8e449fe9d71507508.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Infrastruktur als Code bedeutet, dass wir unsere Infrastruktur beschreiben und Roboter anweisen k\u00f6nnen, die Ressourcen bereitzustellen, die wir beschrieben haben.<\/p>\n<p><\/p>\n<p>Zum Beispiel ben\u00f6tigen wir <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/de\/vps\/abuzoustojchivye-vps\/\"   title=\"virtuelle Maschine\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"4196\">virtuelle Maschine<\/a>. Wir werden es beschreiben und ein paar erforderliche Parameter hinzuf\u00fcgen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/eb52c1e458fa092bba8577fffceb864c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Danach richten wir in der Konsole den Zugang zu Amazon ein und fordern Terraform plan an. Terraform plan wird sagen: \u201eOkay, f\u00fcr Ihre Ressource k\u00f6nnen wir die folgenden Dinge tun.\u201c Und mindestens eine Ressource wird hinzugef\u00fcgt. \u00c4nderungen sind nicht zu erwarten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/879e645596121ee5d05ac247b4be19ee.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sobald Sie zufrieden sind, k\u00f6nnen Sie Terraform apply anfordern, und Terraform wird Ihnen eine Instanz erstellen, sodass Sie eine virtuelle Maschine in Ihrer Cloud erhalten.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/77b7fe4d6abcc9116233f48caa887465.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Unser Projekt entwickelt sich weiter. Wir f\u00fcgen einige \u00c4nderungen hinzu. Wir bitten um zus\u00e4tzliche Instanzen und f\u00fcgen einen A-Record hinzu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/98ce7e1f9d1f85aa5e78c269a0708ac1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und wir wiederholen den Vorgang. Wir fordern den Plan an und sehen, welche \u00c4nderungen vorgesehen sind. Wir wenden sie an und somit w\u00e4chst unsere Infrastruktur. <\/p>\n<p><\/p>\n<p>Terraform verwendet sogenannte State-Dateien. Das hei\u00dft, alle \u00c4nderungen, die an Amazon gesendet werden, werden in einer Datei gespeichert, in der f\u00fcr jede Ressource, die Sie beschrieben haben, die entsprechenden Ressourcen aufgef\u00fchrt sind, die in Amazon erstellt wurden. So wei\u00df Terraform genau, was in Amazon ge\u00e4ndert werden muss, wenn die Beschreibung einer Ressource ge\u00e4ndert wird.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6e83efffb7af6ab967b4716be170b47b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Diese State-Dateien waren urspr\u00fcnglich einfache Dateien. Wir haben sie in Git gespeichert, was \u00e4u\u00dferst unpraktisch war. Jemand hat st\u00e4ndig vergessen, die \u00c4nderungen zu committen, was zu vielen Konflikten f\u00fchrte. <\/p>\n<p><\/p>\n<p>Jetzt haben Sie die M\u00f6glichkeit, das Backend zu nutzen, d. h. Terraform gibt an, in welchem Bucket und unter welchem Schl\u00fcssel die State-Datei gespeichert werden soll. Terraform k\u00fcmmert sich dann selbst darum, die State-Datei abzurufen, alle notwendigen Vorg\u00e4nge durchzuf\u00fchren und das finale Ergebnis zur\u00fcckzulegen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/e6687463a9fe3cff979f44ac7778b4e8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Unsere Infrastruktur w\u00e4chst. Hier ist unser Code. Und wir wollen nicht einfach nur eine virtuelle Maschine erstellen, wir ben\u00f6tigen jetzt eine Testumgebung.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/0effb09fa04d3d520c1cdbb34ce97810.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mit Terraform k\u00f6nnen Sie ein Modul erstellen, d. h. das Gleiche in einem bestimmten Ordner beschreiben.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/95c8395b10142fe550b0719161211f15.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sie k\u00f6nnen dieses Modul zum Testen aufrufen und erhalten das gleiche Ergebnis, als h\u00e4tten wir Terraform apply im Modul selbst ausgef\u00fchrt. F\u00fcr die Tests wird dieser Code verwendet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/fa4c16e3835a4507a858d2ddb767daf3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>F\u00fcr die Produktion k\u00f6nnen wir \u00c4nderungen vornehmen, denn in der Testumgebung ben\u00f6tigen wir keine gro\u00dfen Instanzen, aber in der Produktion sind diese gro\u00dfen Instanzen sehr n\u00fctzlich.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/19478de23da2278567e66bacef78a0a9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ich werde also zur\u00fcck zum Projekt kommen. Es war eine anspruchsvolle Aufgabe, die Infrastruktur wurde als sehr umfangreich geplant. Der gesamte Code musste so strukturiert werden, dass er f\u00fcr alle benutzerfreundlich war: sowohl f\u00fcr diejenigen, die Wartungsarbeiten an dem Code durchf\u00fchren, als auch f\u00fcr die, die \u00c4nderungen vornehmen. Es war vorgesehen, dass jeder Entwickler die Infrastruktur anpassen kann, um sie f\u00fcr seinen Teil der Plattform so zu gestalten, wie es ben\u00f6tigt wird. <\/p>\n<p><\/p>\n<p>Dies ist die von HashiCorp empfohlene Verzeichnisstruktur, wenn Sie ein gro\u00dfes Projekt haben und es sinnvoll ist, die gesamte Infrastruktur in kleinere Teile zu gliedern und jeden Teil in einem eigenen Ordner zu beschreiben. <\/p>\n<p><\/p>\n<p>Mit einer umfangreichen Bibliothek von Ressourcen ist es m\u00f6glich, in der Test- und Produktionsumgebung nahezu dasselbe zu verwenden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/c30cdc3d3ce5441bc0ae4a485069dacc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In unserem Fall war das nicht ganz passend, da der Test-Stack f\u00fcr Entwickler oder Tests einfacher bereitgestellt werden musste. Es war unpraktisch, durch verschiedene Ordner zu navigieren und diese in der richtigen Reihenfolge anzuwenden, und sich Sorgen zu machen, dass zuerst die Datenbank gestartet wird und dann die Instanz, die diese Datenbank nutzt. Daher wurde das gesamte Testen aus einem einzigen Ordner heraus initiiert. Dort wurden dieselben Module aufgerufen, aber alles lief in einem Durchgang ab.<\/p>\n<p><\/p>\n<p>Terraform k\u00fcmmert sich um alle Abh\u00e4ngigkeiten und erstellt stets Ressourcen in der Reihenfolge, die es erm\u00f6glicht, beispielsweise eine IP-Adresse von einer neu erstellten Instanz zu erhalten und diese IP-Adresse in einen Route53-Eintrag zu integrieren. <\/p>\n<p><\/p>\n<p>Dar\u00fcber hinaus ist die Plattform sehr umfangreich. Der Start eines Test-Stacks, selbst f\u00fcr eine Stunde oder acht Stunden, ist eine kostspielige Angelegenheit. <\/p>\n<p><\/p>\n<p>Wir haben dies automatisiert. Der Jenkins-Job erm\u00f6glichte das Starten des Stacks. Dabei musste ein Pull-Request mit den \u00c4nderungen eingereicht werden, die der Entwickler testen wollte, sowie alle ben\u00f6tigten Optionen, Komponenten und Gr\u00f6\u00dfen angeben. Wenn er Leistungstests durchf\u00fchren wollte, konnte er mehrere Instanzen w\u00e4hlen. Wenn er nur \u00fcberpr\u00fcfen wollte, dass eine bestimmte Maske ge\u00f6ffnet wird, konnte er mit minimalen Einstellungen starten. Au\u00dferdem konnte er angeben, ob ein Cluster ben\u00f6tigt wird oder nicht, usw. <\/p>\n<p><\/p>\n<p>Anschlie\u00dfend f\u00fchrte Jenkins ein Shell-Skript aus, das den Code im Terraform-Verzeichnis leicht modifizierte: es entfernte \u00fcberfl\u00fcssige Dateien und f\u00fcgte die ben\u00f6tigten Dateien hinzu. Danach wurde mit einem einzigen Durchgang 'Terraform apply' der Stack erstellt. <\/p>\n<p><\/p>\n<p>Die weiteren Schritte m\u00f6chte ich jedoch nicht vertiefen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b288c0b320d8cb6e282db994bc1c1f43.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Da wir f\u00fcr die Tests etwas mehr Optionen ben\u00f6tigten als in der Produktionsumgebung, mussten wir Kopien der Module erstellen, um in diesen Kopien die Funktionen hinzuzuf\u00fcgen, die nur f\u00fcr Tests erforderlich sind. <\/p>\n<p><\/p>\n<p>So kam es, dass wir im Test die \u00c4nderungen, die letztlich in die Produktion gehen sollten, zu testen versuchten. In der Realit\u00e4t wurde jedoch etwas anderes getestet, und in der Produktion wurden geringf\u00fcgig andere \u00c4nderungen angewendet. Das f\u00fchrte zu einer kleinen Diskrepanz, da alle \u00c4nderungen in der Produktionsumgebung vom Operationsteam umgesetzt wurden. Manchmal geschah es, dass die \u00c4nderungen, die aus dem Test in die Produktion \u00fcbergehen sollten, in einer anderen Version verblieben. <\/p>\n<p><\/p>\n<p>Dar\u00fcber hinaus gab es das Problem, dass ein neuer Dienst hinzugef\u00fcgt wurde, der sich etwas von einem bereits bestehenden unterschied. Statt das bestehende Modul zu modifizieren, war es notwendig, eine Kopie zu erstellen und die erforderlichen \u00c4nderungen hinzuzuf\u00fcgen. <\/p>\n<p><\/p>\n<p>Im Grunde genommen ist Terraform keine echte Sprache. Es ist eine Deklaration. Wenn wir etwas deklarieren m\u00fcssen, dann tun wir das. Und alles funktioniert.<\/p>\n<p><\/p>\n<p>Irgendwann, als einer meiner Pull Requests besprochen wurde, sagte ein Kollege, dass man keine Schneeflocken produzieren solle. Das hat mich neugierig gemacht, was er damit meint. Es gibt die wissenschaftliche Tatsache, dass es auf der Welt keine zwei identischen Schneeflocken gibt; sie unterscheiden sich immer ein wenig. Sobald ich das h\u00f6rte, wurde mir die gesamte Komplexit\u00e4t des Terraform-Codes bewusst. Denn wenn man von einer Version zur n\u00e4chsten wechseln wollte, verlangte Terraform ein breaking change, was bedeutete, dass der Code nicht mehr mit der n\u00e4chsten Version kompatibel war. Das brachte uns dazu, einen Pull Request zu erstellen, der fast die H\u00e4lfte der Dateien in der Infrastruktur betraf, um die Infrastruktur auf die n\u00e4chste Version von Terraform zu bringen.<\/p>\n<p><\/p>\n<p>Und nachdem so eine Schneeflocke aufgetaucht war, verwandelte sich unser gesamter Terraform-Code in einen riesigen Haufen Schnee. <\/p>\n<p><\/p>\n<p>F\u00fcr einen externen Entwickler, der nicht im Betrieb ist, hat das keine gro\u00dfe Bedeutung, denn er hat einen Pull Request erstellt, seine Ressource wurde gestartet, und das war's, damit hat er nichts mehr zu tun. Aber das DevOps-Team, das daf\u00fcr sorgt, dass alles in Ordnung ist, muss all diese \u00c4nderungen vornehmen. Und die Kosten f\u00fcr diese \u00c4nderungen stiegen mit jeder zus\u00e4tzlichen Schneeflocke enorm.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/d07039414027798861d1424bb2c686b6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es gibt eine Geschichte \u00fcber einen Studenten, der w\u00e4hrend eines Seminars mit Kreide zwei perfekte Kreise an die Tafel zeichnet. Der Dozent ist erstaunt, wie es ihm gelungen ist, so gleichm\u00e4\u00dfig ohne Zirkel zu zeichnen. Der Student antwortet: \u201eDas ist ganz einfach, ich habe zwei Jahre lang in der Armee eine Fleischerei gedreht.\u201c <\/p>\n<p><\/p>\n<p>Von den vier Jahren, in denen ich an diesem Projekt beteiligt bin, arbeite ich etwa zwei Jahre mit Terraform. Nat\u00fcrlich habe ich einige Tricks und Tipps, wie man Terraform-Code vereinfachen kann, ihn wie eine Programmiersprache behandelt und die Last f\u00fcr die Entwickler reduziert, die diesen Code aktuell halten m\u00fcssen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9413c6adf1933482dcc822b021773df9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das erste, womit ich beginnen m\u00f6chte, sind Symlinks. Terraform hat viel sich wiederholenden Code. Zum Beispiel wird der Provider an fast jedem Punkt, an dem wir einen Teil der Infrastruktur erstellen, gleich aufgerufen. Daher ist es logisch, ihn in einen separaten Ordner auszulagern. An allen Stellen, wo der Provider ben\u00f6tigt wird, sollten Symlinks auf diese Datei erstellt werden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6dcf36cc8c94e7a70cf6ab1456cc1215.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zum Beispiel verwenden Sie in Ihrer Produktionsumgebung eine Assume Role, die Ihnen Zugriff auf ein externes Amazon-Konto erm\u00f6glicht. Durch das \u00c4ndern einer Datei erhalten alle anderen Dateien im Ressourcenbaum die erforderlichen Berechtigungen, damit Terraform wei\u00df, auf welches Amazon-Segment es zugreifen soll. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6df9a89ef48ae9a7adda7fb1f86b76aa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wo funktionieren Symlinks nicht? Wie bereits erw\u00e4hnt, enth\u00e4lt Terraform State-Dateien. Und diese sind wirklich sehr n\u00fctzlich. Das Problem ist, dass Terraform den Backend im allerersten Schritt initialisiert. Dabei kann es in diesen Parametern keine Variablen verwenden, sie m\u00fcssen immer als Text angegeben werden. <\/p>\n<p><\/p>\n<p>Infolgedessen kopiert jemand, der eine neue Ressource erstellt, Teile des Codes aus anderen Verzeichnissen. Dabei kann es zu einem Fehler kommen, was den Schl\u00fcssel oder den Bucket betrifft. Zum Beispiel, wenn er eine Sandbox-Ressource zur Sandbox kopiert und dann in der Produktion verwendet. So k\u00f6nnte es passieren, dass der Bucket in der Produktion aus der Sandbox genutzt wird. Nat\u00fcrlich w\u00fcrde das schnell auffallen. Man k\u00f6nnte es irgendwie beheben, aber dennoch ist das Zeit- und in gewisser Weise Ressourcenverlust. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/757294dc6a1a27fc4a5fe174cc4aa7d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was k\u00f6nnen wir als N\u00e4chstes tun? Bevor Sie mit Terraform arbeiten, m\u00fcssen Sie es initialisieren. W\u00e4hrend der Initialisierung l\u00e4dt Terraform alle Plugins herunter. Diese haben sich irgendwann von einem Monolithen zu einer mikroservicebasierten Architektur entwickelt. Daher ist es immer notwendig, Terraform init auszuf\u00fchren, damit alle Module und Plugins geladen werden.<\/p>\n<p><\/p>\n<p>Sie k\u00f6nnen ein Shell-Skript verwenden, das erstens alle Variablen abrufen kann. Ein Shell-Skript ist in seiner Funktionalit\u00e4t nicht eingeschr\u00e4nkt. Zweitens k\u00f6nnen Sie die Pfade angeben. Wenn wir immer den gleichen Pfad verwenden, der im Repository als Schl\u00fcssel zur Statusdatei dient, wird ein Fehler hier ausgeschlossen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b70dbc6d8edb1b255c64d722a7e40680.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Woher kommen die Daten? Aus einer JSON-Datei. Terraform erm\u00f6glicht es, Infrastruktur nicht nur in HCL (HashiCorp Configuration Language), sondern auch in JSON zu speichern.<\/p>\n<p><\/p>\n<p>JSON l\u00e4sst sich leicht aus einem Shell-Skript lesen. Somit k\u00f6nnen Sie eine Konfigurationsdatei mit einem Bucket an einem Ort ablegen. Dieser Bucket kann sowohl im Terraform-Code als auch im Shell-Skript zur Initialisierung verwendet werden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/a18b92cac763003ec49af8d4a37e19d9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Warum ist es wichtig, einen Bucket f\u00fcr Terraform zu haben? Weil es so etwas wie Remote-Statusdateien gibt. Das hei\u00dft, wenn ich eine Ressource starte, muss ich Amazon viele erforderliche Parameter angeben, um zu sagen: \"Bitte starten Sie das Instance.\" <\/p>\n<p><\/p>\n<p>Diese Identifikatoren werden in einem anderen Ordner gespeichert. Ich kann sagen: \u201eTerraform, bitte gehe zum State-File dieses Ressourcen und hole mir diese Identifikatoren.\u201c So entsteht eine gewisse Vereinheitlichung zwischen verschiedenen Regionen oder Umgebungen.<\/p>\n<p><\/p>\n<p>Es ist nicht immer m\u00f6glich, eine entfernte State-Datei zu verwenden. Zum Beispiel, wenn Sie manuell ein VPC erstellt haben. Der Terraform-Code, der das VPC erstellt, erzeugt ein so un\u00e4hnliches VPC, dass Sie viel Zeit damit verbringen m\u00fcssen, um es anzupassen. Daher kann man den folgenden Ansatz verwenden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/04ffcd97e2fae323d9b4d81e5f6c751a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das hei\u00dft, Sie erstellen ein Modul, das gewisserma\u00dfen ein VPC erstellt und Ihnen die Identifikatoren zur Verf\u00fcgung stellt, tats\u00e4chlich gibt es jedoch eine Datei mit fest kodierten Werten, die zur Erstellung desselben Instances verwendet werden kann.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9cd878c459f377caf5af9bf27b026187.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es ist nicht immer notwendig, die State-Datei in der Cloud zu speichern. Wenn zum Beispiel Module getestet werden, kann man die Backend-Initialisierung verwenden, bei der die Datei einfach w\u00e4hrend des Testens auf der Festplatte gespeichert wird.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/70fee8d4105cfddacafeec00825127b5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jetzt ein bisschen \u00fcber das Testen. Was kann man in Terraform testen? Wahrscheinlich vieles, aber ich werde \u00fcber diese 4 Punkte sprechen.<\/p>\n<p><\/p>\n<p>HashiCorp hat ein klares Verst\u00e4ndnis davon, wie Terraform-Code formatiert werden sollte. Mit Terraform fmt k\u00f6nnen Sie den Code, den Sie bearbeiten, gem\u00e4\u00df dieser Auffassung formatieren. Daher sollten die Tests sicherstellen, dass die Formatierung den Vorgaben von HashiCorp entspricht, um \u00c4nderungen an der Position von Klammern usw. zu vermeiden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/bb99ffdd9f963f0f44ea7b5379689737.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der n\u00e4chste Schritt ist Terraform validate. Dieser erledigt etwas mehr als nur eine Syntaxpr\u00fcfung \u2013 etwa, ob alle Klammern paarig sind. Was hier wichtig ist? Unsere Infrastruktur ist sehr komplex. Sie umfasst viele verschiedene Ordner. In jedem muss Terraform validate ausgef\u00fchrt werden.<\/p>\n<p><\/p>\n<p>Um die Tests zu beschleunigen, f\u00fchren wir mehrere Prozesse parallel aus. <\/p>\n<p><\/p>\n<p>Parallelit\u00e4t ist ein sehr n\u00fctzliches Feature, nutzen Sie es.<\/p>\n<p><\/p>\n<p>Aber jedes Mal, wenn Terraform initialisiert wird, fragt es bei HashiCorp nach: \u201eWas sind die neuesten Plugin-Versionen? Und das Plugin, das ich im Cache habe \u2013 ist das das richtige oder nicht?\u201c Das hat jedes Mal zu einer Verz\u00f6gerung gef\u00fchrt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/836e90327c7a60c493f42f0a055e248b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wenn Terraform gefragt wird, wo die Plugins liegen, wird Terraform sagen: \u201eOkay, das ist wohl das Neueste, was es gibt. Ich werde nirgendwo hingehen, ich beginne sofort, Ihren Terraform-Code zu validieren.\u201c<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8ab344cf8de7087d30a1212d44691c20.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Um den entsprechenden Ordner mit den ben\u00f6tigten Plugins zu f\u00fcllen, haben wir einen sehr einfachen Terraform-Code, den Sie nur initialisieren m\u00fcssen. Hier m\u00fcssen nat\u00fcrlich alle Anbieter angegeben werden, die in Ihrem Code eine Rolle spielen, sonst wird Terraform sagen: \u201eIch kenne keinen Anbieter, weil dieser nicht im Cache ist.\u201c<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b8130753045624d38bce32ba08b56fb0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das N\u00e4chste ist Terraform plan. Wie bereits erw\u00e4hnt, ist die Entwicklung zyklisch. Wir machen Code mit \u00c4nderungen. Und dann m\u00fcssen wir herausfinden, welche \u00c4nderungen f\u00fcr die Infrastruktur geplant sind. <\/p>\n<p><\/p>\n<p>Und wenn die Infrastruktur sehr, sehr gro\u00df ist, kann man ein Modul \u00e4ndern, eine Testumgebung reparieren oder eine bestimmte Region und dabei eine benachbarte kaputt machen. Daher sollte Terraform plan f\u00fcr die gesamte Infrastruktur durchgef\u00fchrt werden und zeigen, welche \u00c4nderungen geplant sind.<\/p>\n<p><\/p>\n<p>Man kann es intelligent angehen. Zum Beispiel haben wir ein Python-Skript geschrieben, das die Abh\u00e4ngigkeiten aufl\u00f6st. Abh\u00e4ngig davon, was ge\u00e4ndert wurde \u2013 ein Terraform-Modul oder einfach ein bestimmtes Element \u2013 erstellt es Pl\u00e4ne f\u00fcr alle abh\u00e4ngigen Verzeichnisse.<\/p>\n<p><\/p>\n<p>Terraform-Pl\u00e4ne sollten auf Anfrage erstellt werden. Das ist zumindest das, was wir tun. <\/p>\n<p><\/p>\n<p>Tests sind nat\u00fcrlich gut, um jede \u00c4nderung, jeden Commit zu \u00fcberpr\u00fcfen, aber Pl\u00e4ne sind eine recht kostspielige Angelegenheit. Und im Pull-Request sagen wir: \"Bitte, gib mir die Pl\u00e4ne.\" Ein Bot wird gestartet und sendet in den Kommentaren oder als Anhang alle Pl\u00e4ne, die aus deinen \u00c4nderungen abgeleitet werden. <\/p>\n<p><\/p>\n<p>Ein Plan ist eine recht kostspielige Angelegenheit. Er ben\u00f6tigt Zeit, da Terraform bei Amazon nachfragt: \"Existiert diese Instanz noch? Hat dieses Autoscale tats\u00e4chlich diese Parameter?\" Um dies zu beschleunigen, kann man einen Parameter wie refresh=false verwenden. Das bedeutet, dass Terraform den Status aus S3 l\u00e4dt und davon ausgeht, dass der Status genau dem entspricht, was bei Amazon vorhanden ist.<\/p>\n<p><\/p>\n<p>Ein solcher Terraform-Plan wird deutlich schneller ausgef\u00fchrt, jedoch muss der State Ihrer Infrastruktur entsprechen. Das bedeutet, dass irgendwann und irgendwo ein Terraform Refresh durchgef\u00fchrt werden muss. Terraform Refresh sorgt genau daf\u00fcr, dass der State mit dem \u00fcbereinstimmt, was sich in der realen Infrastruktur befindet. <\/p>\n<p><\/p>\n<p>Ein wichtiger Punkt, den ich ansprechen m\u00f6chte, ist die Sicherheit. Darin h\u00e4tte man beginnen sollen. An dem Ort, wo Sie Terraform ausf\u00fchren und es mit Ihrer Infrastruktur arbeitet, gibt es eine Verwundbarkeit. Das hei\u00dft, Sie f\u00fchren im Grunde genommen Code aus. Wenn der Pull-Request schadhafter Code enth\u00e4lt, kann dieser auf einer Infrastruktur ausgef\u00fchrt werden, die zu viel Zugriff hat. Seien Sie daher vorsichtig, wo Sie den Terraform-Plan ausf\u00fchren.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/2153cc01acf2b1f46978f837b82b317e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das n\u00e4chste Thema, \u00fcber das ich sprechen m\u00f6chte, ist das Testen von User-Data.<\/p>\n<p><\/p>\n<p>Was ist User-Data? Bei Amazon, wenn wir eine Instanz erstellen, k\u00f6nnen wir von dieser Instanz aus eine Art Nachricht senden \u2013 Metadaten. Wenn die Instanz gestartet wird, ist Cloud Init normalerweise immer auf diesen Instanzen vorhanden. Cloud Init liest diese Nachricht und sagt: \u201eOkay, heute bin ich der Load Balancer.\u201c Und entsprechend diesen Vorgaben f\u00fchrt es bestimmte Aktionen durch.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/406ac9341e102f5e0d7ca239d10675cd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Leider sieht user-data wie ein Wirrwarr aus Zahlen aus, wenn wir Terraform plan und Terraform apply durchf\u00fchren. Das bedeutet, dass er Ihnen lediglich einen Hash sendet. Alles, was Sie im Plan sehen k\u00f6nnen, sind m\u00f6gliche \u00c4nderungen oder der Hash bleibt gleich. <\/p>\n<p><\/p>\n<p>Wenn man dem keine Beachtung schenkt, k\u00f6nnte auf Amazon ein besch\u00e4digtes Textdatei auf die tats\u00e4chliche Infrastruktur \u00fcbertragen werden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/cd7b56f1149d9cbebb0ad3228c0eeb5f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eine alternative Methode w\u00e4re, nur das Template anzugeben, anstatt die gesamte Infrastruktur auszuf\u00fchren. Im Code k\u00f6nnen Sie sagen: \u201eBitte zeigen Sie mir dieses Template an\u201c. So erhalten Sie eine Ausgabe, wie Ihre Daten auf Amazon aussehen werden.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/86da779cdf7f9cacfd80a196efde47f7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eine andere M\u00f6glichkeit besteht darin, ein Modul zur Generierung von user-data zu verwenden. Sie setzen dieses Modul ein, erhalten eine Datei auf der Festplatte und vergleichen sie mit der Referenz. Dadurch wird, falls ein Junior etwas an user-data \u00e4ndern m\u00f6chte, Ihre Testumgebung zeigen: \u201eIn Ordnung, hier und hier gibt es einige \u00c4nderungen \u2013 das ist normal.\u201c<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/7e69ec1b2c04710066d93ee48f872254.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das n\u00e4chste, wor\u00fcber ich sprechen m\u00f6chte, ist Automate Terraform apply.<\/p>\n<p><\/p>\n<p>Nat\u00fcrlich ist es ziemlich be\u00e4ngstigend, Terraform im automatischen Modus auszuf\u00fchren, denn wer wei\u00df, welche \u00c4nderungen dort vorgenommen wurden und wie sch\u00e4dlich sie f\u00fcr die live Infrastruktur sein k\u00f6nnten. <\/p>\n<p><\/p>\n<p>F\u00fcr Testumgebungen ist das alles in Ordnung. Das bedeutet, dass ein Job, der eine Testumgebung erstellt, f\u00fcr alle Entwickler wichtig ist. Und eine Aussage wie \u201ebei mir hat alles funktioniert\u201c ist kein lustiger Meme, sondern ein Beweis daf\u00fcr, dass die Person sich damit besch\u00e4ftigt hat, das Stack aufgebaut, einige Tests auf diesem Stack ausgef\u00fchrt hat und festgestellt hat, dass alles in Ordnung ist, und gesagt hat: \u201eOkay, der Code, den ich herausgebe, wurde getestet.\u201c<\/p>\n<p><\/p>\n<p>In Produktions-, Sandbox- und anderen Umgebungen, die gesch\u00e4ftlich wichtiger sind, k\u00f6nnen einige Ressourcen teilweise relativ sicher angewendet werden, da dies nicht dazu f\u00fchrt, dass jemand ausf\u00e4llt. Dazu geh\u00f6ren: Autoscale-Gruppen, Sicherheitsgruppen, Rollen, Route53 und die Liste kann recht umfangreich sein. Aber achten Sie darauf, was passiert, und lesen Sie die Berichte \u00fcber automatische Anwendungen. <\/p>\n<p><\/p>\n<p>Wo Anwendung gef\u00e4hrlich oder be\u00e4ngstigend ist, beispielsweise bei persistenten Ressourcen oder Datenbanken, erhalten Sie Berichte dar\u00fcber, dass in einem Teil der Infrastruktur nicht angewendete \u00c4nderungen vorliegen. Der Ingenieur startet dann unter Aufsicht Jobs, um diese \u00c4nderungen anzuwenden oder erledigt dies \u00fcber seine Konsole. <\/p>\n<p><\/p>\n<p>Bei Amazon gibt es eine Funktion namens Terminate Protection. Diese kann in bestimmten F\u00e4llen vor unerw\u00fcnschten \u00c4nderungen sch\u00fctzen. Das hei\u00dft, Terraform fragt Amazon: \u201eIch muss dieses Instance l\u00f6schen, um ein anderes zu erstellen\u201c. Und Amazon antwortet: \u201eEntschuldigung, nicht heute. Wir haben die Terminate Protection aktiviert.\u201c<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9f4258d8688556829586a1e308f5a1e2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das Sahneh\u00e4ubchen ist die Optimierung des Codes. Wenn wir mit Terraform-Code arbeiten, m\u00fcssen wir dem Modul eine sehr gro\u00dfe Anzahl an Parametern \u00fcbergeben. Diese Parameter sind notwendig, um eine bestimmte Ressource zu erstellen. Der Code verwandelt sich in lange Listen von Parametern, die von Modul zu Modul \u00fcbergeben werden m\u00fcssen, insbesondere wenn es sich um verschachtelte Module handelt. <\/p>\n<p><\/p>\n<p>Dies ist sehr schwer lesbar. Es ist schwierig, dazu eine \u00dcberpr\u00fcfung durchzuf\u00fchren. Oft passiert es, dass bestimmte Parameter \u00fcberpr\u00fcft werden und sie nicht ganz den Anforderungen entsprechen. Das kostet Zeit und Geld, um sp\u00e4ter Korrekturen vorzunehmen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/ad7e8a91692212fda9f2561854b881c9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Deshalb schlage ich vor, eine Funktion zu verwenden, die einen komplexen Parameter beinhaltet, der eine Art Wertbaum enth\u00e4lt. Das hei\u00dft, Sie ben\u00f6tigen einen Ordner, in dem alle Werte aufgef\u00fchrt sind, die Sie in einer bestimmten Umgebung haben m\u00f6chten.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/909632949eb30057bf86b116239d9077.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Durch den Aufruf dieses Moduls kann man einen Baum erhalten, der in einem gemeinsamen Modul generiert wird, also in einem Modul, das f\u00fcr die gesamte Infrastruktur einheitlich funktioniert.<\/p>\n<p><\/p>\n<p>In diesem Modul k\u00f6nnen Sie Berechnungen durchf\u00fchren, indem Sie eine neue Funktion in Terraform nutzen, wie z.B. locals. Anschlie\u00dfend k\u00f6nnen Sie mit einem Output einen komplexen Parameter ausgeben, der Hashes, Arrays usw. enthalten kann. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/25c14e0397f8d95c301e0dfe6ae761df.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das waren all meine besten Funde, und ich m\u00f6chte euch eine Geschichte \u00fcber Kolumbus erz\u00e4hlen. Als er Geld f\u00fcr seine Expedition suchte, um Indien zu entdecken (so dachte er damals), glaubte niemand an ihn, und alle hielten es f\u00fcr unm\u00f6glich. Daraufhin sagte er: 'Macht so, dass das Ei nicht f\u00e4llt.' Alle Bankiers \u2013 sehr reiche und wahrscheinlich kluge Leute \u2013 versuchten auf irgendeine Weise, das Ei aufzustellen, und es fiel immer wieder. Dann nahm Kolumbus das Ei, dr\u00fcckte leicht darauf, die Schale gab nach und das Ei blieb stehen. Sie sagten: 'Oh, das ist zu einfach!'. Und Kolumbus antwortete: 'Ja, das ist zu einfach. Und wenn ich Indien entdecke, werden alle diesen Handelsweg nutzen.' <\/p>\n<p><\/p>\n<p>Das, was ich euch gerade erz\u00e4hlt habe, sind wahrscheinlich ziemlich einfache und triviale Dinge. Und wenn du sie erkennst und anf\u00e4ngst, sie zu nutzen, ist das v\u00f6llig normal. Also macht Gebrauch davon. Und wenn das f\u00fcr euch ganz normale Dinge sind, dann wisst ihr zumindest, wie man ein Ei aufstellt, damit es nicht f\u00e4llt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/37bf83d04b99f089f2319c8d2e8aaeb4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Fassen wir zusammen: <\/p>\n<p><\/p>\n<ul>\n<li>Vermeiden Sie Schneeflocken. Je weniger Schneeflocken, desto weniger Ressourcen ben\u00f6tigen Sie, um \u00c4nderungen an Ihrer umfangreichen Infrastruktur vorzunehmen. <\/li>\n<li>St\u00e4ndige \u00c4nderungen. Das bedeutet, dass nach \u00c4nderungen im Code Ihre Infrastruktur so schnell wie m\u00f6glich angepasst werden muss. Es sollte nicht vorkommen, dass jemand nach zwei oder drei Monaten kommt, um sich Elasticsearch anzusehen, ein Terraform-Plan durchf\u00fchrt und feststellt, dass es eine Menge unerwarteter \u00c4nderungen gibt. Dies kostet viel Zeit, um alles wieder in Ordnung zu bringen. <\/li>\n<li>Tests und Automatisierung. Je mehr Ihr Code durch Tests und Funktionen abgedeckt ist, desto mehr Vertrauen haben Sie, dass Sie alles richtig machen. Automatisierte Lieferungen erh\u00f6hen Ihr Vertrauen erheblich. <\/li>\n<li>Der Code f\u00fcr Test- und Produktionsumgebungen sollte nahezu identisch sein. Nahezu, da die Produktionsumgebung doch etwas anders ist und es dabei immer Unterschiede geben wird, die \u00fcber die Testumgebung hinausgehen. Dennoch kann man das in etwa sicherstellen. <\/li>\n<li>Wenn Sie viel Terraform-Code haben und die Pflege dieses Codes viel Zeit in Anspruch nimmt, ist es nie zu sp\u00e4t, eine Refaktorisierung vorzunehmen und ihn in eine gute Form zu bringen. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/68f3946536f44eed33939b234fb3ca0d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Unver\u00e4nderliche Infrastruktur. Bereitstellung von AMI nach Zeitplan. <\/li>\n<li>Struktur f\u00fcr Route53, wenn Sie sehr viele Eintr\u00e4ge haben und sicherstellen m\u00f6chten, dass sie in einer konsistenten Reihenfolge sind. <\/li>\n<li>Umgang mit API-Ratenlimits. Wenn Amazon sagt: \u201eIch kann keine Anfragen mehr annehmen, bitte warten Sie\u201c. Und die H\u00e4lfte des Unternehmens wartet, bis es seine Infrastruktur starten kann. <\/li>\n<li>Spot-Instances. Amazon ist keine g\u00fcnstige L\u00f6sung, und Spot-Instances erm\u00f6glichen erhebliche Einsparungen. Dar\u00fcber k\u00f6nnte man eine ganze Pr\u00e4sentation halten. <\/li>\n<li>Sicherheit und IAM-Rollen. <\/li>\n<li>Suche nach verlorenen Ressourcen, wenn Sie in Amazon Instances unbekannter Herkunft haben, die Geld kosten. Selbst wenn diese Instances 100-150 Dollar im Monat kosten \u2013 im Jahr ergibt sich das auf \u00fcber 1.000 Dollar. Das Auffinden solcher Ressourcen kann profitabel sein. <\/li>\n<li>Und reservierte Instances. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/69ddbf4c726bcc15aea1a1e2d67a3fc8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das w\u00e4re alles von meiner Seite. Terraform ist gro\u00dfartig, nutzen Sie es. Vielen Dank!<\/p>\n<p><\/p>\n<p>Fragen<\/p>\n<p><\/p>\n<p><em>Vielen Dank f\u00fcr den Vortrag! Ihr State-File liegt in S3, aber wie l\u00f6sen Sie das Problem, dass mehrere Personen dieses State-File nehmen und versuchen, es zu deployen?<\/em><\/p>\n<p><\/p>\n<p>Zun\u00e4chst einmal haben wir es nicht eilig. Zweitens gibt es Flags, mit denen wir kommunizieren, dass wir an einem bestimmten Code-Bereich arbeiten. Das hei\u00dft, auch wenn die Infrastruktur sehr gro\u00df ist, bedeutet das nicht, dass st\u00e4ndig jemand etwas anwendet. In der aktiven Phase war das ein Problem, wir haben die State-Files in Git gespeichert. Das war wichtig, sonst w\u00fcrde jemand ein State-File erstellen und wir m\u00fcssten sie manuell zusammenf\u00fchren, damit alles weitergehen konnte. Jetzt gibt es dieses Problem nicht mehr. Generell hat Terraform dieses Problem gel\u00f6st. Und wenn sich st\u00e4ndig etwas \u00e4ndert, k\u00f6nnen Sie Locks verwenden, die verhindern, was Sie gesagt haben.<\/p>\n<p><\/p>\n<p><em>Verwenden Sie die Open-Source-Version oder die Enterprise-Version?<\/em><\/p>\n<p><\/p>\n<p>Keine Enterprise, das hei\u00dft, alles, was man herunterladen und kostenlos nutzen kann. <\/p>\n<p><\/p>\n<p><em>Ich hei\u00dfe Stanislav. Ich wollte eine kleine Erg\u00e4nzung machen. Sie haben \u00fcber das Feature von Amazon gesprochen, das es erm\u00f6glicht, eine Instanz unzerst\u00f6rbar zu machen. Das gibt es auch in Terraform, im Block Life Second kann man ein \u00c4nderungsverbot oder ein Zerst\u00f6rungsverbot festlegen.<\/em> <\/p>\n<p><\/p>\n<p>Die Zeit war begrenzt. Ein guter Hinweis. <\/p>\n<p><\/p>\n<p><em>Ich wollte noch zwei Dinge fragen. Erstens, Sie haben das Testen angesprochen. Haben Sie irgendwelche Tools zum Testen verwendet? Ich habe von dem Plugin Test Kitchen geh\u00f6rt. Vielleicht gibt es noch andere. Und ich w\u00fcrde auch gerne etwas \u00fcber Local Values fragen. Wie unterscheiden sie sich grunds\u00e4tzlich von Input Variables? Und warum kann ich nichts nur \u00fcber Local Values parametrieren? Ich habe versucht, mich mit diesem Thema auseinanderzusetzen, aber ich bin nicht wirklich weitergekommen.<\/em><\/p>\n<p><\/p>\n<p>Wir k\u00f6nnen dieses Thema gerne detaillierter hinter dem Saal besprechen. Die Testtools sind bei uns komplett selbstgemacht. Da gibt es nichts, um wirklich zu testen. Es gibt jedoch Optionen, wo automatische Tests die Infrastruktur irgendwo hochfahren, \u00fcberpr\u00fcfen, dass sie in Ordnung ist, und dann alles mit einem Bericht vernichten, dass Ihre Infrastruktur weiterhin gut funktioniert. Das haben wir nicht, weil die Test-Stacks jeden Tag gestartet werden. Und das ist ausreichend. Wenn etwas anf\u00e4ngt kaputtzugehen, dann wird es ohnehin kaputtgehen, ohne dass wir es vorher anderswo testen. <\/p>\n<p><\/p>\n<p>Was die Local Values betrifft, lassen Sie uns das Gespr\u00e4ch gerne hinter dem Saal fortsetzen. <\/p>\n<p><\/p>\n<p><em>Hallo! Danke f\u00fcr deinen Vortrag! Sehr aufschlussreich. Du hast erw\u00e4hnt, dass ihr sehr viel \u00e4hnliche Codes zur Beschreibung der Infrastruktur habt. Habt ihr in Betracht gezogen, diesen Code zu generieren?<\/em><\/p>\n<p><\/p>\n<p>Das ist eine gro\u00dfartige Frage, danke! Das Problem ist, dass, wenn wir Infrastruktur als Code verwenden, wir davon ausgehen, dass wir den Code betrachten und verstehen, welche Infrastruktur dahinter steckt. Wenn der Code generiert wird, m\u00fcssen wir uns vorstellen, welcher Code erzeugt wird, um zu verstehen, welche Infrastruktur dort vorhanden ist. Entweder generieren wir den Code, committen ihn und im Grunde genommen ist es das Gleiche. Deshalb sind wir den Weg gegangen, wie wir es geschrieben haben, und das haben wir erhalten. Zudem sind die Generatoren etwas sp\u00e4ter aufgekommen, als wir damit begonnen haben. Und es war schon zu sp\u00e4t, um zu \u00e4ndern.<\/p>\n<p><\/p>\n<p><em>Hast du schon etwas von Jsonnet geh\u00f6rt?<\/em><\/p>\n<p><\/p>\n<p>Nein. <\/p>\n<p><\/p>\n<p><em>Das ist wirklich eine interessante Sache. Ich sehe einen spezifischen Anwendungsfall, wo man es verwenden und Datenstrukturen generieren kann.<\/em> <\/p>\n<p><\/p>\n<p>Generatoren sind gut, wenn man, wie im Witz \u00fcber den Rasierer, denkt. Das hei\u00dft, beim ersten Mal sieht das Gesicht anders aus, aber dann haben alle das gleiche Gesicht. Generatoren kommen sehr gut an. Aber leider sind unsere Gesichter ein bisschen unterschiedlich. Das ist das Problem. <\/p>\n<p><\/p>\n<p><em>Schau einfach mal. Danke!<\/em><\/p>\n<p><\/p>\n<p><em>Mein Name ist Maxim, ich komme von Sberbank. Sie haben ein wenig erz\u00e4hlt, dass Sie versucht haben, Terraform mit einer Programmiersprache gleichzusetzen. Ist es nicht einfacher, Ansible zu verwenden?<\/em><\/p>\n<p><\/p>\n<p>Das sind ganz unterschiedliche Dinge. Man kann sowohl mit Ansible als auch mit Puppet Ressourcen in Amazon erstellen. Aber Terraform ist daf\u00fcr besonders geeignet. <\/p>\n<p><\/p>\n<p><em>Haben Sie nur Amazon?<\/em><\/p>\n<p><\/p>\n<p>Es geht nicht darum, dass wir nur Amazon haben. Es ist fast ausschlie\u00dflich Amazon. Aber das Hauptmerkmal ist, dass Terraform sich merkt, was Sie tun. Wenn Sie Ansible sagen: \u201eStarte mir 5 Instanzen\u201c, dann macht er das, und wenn Sie dann sagen: \u201eIch h\u00e4tte jetzt gerne 3\u201c, wird Terraform sagen: \u201eOkay, ich l\u00f6sche 2\u201c, w\u00e4hrend Ansible einfach sagt: \u201eOkay, hier sind 3\u201c. Damit w\u00e4ren es insgesamt 8.<\/p>\n<p><\/p>\n<p><em>Guten Tag! Vielen Dank f\u00fcr Ihren Vortrag! Es war interessant, mehr \u00fcber Terraform zu erfahren. Ich m\u00f6chte gleich einen kleinen Kommentar dazu abgeben, dass Terraform dennoch keine stabile Version hat, also gehen Sie mit Vorsicht an Terraform heran.<\/em><\/p>\n<p><\/p>\n<p>Nach dem Essen ist die beste Zeit f\u00fcr einen L\u00f6ffel. Das hei\u00dft, wenn Sie eine L\u00f6sung brauchen, dann verschieben Sie manchmal, was instabil und so weiter ist, aber es funktioniert und hat uns geholfen. <\/p>\n<p><\/p>\n<p><em>Ich habe eine Frage. Sie verwenden Remote-Backends, Sie verwenden S3. Warum verwenden Sie nicht das offizielle Backend?<\/em><\/p>\n<p><\/p>\n<p>Offiziell?<\/p>\n<p><\/p>\n<p><em>Terraform Cloud.<\/em><\/p>\n<p><\/p>\n<p>Wann wurde es eingef\u00fchrt?<\/p>\n<p><\/p>\n<p><em>Vor etwa 4 Monaten.<\/em> <\/p>\n<p><\/p>\n<p>Wenn es vor 4 Jahren erschienen w\u00e4re, h\u00e4tte ich wahrscheinlich auf Ihre Frage geantwortet.<\/p>\n<p><\/p>\n<p><em>Es gibt bereits eine eingebaute Funktion sowie Locks, und man kann die State-Datei speichern. Probieren Sie es aus. Aber ich habe es auch nicht getestet.<\/em><\/p>\n<p><\/p>\n<p>Wir fahren mit einem gro\u00dfen Zug, der sich mit hoher Geschwindigkeit bewegt. Man kann nicht einfach ein paar Waggons rauswerfen. <\/p>\n<p><\/p>\n<p><em>Sie sprachen von den Schneeflocken, warum haben Sie nicht den Branch benutzt? Warum konnte es nicht so gemacht werden?<\/em><\/p>\n<p><\/p>\n<p>Wir haben den Ansatz, dass die gesamte Infrastruktur in einem Repository ist. Terraform, Puppet, alle Skripte, die irgendwie damit zu tun haben, sind alle in einem Repository. So k\u00f6nnen wir garantieren, dass inkrementelle \u00c4nderungen nacheinander getestet werden. Wenn es viele Branches g\u00e4be, w\u00e4re ein solches Projekt praktisch unm\u00f6glich zu warten. Ein halbes Jahr vergeht, und sie gehen so weit auseinander, dass es einfach wie eine Bestrafung erscheint. Das ist es, wovor ich bis zum Refactoring fliehen wollte. <\/p>\n<p><\/p>\n<p><em>Das hei\u00dft, es funktioniert nicht?<\/em><\/p>\n<p><\/p>\n<p>Das funktioniert \u00fcberhaupt nicht.<\/p>\n<p><\/p>\n<p>In dem Branch habe ich den Ordnerslide entfernt. Das hei\u00dft, wenn wir f\u00fcr jedes Test-Stack zum Beispiel ein Ordner f\u00fcr das Team A und einen f\u00fcr das Team B machen, funktioniert das auch nicht. Wir haben einen einheitlichen Code f\u00fcr die Testumgebung erstellt, der flexibel genug war, um allen gerecht zu werden. Das hei\u00dft, wir haben nur einen Code verwaltet. <\/p>\n<p><\/p>\n<p><em>Hallo! Ich bin Juri! Vielen Dank f\u00fcr die Pr\u00e4sentation! Ich habe eine Frage zu den Modulen. Sie sagen, dass Sie Module verwenden. Wie gehen Sie damit um, wenn in einem Modul \u00c4nderungen vorgenommen wurden, die mit den \u00c4nderungen eines anderen nicht kompatibel sind? Versionieren Sie die Module irgendwie oder versuchen Sie, eine Wunderwaffe zu erstellen, um beiden Anforderungen gerecht zu werden?<\/em><\/p>\n<p><\/p>\n<p>Das ist das Problem mit dem gro\u00dfen Schneeballsystem. Das ist es, worunter wir leiden, wenn eine scheinbar harmlose \u00c4nderung einen Teil der Infrastruktur kaputtmachen kann. Und das wird erst nach einer l\u00e4ngeren Zeit bemerkbar.<\/p>\n<p><\/p>\n<p><em>Das hei\u00dft, gibt es bisher keine L\u00f6sung?<\/em><\/p>\n<p><\/p>\n<p>Erstellen Sie universelle Module. Vermeiden Sie Schneeb\u00e4lle. Dann wird alles klappen. Der zweite Teil der Pr\u00e4sentation handelt davon, wie man das vermeiden kann.<\/p>\n<p><\/p>\n<p><em>Hallo! Danke f\u00fcr den Bericht! Ich m\u00f6chte etwas kl\u00e4ren. Hinter den Kulissen bleibt eine gro\u00dfe Menge \u00fcbrig, wegen der ich hier bin. Wie sind Puppet und die Rollenzuweisung integriert?<\/em><\/p>\n<p><\/p>\n<p>User-Daten.<\/p>\n<p><\/p>\n<p><em>Das hei\u00dft, Sie generieren einfach die Datei und f\u00fchren Sie dann irgendwie aus?<\/em><\/p>\n<p><\/p>\n<p>User-Daten sind eine Notiz, das hei\u00dft, wenn wir ein Image klonen, f\u00e4hrt Daemon hoch und versucht herauszufinden, wer er ist, und liest die Notiz, dass er ein Load Balancer ist.<\/p>\n<p><\/p>\n<p><em>Das hei\u00dft, das ist ein separater Prozess, der \u00fcbergeben wird?<\/em><\/p>\n<p><\/p>\n<p>Wir haben ihn nicht erfunden. Wir nutzen ihn. <\/p>\n<p><\/p>\n<p><em>Hallo! Ich habe eine Frage zu User-Daten. Sie haben gesagt, dass es Probleme gibt, dass jemand etwas falsch \u00fcbergeben k\u00f6nnte. Gibt es einen Weg, User-Daten im gleichen Git zu speichern, sodass immer klar ist, worauf sich die User-Daten beziehen?<\/em><\/p>\n<p><\/p>\n<p>Wir generieren die User-Daten aus der Vorlage. Das bedeutet, dass einige Variablen verwendet werden. Terraform erzeugt schlie\u00dflich das Endergebnis. Daher kann man nicht einfach einen Blick auf die Vorlage werfen und sagen, was dabei herauskommt, denn alle Probleme entstehen, weil der Entwickler denkt, dass er in dieser Variable einen String \u00fcbergibt, dabei kommt ein Array an. Und dann \u2013 zack \u2013 ist es jemand oder etwas anderes, die n\u00e4chste Zeile und alles ist kaputt. Wenn es sich um eine neue Ressource handelt und jemand sie hochf\u00e4hrt, sieht er, dass etwas nicht funktioniert, dann kann er das schnell beheben. Aber wenn diese Autoscale-Gruppe aktualisiert wurde, fangen irgendwann die Instanzen in der Autoscale-Gruppe an, sich auszutauschen. Und auf einmal funktioniert etwas nicht mehr. Das ist frustrierend.<\/p>\n<p><\/p>\n<p><em>Scheint, dass die einzige L\u00f6sung darin besteht, zu testen?<\/em><\/p>\n<p><\/p>\n<p>Ja, wenn Sie das Problem sehen, f\u00fcgen Sie Testschritte hinzu. Das hei\u00dft, auch mit dem Output kann man testen. Es ist vielleicht nicht so bequem, aber man kann auch irgendwelche Markierungen setzen \u2013 \u00fcberpr\u00fcfen Sie, dass die User-Daten hier festgeschraubt sind. <\/p>\n<p><\/p>\n<p><em>Ich hei\u00dfe Timur. Es ist gro\u00dfartig, dass es Vortr\u00e4ge dar\u00fcber gibt, wie man Terraform richtig organisiert.<\/em><\/p>\n<p><\/p>\n<p>Ich habe noch nicht einmal angefangen.<\/p>\n<p><\/p>\n<p><em>Ich frage mich, ob es bei der n\u00e4chsten Konferenz vielleicht eine Diskussion dar\u00fcber geben wird. Ich habe eine einfache Frage: Warum kodiert ihr Werte in einem separaten Modul fest, anstatt tfvars zu verwenden? Was macht ein Modul mit Werten besser als tfvars?<\/em><\/p>\n<p><\/p>\n<p>Das hei\u00dft, ich muss hier (Folie: Production\/environment\/settings.tf) schreiben: domain = Variable, domain vpcnetwork, Variable vpcnetwork und stvars \u2013 komme ich damit zum gleichen Ergebnis?<\/p>\n<p><\/p>\n<p><em>Genau so machen wir es. Wir verweisen auf das Setting-Modul, zum Beispiel.<\/em><\/p>\n<p><\/p>\n<p>Im Grunde ist das ein tfvars. Tfvars sind im Testumfeld sehr praktisch. Ich habe tfvars f\u00fcr gro\u00dfe Instanzen, f\u00fcr kleine. Und ich habe eine Datei in den Ordner gelegt und das bekommen, was ich wollte. Wenn wir die Infrastruktur aufbauen, m\u00f6chten wir, dass alles an einem Ort verst\u00e4ndlich ist. So muss man zuerst hierhin und dann zu den tfvars schauen.<\/p>\n<p><\/p>\n<p><em>L\u00e4uft es also darauf hinaus, alles an einem Ort zu haben?<\/em><\/p>\n<p><\/p>\n<p>Ja, tfvars sind n\u00fctzlich, wenn ihr einen Code habt, der an mehreren Orten mit unterschiedlichen Nuancen verwendet wird. Dann w\u00fcrde man tfvars verwenden und die jeweiligen Nuancen erhalten. Was wir haben, ist Infrastruktur als Code in Reinform. Man schaut einfach und versteht es sofort. <\/p>\n<p><\/p>\n<p><em>Hallo! Hatten Sie schon einmal die Situation, dass ein Cloud-Anbieter in das eingreift, was Sie mit Terraform gemacht haben? Angenommen, wir bearbeiten Metadaten. Dort sind SSH-Schl\u00fcssel. Und Google f\u00fcgt st\u00e4ndig seine Metadaten und Schl\u00fcssel hinzu. Und Terraform meldet immer, dass es \u00c4nderungen gibt. Nach jedem Lauf, selbst wenn sich nichts \u00e4ndert, sagt es immer, dass es dieses Feld jetzt aktualisieren wird.<\/em><\/p>\n<p><\/p>\n<p>Mit den Schl\u00fcsseln, aber \u2013 ja, ein Teil der Infrastruktur wird von so einer Sache betroffen, d. h. Terraform kann nichts \u00e4ndern. Wir k\u00f6nnen auch von Hand nichts \u00e4ndern. Momentan leben wir damit.<\/p>\n<p><\/p>\n<p><em>Das hei\u00dft, Sie haben damit zu tun gehabt, aber nichts erfunden, es macht einfach weiterhin selbst weiter?<\/em><\/p>\n<p><\/p>\n<p>Leider ja. <\/p>\n<p><\/p>\n<p><em>Hallo! Mein Name ist Stanislav Starkov. Mail.ru Group. Wie l\u00f6sen Sie das Problem mit der Generierung des Tags auf \u2026, wie \u00fcbermitteln Sie es intern? Ich verstehe, durch User-Data, um den Hostnamen anzugeben und Puppet zu verwenden? Und die zweite Frage. Wie gehen Sie mit diesem Problem in SG um, d. h. wenn Sie SG generieren, hunderte identische Instanzen, wie benennen Sie diese korrekt?<\/em><\/p>\n<p><\/p>\n<p>Die Instances, die uns sehr wichtig sind, benennen wir entsprechend. Die, die nicht ben\u00f6tigt werden, haben den Zusatz, dass es sich um eine Autoscale-Gruppe handelt. Idealerweise k\u00f6nnen wir diese entfernen und eine neue erhalten. <\/p>\n<p><\/p>\n<p>Bez\u00fcglich des Problems mit dem Tag gibt es kein Problem, sondern eine Aufgabe. Tags werden bei uns sehr intensiv genutzt, weil die Infrastruktur gro\u00df und teuer ist. Wir m\u00fcssen darauf achten, wo das Geld hingeht, und die Tags erm\u00f6glichen es, nachzuvollziehen, was und wohin ausgegeben wurde. Das erleichtert die Suche nach den Bereichen, in denen viel Geld flie\u00dft. <\/p>\n<p><\/p>\n<p>Wor\u00fcber war noch die Rede?<\/p>\n<p><\/p>\n<p><em>Wenn SG hundert Instances erstellt, m\u00fcssen sie dann unterscheidbar sein?<\/em><\/p>\n<p><\/p>\n<p>Nein, das ist nicht n\u00f6tig. Jeder Instance hat einen Agenten, der meldet, wenn ein Problem auftritt. Wenn der Agent eine Meldung abgibt, kennt dieser Agent bereits die IP-Adresse des betreffenden Instances. Damit k\u00f6nnen wir eingreifen. Au\u00dferdem verwenden wir Consul f\u00fcr das Discovery, dort, wo es kein Kubernetes gibt. Consul zeigt ebenfalls die IP-Adresse der Instance an.<\/p>\n<p><\/p>\n<p><em>Das hei\u00dft, Sie orientieren sich genau an der IP und nicht am Hostnamen?<\/em><\/p>\n<p><\/p>\n<p>Es ist nicht m\u00f6glich, sich am Hostnamen zu orientieren, da es zu viele gibt. Es gibt Identifikatoren f\u00fcr Instances \u2013 wie AE und so weiter. Diese kann man irgendwo finden oder in die Suche eingeben. <\/p>\n<p><\/p>\n<p><em>Hallo! Ich habe verstanden, dass Terraform ein n\u00fctzliches Tool f\u00fcr Cloud-L\u00f6sungen ist.<\/em> <\/p>\n<p><\/p>\n<p>Nicht nur das. <\/p>\n<p><\/p>\n<p><em>Genau diese Frage interessiert mich. Was passiert, wenn Sie beispielsweise massenhaft auf Bare Metal mit all Ihren Instanzen umziehen? Gibt es da keine Probleme? Oder m\u00fcssen Sie doch andere Produkte verwenden, wie zum Beispiel Ansible, das hier erw\u00e4hnt wurde?<\/em><\/p>\n<p><\/p>\n<p>Ansible ist ein wenig anders. Das hei\u00dft, Ansible wird aktiv, wenn die Instanz bereits gestartet ist. Terraform hingegen arbeitet bereits vor dem Start der Instanz. Ein Umzug auf Bare Metal \u2013 muss nicht sein. <\/p>\n<p><\/p>\n<p><em>Aktuell nicht, aber es k\u00f6nnte sein, dass das Gesch\u00e4ft kommt und sagt: 'Lass uns das machen.'<\/em><\/p>\n<p><\/p>\n<p>Ein Umzug zu einem anderen Cloud-Anbieter \u2013 ja, aber hier ist die Sache etwas anders. Man muss den Terraform-Code so schreiben, dass der Wechsel zu einer anderen Cloud mit m\u00f6glichst geringem Aufwand m\u00f6glich ist. <\/p>\n<p><\/p>\n<p>Anf\u00e4nglich war das Ziel, unsere gesamte Infrastruktur cloudunabh\u00e4ngig zu gestalten, das hei\u00dft, jede Cloud sollte funktionieren, aber irgendwann gab das Unternehmen auf und sagte: 'Okay, in den n\u00e4chsten N Jahren werden wir nicht umsteigen; wir k\u00f6nnen die Dienste von Amazon verwenden.'<\/p>\n<p><\/p>\n<p>Terraform erm\u00f6glicht es, Front-End-Tasks zu erstellen, PagerDuty zu konfigurieren, Daten-Dokumente usw. Er hat viele Funktionen. Er kann praktisch die ganze Welt steuern.<\/p>\n<p><\/p>\n<p><em>Danke f\u00fcr den Bericht! Ich arbeite auch seit 4 Jahren mit Terraform. W\u00e4hrend der schrittweisen Umstellung auf Terraform, an der Infrastruktur und der deklarativen Beschreibung, sind wir auf Situationen gesto\u00dfen, in denen jemand etwas manuell gemacht hat und du versuchst, einen Plan zu erstellen. Dabei erh\u00e4ltst du dann irgendwelche Fehler. Wie geht ihr mit solchen Problemen um? Wie findet ihr verlorene Ressourcen, die angegeben waren?<\/em><\/p>\n<p><\/p>\n<p>In der Regel manuell und durch Beobachtung. Wenn wir im Bericht etwas Merkw\u00fcrdiges sehen, analysieren wir, was vor sich geht, oder wir entfernen es einfach. Generell sind Pull Requests ganz normal. <\/p>\n<p><\/p>\n<p><em>Wenn ein Fehler auftritt, macht ihr dann ein Rollback? Habt ihr das schon mal versucht?<\/em><\/p>\n<p><\/p>\n<p>Nein, das ist eine Entscheidung des Menschen in dem Moment, in dem er das Problem sieht.<\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/524712\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Terraform \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0435 best practices \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 AWS-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043a\u043e\u043f\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435. \u0418 Terraform-\u043a\u043e\u0434 \u043d\u0443\u0436\u043d\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043d\u043e\u0432\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u0435\u0436\u0438\u043d\u043a\u0443. \u041c\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":98124,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-98123","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Terraform \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0435 best practices \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 AWS-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043a\u043e\u043f\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435. \u0418 Terraform-\u043a\u043e\u0434 \u043d\u0443\u0436\u043d\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043d\u043e\u0432\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u0435\u0436\u0438\u043d\u043a\u0443. \u041c\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441\" \/>\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\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\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\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 \u0445\u0430\u043e\u0441\u043e\u043c \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u0440\u0443\u0442\u0438\u043d\u043e\u0439. \u041c\u0430\u043a\u0441\u0438\u043c \u041a\u043e\u0441\u0442\u0440\u0438\u043a\u0438\u043d (Ixtens) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Terraform \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0435 best practices \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 AWS-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043a\u043e\u043f\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435. \u0418 Terraform-\u043a\u043e\u0434 \u043d\u0443\u0436\u043d\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043d\u043e\u0432\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u0435\u0436\u0438\u043d\u043a\u0443. \u041c\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens\" \/>\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=\"2020-10-24T12:42:52+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-11-17T22:58:49+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\udd47 Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens) | ProHoster","description":"Es scheint, dass die Entwickler von Terraform bereits einige n\u00fctzliche Best Practices f\u00fcr die Arbeit mit der AWS-Infrastruktur bereitstellen. Es gibt jedoch einen Haken. Im Laufe der Zeit nimmt die Anzahl der Umgebungen zu, und jede bringt ihre eigenen Besonderheiten mit sich. Fast eine Kopie des Anwendungsstacks entsteht in einer benachbarten Region. Und der Terraform-Code muss sorgf\u00e4ltig kopiert und gem\u00e4\u00df den neuen Anforderungen bearbeitet oder in eine Snowflake-Variante umgewandelt werden. Mein Vortrag behandelt Muster in Terraform, die helfen,","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","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\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 \u0445\u0430\u043e\u0441\u043e\u043c \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u0440\u0443\u0442\u0438\u043d\u043e\u0439. \u041c\u0430\u043a\u0441\u0438\u043c \u041a\u043e\u0441\u0442\u0440\u0438\u043a\u0438\u043d (Ixtens) | ProHoster","og:description":"\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Terraform \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0435 best practices \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 AWS-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043a\u043e\u043f\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435. \u0418 Terraform-\u043a\u043e\u0434 \u043d\u0443\u0436\u043d\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043d\u043e\u0432\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u0435\u0436\u0438\u043d\u043a\u0443. \u041c\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","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":"2020-10-24T12:42:52+00:00","article:modified_time":"2020-11-17T22:58:49+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"98123","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:04:35","updated":"2022-09-29 03:09:38"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/98123","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=98123"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/98123\/revisions"}],"predecessor-version":[{"id":164071,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/98123\/revisions\/164071"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/98124"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=98123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=98123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=98123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}