{"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\/da\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","title":{"rendered":"Skiftede fra Terraform til CloudFormation \u2014 og fortr\u00f8d","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>At pr\u00e6sentere infrastruktur som kode i et gentageligt tekstformat er en enkel bedste praksis for systemer, som ikke kr\u00e6ver besv\u00e6r. Denne praksis kaldes \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Infrastructure_as_code\">Infrastructure as Code<\/a><\/noindex>, og indtil nu er der to popul\u00e6re v\u00e6rkt\u00f8jer til at implementere det, is\u00e6r i AWS: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/\">Terraform<\/a><\/noindex> og <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/cloudformation\/\">CloudFormation<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Skiftede fra Terraform til CloudFormation \u2014 og fortr\u00f8d\" src=\"\/wp-content\/uploads\/2019\/11\/e33084fb81ca06107b341eef01e69adc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Jeg sammenligner erfaringen med Terraform og CloudFormation<\/em><\/p>\n<p><\/p>\n<p>F\u00f8r jeg kom til <noindex><a rel=\"nofollow\" href=\"https:\/\/www.twitch.tv\/\">Twitch<\/a><\/noindex> (ogs\u00e5 kendt som <noindex><a rel=\"nofollow\" href=\"https:\/\/www.businessinsider.com\/amazon-buys-twitch-2014-8\">Amazon Jr.<\/a><\/noindex>) arbejdede jeg <noindex><a rel=\"nofollow\" href=\"https:\/\/www.signalfx.com\/\">i en startup<\/a><\/noindex> , hvor jeg brugte Terraform i tre \u00e5r. P\u00e5 den nye arbejdsplads brugte jeg ogs\u00e5 meget Terraform, men s\u00e5 pressede virksomheden p\u00e5 for at overg\u00e5 til alt i stil med Amazon, inklusive CloudFormation. Jeg arbejdede h\u00e5rdt p\u00e5 at udvikle bedste praksis for begge v\u00e6rkt\u00f8jer, som blev anvendt i meget komplekse arbejdsgange i stor skala. Efter n\u00f8je at have overvejet konsekvenserne af overgangen fra Terraform til CloudFormation, er jeg overbevist om, at Terraform sandsynligvis er det bedste valg for organisationen.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"terraform-uzhasnyy\">Terraform er skr\u00e6mmende<\/h2>\n<p><\/p>\n<h3 id=\"beta-versiya-po\">Beta-versionen af softwaren<\/h3>\n<p><\/p>\n<p>Terraform har ikke engang haft version 1.0 endnu, og det er en gyldig grund til ikke at bruge det. Siden jeg f\u00f8rste gang pr\u00f8vede det, har det \u00e6ndret sig meget, men dengang <code>terraform apply<\/code> Det var ofte defekt efter et par opdateringer eller bare efter et par \u00e5rs brug. Jeg ville sige, at \"nu er alt anderledes\", men... s\u00e5dan siger alle, ikke? Der er \u00e6ndringer, der ikke er kompatible med tidligere versioner, selvom de er rimelige, og man f\u00e5r endda f\u00f8lelsen af, at syntaksen og abstraktionerne af ressourcelagre nu er, som de skal v\u00e6re. V\u00e6rkt\u00f8jet er som om, det virkelig er blevet bedre, men... :-0<\/p>\n<p><\/p>\n<p>P\u00e5 den anden side har AWS gjort et godt stykke arbejde med at opretholde kompatibilitet med tidligere versioner. Det er nok fordi, deres tjenester ofte er godt testet internt i organisationen, og de kun offentligt pr\u00e6senteres efter at v\u00e6re omd\u00f8bt. S\u00e5 det at \"have gjort et godt stykke arbejde\" er virkelig en underdrivelse. At opretholde kompatibilitet med tidligere API-versioner for et s\u00e5 varieret og komplekst system som AWS er utrolig sv\u00e6rt. Enhver, der har arbejdet med offentlige API'er, som er s\u00e5 udbredte, m\u00e5 forst\u00e5, hvor udfordrende det er at g\u00f8re dette i s\u00e5 mange \u00e5r. Og p\u00e5 min hukommelse har CloudFormation aldrig \u00e6ndret sig over tid.<\/p>\n<p><\/p>\n<h3 id=\"znakomsya-noga-eto-pulya\">M\u00f8d fod... det er en kugle<\/h3>\n<p><\/p>\n<p>S\u00e5 vidt jeg ved, kan man ikke slette ressourcen <strong>uden forst\u00e5ende<\/strong> Det er umuligt at importere en CloudFormation-stak fra sin egen CF-stak. Det er stort set det samme med Terraform. Det g\u00f8r det muligt at importere eksisterende ressourcer til sin stak. Funktionen er, kan man sige, fantastisk, men med stor magt f\u00f8lger ogs\u00e5 stort ansvar. S\u00e5 snart man tilf\u00f8jer en ressource til stakken, kan man ikke slette eller \u00e6ndre denne ressource, mens man arbejder med sin stak. En gang kom det tilbage for at hjems\u00f8ge mig. P\u00e5 Twitch-siden importerede nogen, uden at have onde hensigter, utilsigtet en andens AWS-sikkerhedsgruppe til sin egen Terraform-stak. De indtastede et par kommandoer og\u2026 sikkerhedsgruppen (sammen med indg\u00e5ende trafik) forsvandt.<\/p>\n<p><\/p>\n<h2 id=\"terraform-velikiy\">Terraform Den Store<\/h2>\n<p><\/p>\n<h3 id=\"vosstanovlenie-iz-nepolnyh-sostoyaniy\">Gendannelse fra ufuldst\u00e6ndige tilstande<\/h3>\n<p><\/p>\n<p>Nogle gange kan CloudFormation ikke fuldt ud overg\u00e5 fra \u00e9n tilstand til en anden. I s\u00e5 fald vil det fors\u00f8ge at vende tilbage til den tidligere tilstand. Desv\u00e6rre er det ikke altid muligt. Fejlfinding af det, der er opst\u00e5et, kan v\u00e6re ret skr\u00e6mmende \u2014 man ved aldrig, om CloudFormation bliver glad for at blive \u2018hacket\u2019 \u2014 selvom det er for at reparere. Om det overhovedet vil kunne vende tilbage til den tidligere tilstand, kan det ikke vurdere ordentligt, og som standard h\u00e6nger det i timevis i venten p\u00e5 et mirakel.<\/p>\n<p><\/p>\n<p>Terraform derimod er tilb\u00f8jelig til at komme sig efter mislykkede overgange p\u00e5 en mere elegant m\u00e5de og tilbyder v\u00e6rkt\u00f8jer til udvidet fejlfinding.<\/p>\n<p><\/p>\n<h3 id=\"bolee-yasnye-izmeneniya-v-sostoyaniya-dokumenta\">Klarere \u00e6ndringer i dokumentets tilstande<\/h3>\n<p><\/p>\n<blockquote><p>\"Okay, belastningsbalancerer, du \u00e6ndrer dig. Men hvordan?\"<\/p>\n<p>\u2014 en bekymret ingeni\u00f8r, klar til at trykke p\u00e5 \"accept\u00e9r\"-knappen.<\/p><\/blockquote>\n<p>Nogle gange skal jeg lave nogle justeringer p\u00e5 belastningsbalanceren i CloudFormation-stakken \u2014 for eksempel tilf\u00f8je portnummeret eller \u00e6ndre sikkerhedsgruppen. CloudFormation viser \u00e6ndringerne svagt. Jeg genkender mig selv som p\u00e5 n\u00e5le, hvor jeg tjekker yaml-filen ti gange for at v\u00e6re sikker p\u00e5, at jeg ikke har slettet noget vigtigt eller tilf\u00f8jet noget un\u00f8dvendigt.<\/p>\n<p><\/p>\n<p>Terraform er p\u00e5 dette omr\u00e5de meget mere gennemsigtig. Nogle gange er den endda for gennemsigtig (l\u00e6s: irriterende). Heldigvis har den seneste version inkluderet forbedret visning af \u00e6ndringer \u2014 nu kan man helt klart se, hvad der \u00e6ndres.<\/p>\n<p><\/p>\n<h3 id=\"gibkost\">Fleksibilitet<\/h3>\n<p><\/p>\n<blockquote><p>Skriv software fra slutningen.<\/p><\/blockquote>\n<p>At sige det ligeud, den vigtigste karakteristik ved langtidsholdbar software er evnen til at tilpasse sig \u00e6ndringer. Uanset hvilken software du skriver, skal det g\u00f8res bagl\u00e6ns. Jeg har ofte f\u00e5et problemer med, at jeg tog en \"simpel\" tjeneste og derefter fors\u00f8gte at presse alt ind i et enkelt CloudFormation- eller Terraform-stak. Og selvf\u00f8lgelig blev det afsl\u00f8ret efter m\u00e5neder, at jeg ikke havde forst\u00e5et det rigtigt, og at tjenesten slet ikke var simpel! S\u00e5 jeg skal p\u00e5 en eller anden m\u00e5de opdele det store stak i mindre komponenter. N\u00e5r man arbejder med CloudFormation, er det muligt at g\u00f8re dette, men kun ved f\u00f8rst at genskabe det eksisterende stak, hvilket jeg ikke g\u00f8r med mine databaser. Terraform tillod mig derimod at dissekere stakken og dele den op i mere forst\u00e5elige mindre dele.<\/p>\n<p><\/p>\n<h3 id=\"moduli-v-git\">Moduler i git<\/h3>\n<p><\/p>\n<p>Det er meget lettere at dele Terraform-kode mellem mange stacks end CloudFormation-kode. Med Terraform kan man placere koden i et Git-repositorium og tilg\u00e5 det ved at bruge semantisk versionskontrol. Enhver, der har adgang til dette repositorium, kan genbruge den f\u00e6lles kode. Den tilsvarende l\u00f8sning i CloudFormation er S3, men den har ikke de samme fordele, og der er ikke nogen grund til, at vi skulle opgive git til fordel for S3.<\/p>\n<p><\/p>\n<p>Organisationen voksede, og evnen til at dele f\u00e6lles stacks n\u00e5ede et kritisk niveau. Med Terraform er dette nemt og naturligt, mens CloudFormation vil f\u00e5 dig til at hoppe gennem ringe, f\u00f8r noget virker p\u00e5 samme m\u00e5de.<\/p>\n<p><\/p>\n<h3 id=\"operations-as-code\">Operations as code<\/h3>\n<p><\/p>\n<blockquote><p>\"Lad os skripte det, og s\u00e5 er det fint.\"<\/p>\n<p>- ingeni\u00f8ren tre \u00e5r f\u00f8r han opfandt Terraform-cyklen.<\/p><\/blockquote>\n<p>N\u00e5r vi taler om softwareudvikling, er Go eller et program p\u00e5 Java ikke bare kode.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Skiftede fra Terraform til CloudFormation \u2014 og fortr\u00f8d\" src=\"\/wp-content\/uploads\/2019\/11\/a5c61fd318b9b5aa62ebb69e38ca1b0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Code as Code<\/em><\/p>\n<p><\/p>\n<p>Der findes ogs\u00e5 infrastrukturen, som det k\u00f8rer p\u00e5.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Skiftede fra Terraform til CloudFormation \u2014 og fortr\u00f8d\" 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>Men hvor kommer den fra? Hvordan overv\u00e5ger man den? Hvor befinder din kode sig? Skal udviklerne have tilladelse til adgang?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Skiftede fra Terraform til CloudFormation \u2014 og fortr\u00f8d\" 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>At v\u00e6re softwareudvikler handler ikke bare om at skrive kode.<\/p><\/blockquote>\n<p>Ikke kun AWS: du bruger sandsynligvis tjenester fra andre udbydere. SignalFx, PagerDuty eller GitHub. M\u00e5ske har du en intern Jenkins-server til CI\/CD eller et internt Grafana-dashboard til overv\u00e5gning. Infra as Code v\u00e6lges af forskellige grunde, og hver eneste er lige s\u00e5 vigtig for alting relateret til software.<\/p>\n<p><\/p>\n<p>Da jeg arbejdede hos Twitch, accelererede vi tjenester inden for blandede indbyggede systemer og AWS-systemer. Vi producerede og vedligeholdt mange mikrotjenester, hvilket \u00f8gede driftsomkostningerne. Diskussionerne forl\u00f8b nogenlunde s\u00e5dan:<\/p>\n<p><\/p>\n<ul>\n<li><strong>Jeg<\/strong>: Damn, det kr\u00e6ver en del bev\u00e6gelser at starte en mikrotjeneste. Jeg kommer til at bruge det her for at oprette en AWS-konto (vi gik efter 2 konti p\u00e5 <strong>mikrotjeneste<\/strong>), s\u00e5 denne \u2014 til indstillingen af advarsler, denne \u2014 til kodeopbevaringen, og denne \u2014 til e-mail-liste, og s\u00e5 denne...<\/li>\n<li><strong>Lead<\/strong>: Lad os skripte det og s\u00e5 v\u00e6re f\u00e6rdige.<\/li>\n<li><strong>Jeg<\/strong>: OK, men selve scriptet vil \u00e6ndre sig. Der skal v\u00e6re en m\u00e5de at kontrollere, at alle disse indbyggede elementer fra Amazon har en aktuel tilstand.<\/li>\n<li><strong>Lead<\/strong>: Lyder godt. Og til det vil vi skrive et script.<\/li>\n<li><strong>Jeg<\/strong>: Fantastisk! Og scriptet skal helt sikkert have nogle parametre. Kan det tage dem?<\/li>\n<li><strong>Lead<\/strong>: Ja, det kan det! Det skal finde sin vej.<\/li>\n<li><strong>Jeg<\/strong>: Processen kan \u00e6ndre sig, og der kan g\u00e5 tab af bagudkompatibilitet. Vi f\u00e5r brug for en form for semantisk versionskontrol.<\/li>\n<li><strong>Lead<\/strong>: Fremragende id\u00e9!<\/li>\n<li><strong>Jeg<\/strong>: V\u00e6rkt\u00f8jerne kan \u00e6ndres manuelt i brugergr\u00e6nsefladen. Vi f\u00e5r brug for en m\u00e5de at kontrollere og rette dette.<\/li>\n<\/ul>\n<p><\/p>\n<p><em>...3 \u00e5r senere:<\/em><\/p>\n<p><\/p>\n<ul>\n<li><strong>Lead<\/strong>: Og vi endte med terraform.<\/li>\n<\/ul>\n<p><\/p>\n<p>Moralen i fabelen er: selvom du <strong>over halsen i alt, der har med Amazon at g\u00f8re<\/strong>, bruger du stadig noget, der ikke er fra AWS, og disse tjenester har en status, der benytter et sprog til konfiguration for at synkronisere denne status.<\/p>\n<p><\/p>\n<h3 id=\"cloudformation-lambda-vs-git-moduli-terraform\">CloudFormation lambda vs git-moduler terraform<\/h3>\n<p><\/p>\n<p>lambda er CloudFormation-l\u00f8sningen til sp\u00f8rgsm\u00e5let om brugerlogik. Med lambda kan du <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/macros-example.html\">oprette makroer<\/a><\/noindex> eller <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/walkthrough-custom-resources-lambda-lookup-amiids.html\">brugerressourcer<\/a><\/noindex>. Denne tilgang medf\u00f8rer yderligere udfordringer, som ikke findes i den semantiske versionskontrol af moduler i Git med Terraform. Den mest presserende udfordring for mig var h\u00e5ndtering af tilladelser for alle disse brugerdefinerede Lambda-funktioner (som er dusinvis af AWS-konti). Den n\u00e6stvigtigste udfordring var typen 'hvad kom f\u00f8rst - kyllingen eller \u00e6gget?': den var relateret til Lambda-koden. Denne funktion er b\u00e5de infrastruktur og kode, og den har brug for overv\u00e5gning og opdateringer. Den sidste nagle i kisten blev vanskeligheden med semantisk opdatering af \u00e6ndringer i Lambda-koden; det blev ogs\u00e5 n\u00f8dvendigt at sikre, at stackens handlinger ikke \u00e6ndrede sig mellem k\u00f8rsel uden en direkte kommando.<\/p>\n<p><\/p>\n<p>Jeg husker, at jeg engang fik lyst til at oprette en kanariefugl-distribution til et Elastic Beanstalk-milj\u00f8 med en klassisk belastningsbalancer. Det ville v\u00e6re nemmest at lave en anden distribution for EB ved siden af produktionsmilj\u00f8et ved at tage et ekstra skridt: at forbinde den autoskalerede kanariefugl-distribution med LB-distributionen i produktionsmilj\u00f8et. Og da Terraform bruger <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/providers\/aws\/r\/elastic_beanstalk_environment.html#autoscaling_groups\">ASG beantalk som output<\/a><\/noindex>, vil det kr\u00e6ve 4 ekstra linjer kode i Terraform. Da jeg spurgte, om der fandtes en tilsvarende l\u00f8sning i CloudFormation, blev jeg henvist til et helt repository p\u00e5 Git med en distributionspipeline og andet: alt dette var for noget, man kunne g\u00f8re med de stakkels 4 linjer Terraform-kode.<\/p>\n<p><\/p>\n<h3 id=\"on-luchshe-obnaruzhivaet-dreyf\">Det opdager bedre afvigelse<\/h3>\n<p><\/p>\n<blockquote><p>S\u00f8rg for, at virkeligheden stemmer overens med forventningerne.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/blogs\/aws\/new-cloudformation-drift-detection\/\">Afvigelsesdetektion<\/a><\/noindex> \u2014 en meget kraftfuld funktion ved drift som kode, fordi det hj\u00e6lper med at sikre, at virkeligheden svarer til forventningerne. Den er tilg\u00e6ngelig b\u00e5de i CloudFormation og Terraform. Men efterh\u00e5nden som stakken vokser, gav afvigelsesdetektion i CloudFormation flere og flere falske fund.<\/p>\n<p><\/p>\n<p>Med Terraform har du meget mere avancerede livscyklushooks til afvigelsesdetektion. For eksempel kan du indtaste kommandoen <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/configuration\/resources.html#ignore_changes\">ignore_changes<\/a><\/noindex> direkte i opgavebeskrivelsen for ECS, hvis du vil ignorere \u00e6ndringer i definitionen af en bestemt opgave uden at ignorere \u00e6ndringer i hele ECS-distributionen.<\/p>\n<p><\/p>\n<h2 id=\"cdk-i-buduschee-cloudformation\">CDK og fremtiden for CloudFormation<\/h2>\n<p><\/p>\n<p>CloudFormation er sv\u00e6rt at administrere i stor m\u00e5lestok p\u00e5 tv\u00e6rs af infrastrukturer. Mange af disse udfordringer er anerkendt, og v\u00e6rkt\u00f8jet har brug for noget som <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/en_pv\/cdk\/latest\/guide\/home.html\">aws-cdk<\/a><\/noindex>, en struktur til at definere cloudinfrastruktur i kode og implementere den gennem AWS CloudFormation. Det bliver interessant at se, hvad der venter aws-cdk i fremtiden, men det vil have sv\u00e6rt ved at konkurrere med andre fordele ved Terraform; der vil kr\u00e6ves globale \u00e6ndringer for at indhente CloudFormation.<\/p>\n<p><\/p>\n<h3 id=\"chtoby-terraform-ne-razocharoval\">For at Terraform ikke skuffer<\/h3>\n<p><\/p>\n<blockquote><p>Det er 'infrastruktur som KODE', ikke 'som tekst'.<\/p><\/blockquote>\n<p>Mit f\u00f8rste indtryk af Terraform var ret d\u00e5rligt. Jeg tror, jeg bare ikke forstod tilgangen. N\u00e6sten alle ingeni\u00f8rer opfatter det i starten utilsigtet som et tekstformat, der skal omdannes til det \u00f8nskede infrastruktur. DET SKAL IKKE G\u00d8RES.<\/p>\n<p><\/p>\n<h3 id=\"propisnye-istiny-horoshey-razrabotki-po-otnosyatsya-i-k-terraform\">Selvf\u00f8lgeligheder om god softwareudvikling g\u00e6lder ogs\u00e5 for Terraform.<\/h3>\n<p><\/p>\n<p>Jeg har set, hvordan mange praksisser, der er n\u00f8dvendige for at skabe god kode, ignoreres i Terraform. Du har i \u00e5revis l\u00e6rt for at blive en god programm\u00f8r. Giv ikke slip p\u00e5 den erfaring blot fordi du arbejder med Terraform. De grundl\u00e6ggende sandheder om god softwareudvikling g\u00e6lder ogs\u00e5 for Terraform.<\/p>\n<p><\/p>\n<h3 id=\"kak-uzh-kod-i-ne-zadokumentirovat\">Hvordan kan man skrive kode og ikke dokumentere det?<\/h3>\n<p><\/p>\n<p>Jeg er st\u00f8dt p\u00e5 enorme Terraform-stakke helt uden dokumentation. Hvordan kan man skrive kode over sider \u2014 helt uden dokumentation? Tilf\u00f8j dokumentation, der forklarer din <strong>koden<\/strong> Terraform (vigtigheden ligger her p\u00e5 ordet 'kode'), hvorfor dette afsnit er s\u00e5 vigtigt, og hvad du g\u00f8r.<\/p>\n<p><\/p>\n<h3 id=\"kak-mozhno-razvorachivat-servisy-kotorye-nekogda-byli-odnoy-bolshoy-funkciey-main\">Hvordan kan man implementere tjenester, der engang var en stor main()-funktion?<\/h3>\n<p><\/p>\n<p>Jeg har set meget komplekse Terraform-stakke pr\u00e6senteret som et enkelt modul. Hvorfor implementerer vi ikke software p\u00e5 den m\u00e5de? Hvorfor opdeler vi store funktioner i mindre? De samme svar g\u00e6lder for Terraform. Hvis dit modul er for stort \u2014 skal det opdeles i mindre moduler.<\/p>\n<p><\/p>\n<h3 id=\"razve-vasha-kompaniya-ne-polzuetsya-bibliotekami\">Bruger din virksomhed ikke biblioteker?<\/h3>\n<p><\/p>\n<p>Jeg har set ingeni\u00f8rer, der i forbindelse med et nyt projekt ved hj\u00e6lp af Terraform, simpelthen kopierede og indsatte store stykker fra andre projekter ind i deres egne og derefter pillede ved dem, indtil det begyndte at fungere. Ville I arbejde s\u00e5dan med 'produktionen' kode i jeres virksomhed? Vi bruger ikke bare biblioteker uden grund. Ja, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=PAAkCSZUG1c&amp;t=9m28s\">ikke alt skal v\u00e6re et bibliotek,<\/a><\/noindex> men hvor ville vi v\u00e6re uden f\u00e6lles biblioteker helt generelt?!<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-polzuetes-pep8-ili-gofmt\">Bruger du ikke PEP8 eller gofmt?<\/h3>\n<p><\/p>\n<p>I de fleste sprog findes der en standardiseret formatregel. I Python er det PEP8. I Go er det gofmt. Terraform har sin egen: <code>terraform fmt<\/code>. Brug det frit! <\/p>\n<p><\/p>\n<h3 id=\"vy-stanete-polzovatsya-react-ne-znaya-javascript\">Vil du bruge React uden at kende JavaScript?<\/h3>\n<p><\/p>\n<p>Terraform-moduler kan forenkle nogle dele af den komplekse infrastruktur, du skaber, men det betyder ikke, at du fuldst\u00e6ndig kan undg\u00e5 at forst\u00e5 den. Vil du bruge Terraform korrekt uden at forst\u00e5 ressourcerne? Du er d\u00f8mt: tiden vil g\u00e5, og du vil stadig ikke mestre Terraform.<\/p>\n<p><\/p>\n<h3 id=\"vy-kodite-singltonami-ili-vnedryaya-zavisimosti\">Koder du med singletons, eller injicerer du afh\u00e6ngigheder?<\/h3>\n<p><\/p>\n<p>Dependency injection er anerkendt som den bedste praksis for softwareudvikling, som foretr\u00e6kkes af singletoner. Hvordan kommer det til nytte i Terraform? Jeg har set Terraform-moduler, der afh\u00e6nger af en fjern tilstand. I stedet for at skrive moduler, der henter fra den fjern tilstand, skal du skrive et modul, der tager parametre. Og s\u00e5 kan du videregive disse parametre til modulet.<\/p>\n<p><\/p>\n<h3 id=\"vashi-biblioteki-delayut-desyat-veschey-horosho-ili-odnu---otlichno\">G\u00f8r dine biblioteker ti ting godt eller \u00e9n ting fremragende?<\/h3>\n<p><\/p>\n<p>Biblioteker fungerer bedst, n\u00e5r de fokuserer p\u00e5 \u00e9n opgave, som de udf\u00f8rer fremragende. I stedet for at skrive store Terraform-moduler, der pr\u00f8ver at g\u00f8re alt p\u00e5 \u00e9n gang, s\u00e5 bryd dem op i dele, der klarer en enkelt ting godt. S\u00e5 kan du kombinere dem, som det er n\u00f8dvendigt.<\/p>\n<p><\/p>\n<h3 id=\"kak-vy-proizvodite-izmeneniya-v-bibliotekah-bez-obratnoy-sovmestimosti\">Hvordan \u00e6ndrer du biblioteker uden bagudkompatibilitet?<\/h3>\n<p><\/p>\n<p>Et generelt Terraform-modul, ligesom et almindeligt bibliotek, skal p\u00e5 en eller anden m\u00e5de informere brugerne om \u00e6ndringer uden bagudkompatibilitet. N\u00e5r \u00e6ndringer sker i biblioteker, er det irriterende, og det samme g\u00e6lder, n\u00e5r der foretages \u00e6ndringer uden bagudkompatibilitet i Terraform-moduler. Det anbefales at anvende git-tags og semver, n\u00e5r du bruger Terraform-moduler.<\/p>\n<p><\/p>\n<h3 id=\"proizvodstvennyy-servis-zapuschen-u-vas-na-noutbuke-ili-v-datacentre\">K\u00f8rer din produktionsservice p\u00e5 din b\u00e6rbare computer eller i datacenteret?<\/h3>\n<p><\/p>\n<p>Hashicorp har v\u00e6rkt\u00f8jer som <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/cloud\/index.html\">terraform cloud<\/a><\/noindex> til at k\u00f8re dit terraform. Disse centraliserede tjenester g\u00f8r det lettere at administrere, auditerer og godkende \u00e6ndringer i terraform.<\/p>\n<p><\/p>\n<h3 id=\"razve-vy-ne-pishete-testy\">Skriver du ikke tests?<\/h3>\n<p><\/p>\n<p>Ingeni\u00f8rer anerkender, at kode skal testes, men glemmer ofte at foretage disse kontroller, n\u00e5r de arbejder med Terraform. For infrastrukturen kan det f\u00f8re til snedige problemer. Jeg anbefaler at 'teste' eller 'oprette eksempler' p\u00e5 stacks ved hj\u00e6lp af moduler, der korrekt kan implementeres til test under CI\/CD.<\/p>\n<p><\/p>\n<h3 id=\"terraform-i-mikroservisy\">Terraform og mikroservices<\/h3>\n<p><\/p>\n<blockquote><p>Livet og d\u00f8den for mikroservicefirmaer afh\u00e6nger af hastighed, opdatering og destruktion af nye mikroservice-arbejdsstakke.<\/p><\/blockquote>\n<p>Den mest udbredte negative faktor ved mikroservicearkitekturer, som man aldrig slipper for, handler om arbejdet og ikke koden. Hvis du ser Terraform kun som en m\u00e5de at automatisere den infrastrukturelle del af mikroservicearkitekturen p\u00e5, ber\u00f8ver du dig selv de sande fordele ved dette system. Det er nu allerede <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=HcmPi7-IVQo\">alt - som kode<\/a><\/noindex>.<\/p>\n<p>Kilde: <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\/da\/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=\"da_DK\" \/>\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\/da\/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\udd47Skiftede fra Terraform til CloudFormation \u2014 og fortr\u00f8d det | ProHoster","description":"At pr\u00e6sentere infrastruktur som kode i et gentageligt tekstformat er en enkel bedste praksis for systemer, man ikke skal b\u00f8vle med.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/pereshel-s-terraform-na-cloudformation-i-pozhalel","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/52367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=52367"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/52367\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=52367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=52367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=52367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}