{"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\/nl\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","title":{"rendered":"Ik ben van Terraform naar CloudFormation overgestapt \u2014 en het was een vergissing","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Infrastructuur presenteren als code in een herhaalbaar tekstformaat is een eenvoudig betere praktijk voor systemen waarmee je niet hoeft te rommelen. Deze praktijk staat bekend als \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Infrastructure_as_code\">Infrastructure as Code<\/a><\/noindex>, en totdat nu zijn er vooral twee populaire tools voor implementatie, vooral in AWS: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/\">Terraform<\/a><\/noindex> en <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/cloudformation\/\">CloudFormation<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ik ben van Terraform naar CloudFormation overgestapt \u2014 en het was een vergissing\" src=\"\/wp-content\/uploads\/2019\/11\/e33084fb81ca06107b341eef01e69adc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Ik vergelijk de ervaring met Terraform en CloudFormation<\/em><\/p>\n<p><\/p>\n<p>Voor ik bij <noindex><a rel=\"nofollow\" href=\"https:\/\/www.twitch.tv\/\">Twitch<\/a><\/noindex> (ook wel bekend als <noindex><a rel=\"nofollow\" href=\"https:\/\/www.businessinsider.com\/amazon-buys-twitch-2014-8\">Amazon Jr.<\/a><\/noindex>) werkte, heb ik <noindex><a rel=\"nofollow\" href=\"https:\/\/www.signalfx.com\/\">in een startup gewerkt<\/a><\/noindex> en heb drie jaar Terraform gebruikt. Bij mijn nieuwe werkgever heb ik ook volop Terraform gebruikt, maar daarna heeft het bedrijf de overstap naar alles dat lijkt op Amazon doorgedrukt, inclusief CloudFormation. Ik heb hard gewerkt aan de beste praktijken voor zowel het een als het ander, en beide tools gebruikt in zeer complexe workflows op organisatorische schaal. Later, na zorgvuldig de gevolgen van de overstap van Terraform naar CloudFormation af te wegen, realiseerde ik me dat Terraform waarschijnlijk de beste keuze voor de organisatie is.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"terraform-uzhasnyy\">Terraform is verschrikkelijk<\/h2>\n<p><\/p>\n<h3 id=\"beta-versiya-po\">Beta-versie van de software<\/h3>\n<p><\/p>\n<p>Terraform heeft zelfs nog geen versie 1.0 uitgebracht, en dat is een goede reden om het niet te gebruiken. Sinds ik het voor het eerst probeerde, is het aanzienlijk veranderd, maar destijds was het nog <code>terraform apply<\/code> Het viel vaak uit na een paar updates of gewoon na een paar jaar gebruik. Ik zou zeggen dat 'nu alles anders is', maar\u2026 dat zeggen toch eigenlijk allemaal, niet? Er zijn wijzigingen die niet compatibel zijn met eerdere versies, hoewel ze gerechtvaardigd zijn, en zelfs het gevoel dat de syntaxis en abstraheringen van hulpbronnen nu precies goed zijn. Het lijkt wel alsof het hulpmiddel echt beter is geworden, maar\u2026 :-0<\/p>\n<p><\/p>\n<p>Aan de andere kant heeft AWS goed zijn best gedaan om de compatibiliteit met eerdere versies te behouden. Waarschijnlijk omdat hun diensten vaak grondig intern worden getest en pas daarna, onder een andere naam, worden gepubliceerd. Dus 'goed gedaan' is nog zwak uitgedrukt. Compatibiliteit met eerdere versies van de API behouden voor zo'n veelzijdig en complex systeem als AWS is ongelooflijk moeilijk. Iedereen die ooit publieke API's heeft moeten onderhouden die zo breed worden gebruikt, moet begrijpen hoe moeilijk het is om dit jarenlang vol te houden. Het gedrag van CloudFormation is in mijn herinnering nooit veranderd door de jaren heen.<\/p>\n<p><\/p>\n<h3 id=\"znakomsya-noga-eto-pulya\">Maak kennis met je voet\u2026 dit is een kogel<\/h3>\n<p><\/p>\n<p>Voor zover ik weet, kun je een <strong>externe bron niet verwijderen.<\/strong> Het is niet mogelijk om een CloudFormation-stack vanuit je CF-stack te importeren. Hetzelfde geldt ongeveer voor Terraform. Dit stelt je in staat om bestaande resources in je stack te importeren. Het is een indrukwekkende functie, maar met grote kracht komt ook grote verantwoordelijkheid. Nadat je een resource in de stack hebt toegevoegd, kun je deze niet verwijderen of wijzigen terwijl je met je stack werkt. Eens leidde dit tot problemen. Iemand importeerde per ongeluk een beveiligingsgroep van AWS in zijn eigen Terraform-stack op de Twitch-website. Hij voerde een paar opdrachten in en... de beveiligingsgroep (samen met het inkomende verkeer) verdween.<\/p>\n<p><\/p>\n<h2 id=\"terraform-velikiy\">Terraform de Grote<\/h2>\n<p><\/p>\n<h3 id=\"vosstanovlenie-iz-nepolnyh-sostoyaniy\">Herstellen vanuit onvolledige toestanden<\/h3>\n<p><\/p>\n<p>Soms is CloudFormation niet in staat om volledig van de ene toestand naar de andere over te gaan. In dat geval probeert het terug te keren naar de vorige toestand. Helaas is dat niet altijd mogelijk. Het kan behoorlijk eng zijn om te debuggen wat het resultaat is \u2014 je weet nooit of CloudFormation blij is dat je het probeert te hakken \u2014 zelfs als het om te herstellen is. Of het lukt om naar de vorige toestand terug te keren, weet het niet echt en standaard hangt het urenlang te wachten op een wonder.<\/p>\n<p><\/p>\n<p>Terraform daarentegen is over het algemeen beter in het herstellen na mislukte overgangen en biedt een uitgebreid debugging-hulpmiddel.<\/p>\n<p><\/p>\n<h3 id=\"bolee-yasnye-izmeneniya-v-sostoyaniya-dokumenta\">Duidelijkere verandering in documenttoestanden<\/h3>\n<p><\/p>\n<blockquote><p>'Goed, load balancer, je verandert. Maar hoe?'<\/p>\n<p>- bezorgde ingenieur, klaar om op de knop 'accepteren' te drukken.<\/p><\/blockquote>\n<p>Soms moet ik een aantal handelingen uitvoeren met de load balancer in de CloudFormation-stack \u2014 bijvoorbeeld een poortnummer toevoegen of de beveiligingsgroep wijzigen. CloudFormation toont wijzigingen slecht weer. Ik controleer het yaml-bestand wel tien keer om er zeker van te zijn dat ik niets belangrijks heb verwijderd en niets overbodigs heb toegevoegd.<\/p>\n<p><\/p>\n<p>Terraform is hierin veel transparanter. Soms zelfs te transparant (lees: irritant). Gelukkig is in de laatste versie verbeterde weergave van wijzigingen toegevoegd \u2014 nu is het precies zichtbaar wat er verandert.<\/p>\n<p><\/p>\n<h3 id=\"gibkost\">Flexibiliteit<\/h3>\n<p><\/p>\n<blockquote><p>Schrijf software van achter naar voren.<\/p><\/blockquote>\n<p>Eerlijk gezegd is de belangrijkste onderscheidende eigenschap van langlevende software de mogelijkheid om zich aan veranderingen aan te passen. Schrijf elke software vanuit de achterkant. Ik stelde meestal teleurstellingen vast toen ik een 'eenvoudige' service nam en vervolgens alles in \u00e9\u00e9n CloudFormation- of Terraform-stack probeerde te proppen. En natuurlijk werd pas maanden later duidelijk dat ik het helemaal verkeerd begreep, en de service was in werkelijkheid helemaal niet zo eenvoudig! En nu moet ik op een of andere manier een grote stack opdelen in kleinere onderdelen. Wanneer je met CloudFormation werkt, is het mogelijk dit alleen te doen door de bestaande stack opnieuw op te bouwen, en dat doe ik niet met mijn databases. Terraform daarentegen stelde me in staat om de stack te dissecteren en op te splitsen in meer begrijpelijke kleinere delen.<\/p>\n<p><\/p>\n<h3 id=\"moduli-v-git\">Modules in git<\/h3>\n<p><\/p>\n<p>Het delen van Terraform-code tussen talloze stacks is veel eenvoudiger dan het delen van CloudFormation-code. Met Terraform kun je code in een git-repository plaatsen en deze aanspreken met semantische versiecontrole. Iedereen met toegang tot deze repository kan de gedeelde code opnieuw gebruiken. Het CloudFormation-equivalent is S3, maar dat heeft niet dezelfde voordelen, en er is geen enkele reden waarom we \u00fcberhaupt S3 ten koste van git zouden moeten gebruiken.<\/p>\n<p><\/p>\n<p>De organisatie groeide en de mogelijkheid om gedeelde stacks te delen bereikte een kritiek niveau. Met Terraform gaat dit allemaal gemakkelijk en natuurlijk, terwijl CloudFormation je door hoepels laat springen voordat je iets dergelijks aan de praat krijgt.<\/p>\n<p><\/p>\n<h3 id=\"operations-as-code\">Operations as code<\/h3>\n<p><\/p>\n<blockquote><p>'Laten we maar gaan script-igen.'<\/p>\n<p>- een ingenieur drie jaar voordat hij de fiets Terraform uitvond.<\/p><\/blockquote>\n<p>Als het om softwareontwikkeling gaat, is Go of een programma in Java niet zomaar code.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ik ben van Terraform naar CloudFormation overgestapt \u2014 en het was een vergissing\" 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>Er is ook de infrastructuur waarop het draait.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ik ben van Terraform naar CloudFormation overgestapt \u2014 en het was een vergissing\" 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>Maar waar komt het vandaan? Hoe monitor je het? Waar woont jouw code? Hebben ontwikkelaars toestemming voor toegang nodig?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ik ben van Terraform naar CloudFormation overgestapt \u2014 en het was een vergissing\" src=\"\/wp-content\/uploads\/2019\/11\/5cb0b6f720682b7bb6d5f485287b618b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Operations as Code<\/em><\/p>\n<p><\/p>\n<blockquote><p>Software-ontwikkeling is niet alleen code schrijven.<\/p><\/blockquote>\n<p>Niet alleen AWS: je gebruikt ongetwijfeld de diensten van andere leveranciers. SignalFx, PagerDuty of Github. Misschien heb je een interne Jenkins-server voor CI\/CD of een intern Grafana-dashboard voor monitoring. Infra as Code wordt om verschillende redenen gekozen, en elke reden is even belangrijk voor alles wat met software te maken heeft.<\/p>\n<p><\/p>\n<p>Toen ik bij Twitch werkte, versnelden we diensten binnen gemengde ingebouwde systemen en systemen van AWS Amazon. We produceerden en ondersteunden talloze microservices, wat de operationele kosten verhoogde. De discussies verliepen ongeveer als volgt:<\/p>\n<p><\/p>\n<ul>\n<li><strong>Ik<\/strong>: Tja, dat is wel veel gedoe om \u00e9\u00e9n microservice op te starten. Ik moet dit spul gebruiken om een AWS-account aan te maken (we gingen naar 2 accounts op <strong>microservice<\/strong>), daarna deze \u2014 voor het instellen van meldingen, nog deze \u2014 voor de code repository, en deze \u2014 voor de lijst met e-mailadressen, en deze\u2026<\/li>\n<li><strong>Lead<\/strong>: Laten we het automatiseren, dat is prima.<\/li>\n<li><strong>Ik<\/strong>: Ok\u00e9, maar het script zal veranderen. We hebben een manier nodig om te controleren of al deze ingebouwde functies van Amazon een actuele status hebben.<\/li>\n<li><strong>Lead<\/strong>: Klinkt goed. En daarvoor schrijven we een script.<\/li>\n<li><strong>Ik<\/strong>: Geweldig! En het script moet zeker ook parameters hebben. Neemt hij die aan?<\/li>\n<li><strong>Lead<\/strong>: Ja, dat doet hij, dat kan niet anders!<\/li>\n<li><strong>Ik<\/strong>: Het proces kan veranderen, er kan verlies van achterwaartse compatibiliteit zijn. We hebben een of andere semantische versiecontrole nodig.<\/li>\n<li><strong>Lead<\/strong>: Geweldige idee!<\/li>\n<li><strong>Ik<\/strong>: Hulpmiddelen kunnen handmatig worden gewijzigd, binnen de gebruikersinterface. We hebben een manier nodig om dit te controleren en te corrigeren.<\/li>\n<\/ul>\n<p><\/p>\n<p><em>\u20263 jaar later:<\/em><\/p>\n<p><\/p>\n<ul>\n<li><strong>Lead<\/strong>: En zo kregen we Terraform.<\/li>\n<\/ul>\n<p><\/p>\n<p>De moraal van het verhaal is: zelfs als je <strong>tot over mijn oren in alles van Amazon<\/strong>, gebruik je nog steeds iets dat niet van AWS is, en die services hebben een status die een taal gebruikt voor configuratie om deze status te synchroniseren.<\/p>\n<p><\/p>\n<h3 id=\"cloudformation-lambda-vs-git-moduli-terraform\">CloudFormation lambda vs git-modules terraform<\/h3>\n<p><\/p>\n<p>lambda is de CloudFormation-oplossing voor het probleem van gebruikerslogica. Met lambda kun je <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/macros-example.html\">macro's<\/a><\/noindex> of <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/walkthrough-custom-resources-lambda-lookup-amiids.html\">gebruikersresource<\/a><\/noindex>. Deze aanpak brengt extra complicaties met zich mee die er bij semantische versiecontrole van git-modules in Terraform niet zijn. Voor mij persoonlijk was de meest urgente uitdaging het beheren van machtigingen voor al deze gebruikerslambda's (en dat zijn tientallen AWS-accounts). Een andere belangrijke uitdaging was het 'wat was er eerst - de kip of het ei?': dit had te maken met de code van de lambda. Deze functie zelf is infrastructuur en code, en heeft zelf monitoring en updates nodig. De laatste spijker in de doodskist was de moeilijkheid bij semantische updates van de wijzigingen in de lambda-code; het moest ook zo worden gedaan dat de acties van de stack zonder directe opdracht niet veranderden tussen runs.<\/p>\n<p><\/p>\n<p>Ik herinner me dat ik op een gegeven moment een canary deployment voor de Elastic Beanstalk-omgeving wilde maken met een klassieke load balancer. Het zou het eenvoudigste zijn om een tweede deployment voor EB naast de productie-omgeving te maken, en een extra stap te zetten: de automatisch schaalbare groep van de canary deployment combineren met de LB van de productie-omgeving. Aangezien Terraform gebruikt maakt van <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/providers\/aws\/r\/elastic_beanstalk_environment.html#autoscaling_groups\">ASG beantalk als output<\/a><\/noindex>, dit vereist 4 extra regels code in Terraform. Toen ik vroeg of er een vergelijkbare oplossing in CloudFormation was, werd ik doorverwezen naar een hele repository in git met een deployment pipeline en meer: en dit alles voor wat we met slechts 4 ongelukkige regels Terraform-code zouden kunnen doen.<\/p>\n<p><\/p>\n<h3 id=\"on-luchshe-obnaruzhivaet-dreyf\">Het detecteert drift beter<\/h3>\n<p><\/p>\n<blockquote><p>Zorg ervoor dat de werkelijkheid overeenkomt met de verwachtingen.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/blogs\/aws\/new-cloudformation-drift-detection\/\">Diften van drift<\/a><\/noindex> \u2014 is een zeer krachtige functie van operations as code, omdat het helpt ervoor te zorgen dat de werkelijkheid overeenkomt met de verwachtingen. Het is beschikbaar in zowel CloudFormation als Terraform. Maar naarmate de stack groeit, gaf het zoeken naar drift in CloudFormation steeds meer valse ontdekkingen.<\/p>\n<p><\/p>\n<p>Met Terraform heb je veel meer geavanceerde lifecycle hooks voor drift detectie. Bijvoorbeeld, je typt het commando <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/configuration\/resources.html#ignore_changes\">ignore_changes<\/a><\/noindex> rechtstreeks in de taakdefinitie van ECS als je wijzigingen in de definitie van een specifieke taak wilt negeren, zonder wijzigingen in de hele ECS deployment te negeren.<\/p>\n<p><\/p>\n<h2 id=\"cdk-i-buduschee-cloudformation\">CDK en de toekomst van CloudFormation<\/h2>\n<p><\/p>\n<p>CloudFormation is moeilijk te beheren op grote, inter-infrastructurele schalen. Veel van deze moeilijkheden zijn erkend en het hulpmiddel heeft dingen nodig zoals <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/en_pv\/cdk\/latest\/guide\/home.html\">aws-cdk<\/a><\/noindex>, een structuur voor het defini\u00ebren van cloud infrastructuur in code en het doorgeven ervan aan AWS CloudFormation. Het zal interessant zijn om te zien wat de toekomst brengt voor aws-cdk, maar het zal moeilijk zijn om te concurreren met de andere voordelen van Terraform; om CloudFormation bij te trekken, zijn wereldwijde veranderingen nodig.<\/p>\n<p><\/p>\n<h3 id=\"chtoby-terraform-ne-razocharoval\">Om teleurstellingen met Terraform te voorkomen<\/h3>\n<p><\/p>\n<blockquote><p>Dit is infrastructuur als CODE, niet als tekst.<\/p><\/blockquote>\n<p>Mijn eerste indruk van Terraform was vrij negatief. Ik denk dat ik de aanpak gewoon niet begreep. Bijna alle ingenieurs beschouwen het in het begin onbewust als een tekstformaat dat moet worden omgezet in de gewenste infrastructuur. DAT MOET NIET.<\/p>\n<p><\/p>\n<h3 id=\"propisnye-istiny-horoshey-razrabotki-po-otnosyatsya-i-k-terraform\">De basisprincipes van goede softwareontwikkeling zijn ook van toepassing op Terraform<\/h3>\n<p><\/p>\n<p>Ik heb gezien dat veel praktijken die nodig zijn voor het schrijven van goede code, worden genegeerd in Terraform. Je hebt jaren geleerd om een goede programmeur te worden. Geef die ervaring niet op alleen omdat je met Terraform werkt. De basisprincipes van goede softwareontwikkeling zijn ook van toepassing op Terraform.<\/p>\n<p><\/p>\n<h3 id=\"kak-uzh-kod-i-ne-zadokumentirovat\">Hoe kun je code niet documenteren?<\/h3>\n<p><\/p>\n<p>Ik ben enorme Terraform-stacks tegengekomen zonder enige documentatie. Hoe kun je pagina's vol code schrijven \u2014 zonder enige documentatie? Voeg documentatie toe die jouw <strong>code<\/strong> Terraform (de klemtoon ligt hier op het woord code), waarom dit gedeelte zo belangrijk is, en wat je doet.<\/p>\n<p><\/p>\n<h3 id=\"kak-mozhno-razvorachivat-servisy-kotorye-nekogda-byli-odnoy-bolshoy-funkciey-main\">Hoe kun je services implementeren die ooit \u00e9\u00e9n grote functie main() waren?<\/h3>\n<p><\/p>\n<p>Ik ben zeer complexe Terraform-stacks tegengekomen die als \u00e9\u00e9n enkele module werden gepresenteerd. Waarom implementeren we software op deze manier niet? Waarom splitsen we grote functies op in kleinere? Dezelfde antwoorden gelden ook voor Terraform. Als je module te groot is, moet je deze opsplitsen in kleinere modules.<\/p>\n<p><\/p>\n<h3 id=\"razve-vasha-kompaniya-ne-polzuetsya-bibliotekami\">Gebruikt jouw bedrijf geen bibliotheken?<\/h3>\n<p><\/p>\n<p>Ik heb gezien hoe ingenieurs, terwijl ze een nieuw project opzetten met Terraform, simpelweg enorme stukken uit andere projecten kopieerden en plakte in hun eigen, en vervolgens gingen prutsen totdat het begon te werken. Zou jij in jouw bedrijf zo met 'productie' code werken? We gebruiken bibliotheken niet zomaar. Ja, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=PAAkCSZUG1c&amp;t=9m28s\">niet alles moet een bibliotheek zijn,<\/a><\/noindex> maar waar zouden we zonder gemeenschappelijke bibliotheken in het algemeen zijn?!<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-polzuetes-pep8-ili-gofmt\">Gebruik je geen PEP8 of gofmt?<\/h3>\n<p><\/p>\n<p>De meeste programmeertalen hebben een standaard opmaak. In Python is dit PEP8. In Go is het gofmt. Terraform heeft de zijn: <code>terraform fmt<\/code>. Maak er gebruik van! <\/p>\n<p><\/p>\n<h3 id=\"vy-stanete-polzovatsya-react-ne-znaya-javascript\">Zou je React gebruiken zonder JavaScript te kennen?<\/h3>\n<p><\/p>\n<p>Terraform-modules kunnen een deel van de complexe infrastructuur die je opbouwt vereenvoudigen, maar dat betekent nog niet dat je er helemaal geen kennis van moet hebben. Wil je Terraform correct gebruiken zonder begrip van de middelen? Je bent gedoemd: de tijd zal verstrijken en je zult Terraform niet onder de knie krijgen.<\/p>\n<p><\/p>\n<h3 id=\"vy-kodite-singltonami-ili-vnedryaya-zavisimosti\">Programmeert je met singletons, of duik je in afhankelijkheden?<\/h3>\n<p><\/p>\n<p>Dependency injection is considered the best practice for software development, particularly favored by singletons. How does this apply to Terraform? I've encountered Terraform modules that depend on remote state. Instead of writing modules that extract from remote state, write a module that accepts parameters. Then pass these parameters to the module.<\/p>\n<p><\/p>\n<h3 id=\"vashi-biblioteki-delayut-desyat-veschey-horosho-ili-odnu---otlichno\">Do your libraries do ten things well or one thing excellently?<\/h3>\n<p><\/p>\n<p>Libraries that focus on a single task and execute it exceptionally well perform best. Instead of writing large Terraform modules that try to do everything at once, break them down into pieces that do one thing well. Then combine them as needed.<\/p>\n<p><\/p>\n<h3 id=\"kak-vy-proizvodite-izmeneniya-v-bibliotekah-bez-obratnoy-sovmestimosti\">How do you make changes to libraries without breaking backward compatibility?<\/h3>\n<p><\/p>\n<p>A general Terraform module, like any regular library, needs a way to inform users about breaking changes. Such changes in libraries are frustrating, and the same goes for breaking changes in Terraform modules. It is advisable to apply git tags and semver when using Terraform modules.<\/p>\n<p><\/p>\n<h3 id=\"proizvodstvennyy-servis-zapuschen-u-vas-na-noutbuke-ili-v-datacentre\">Is your production service running on your laptop or in a data center?<\/h3>\n<p><\/p>\n<p>Hashicorp has tools like <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/cloud\/index.html\">terraform cloud<\/a><\/noindex> to run your Terraform. These centralized services make it easier to manage, audit, and approve Terraform changes.<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-pishete-testy\">Aren't you writing tests?<\/h3>\n<p><\/p>\n<p>Ingenieurs erkennen dat de code getest moet worden, maar vaak negeren ze de controles tijdens het werken met Terraform. Voor infrastructuur kan dat problematische momenten met zich meebrengen. Ik adviseer om 'te testen' of 'voorbeelden te maken' van stacks met modules die correct kunnen worden gedeployd ter controle tijdens CI\/CD.<\/p>\n<p><\/p>\n<h3 id=\"terraform-i-mikroservisy\">Terraform and microservices<\/h3>\n<p><\/p>\n<blockquote><p>The life and death of microservice companies depend on the speed, updating, and dismantling of new microservice working stacks.<\/p><\/blockquote>\n<p>The most common downside associated with microservice architectures that cannot be avoided is related to operations, not code. If you view Terraform merely as a way to automate the infrastructural side of microservice architecture, you are missing out on the true benefits of this system. Currently, already <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=HcmPi7-IVQo\">everything is code<\/a><\/noindex>.<\/p>\n<p>Bron: <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.3 - 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\/nl\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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\/nl\/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\udd47Overgestapt van Terraform naar CloudFormation \u2014 en er spijt van gekregen | ProHoster","description":"De infrastructuur in de vorm van code in een repeatable tekstformaat voorstellen is een eenvoudige best practice voor systemen, zonder dat je hoeft te rommelen.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/52367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=52367"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/52367\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=52367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=52367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=52367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}