{"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\/sv\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","title":{"rendered":"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/ec13125c702f42863bbe774cd805442b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det verkar som att Terraform-utvecklare erbjuder ganska anv\u00e4ndbara b\u00e4sta metoder f\u00f6r att arbeta med AWS-infrastruktur. Men det finns en liten detalj. Med tiden \u00f6kar antalet milj\u00f6er och varje har sina egna s\u00e4rdrag. En n\u00e4stan exakt kopia av applikationsstegen dyker upp i grannregionen. Terraform-koden m\u00e5ste kopieras och redigeras noggrant enligt de nya kraven eller s\u00e5 m\u00e5ste man skapa en sn\u00f6flinga.<\/p>\n<p><\/p>\n<p>Min presentation handlar om m\u00f6nster i Terraform f\u00f6r att motverka kaos och manuella rutiner i stora och l\u00e5ngvariga projekt.<\/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=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8c67c45e486d6c03793dd08c33a16313.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jag \u00e4r 40 \u00e5r och har arbetat inom IT i 20 \u00e5r. Jag har jobbat p\u00e5 Ixtens i 12 \u00e5r. Vi sysslar med e-commerce-driven development. Och de senaste 5 \u00e5ren har jag till\u00e4mpat DevOps-praktiker.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8b14b3adaa45d69278d76580baa99042.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mitt ber\u00e4ttande kommer att handla om erfarenheter fr\u00e5n ett projekt p\u00e5 ett f\u00f6retag vars namn jag inte kommer att avsl\u00f6ja p\u00e5 grund av ett sekretessavtal. <\/p>\n<p><\/p>\n<p>Siffrorna p\u00e5 bilden \u00e4r angivna f\u00f6r att f\u00f6rst\u00e5 projektets omfattning. Och allt jag kommer att s\u00e4ga h\u00e4rn\u00e4st \u00e4r relaterat till Amazon.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/3742217a2abaf1fcf2163979d82eac14.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jag gick med i det h\u00e4r projektet f\u00f6r 4 \u00e5r sedan. Och mitt under den p\u00e5g\u00e5ende omstruktureringen av infrastrukturen, eftersom projektet hade vuxit. De m\u00f6nster som anv\u00e4ndes passade inte l\u00e4ngre. Med tanke p\u00e5 den planerade tillv\u00e4xten av projektet beh\u00f6vde vi t\u00e4nka p\u00e5 n\u00e5got nytt. <\/p>\n<p><\/p>\n<p>Tack till Matvej som ig\u00e5r ber\u00e4ttade om vad som h\u00e4nde p\u00e5 Dodo Pizza. Det \u00e4r det som h\u00e4nde hos oss f\u00f6r 4 \u00e5r sedan. <\/p>\n<p><\/p>\n<p>Utvecklarna kom in och b\u00f6rjade skapa infrastrukturen koden. <\/p>\n<p><\/p>\n<p>De mest uppenbara anledningarna till varf\u00f6r detta kr\u00e4vdes var behovet av snabbare time to market. Det var viktigt att DevOps-teamet inte skulle vara flaskhalsen vid lanseringen. F\u00f6r \u00f6vrigt anv\u00e4ndes Terraform och Puppet redan p\u00e5 den allra f\u00f6rsta niv\u00e5n.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/13d6df6a324d2e1162acef77ca2ad0dc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terraform \u00e4r ett open source-projekt fr\u00e5n HashiCorp. F\u00f6r dem som inte har n\u00e5gon aning om vad detta \u00e4r, f\u00f6ljer de kommande bilderna. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/61726d4205d1f4f8e449fe9d71507508.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Infrastruktur som kod betyder att vi kan beskriva v\u00e5r infrastruktur och be n\u00e5gra robotar att skapa de resurser som vi har beskrivit.<\/p>\n<p><\/p>\n<p>Till exempel, vi beh\u00f6ver <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/sv\/vps\/abuzoustojchivye-vps\/\"   title=\"virtuell maskin\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"4196\">virtuell maskin<\/a>. Vi kommer att beskriva det, l\u00e4gga till ett par obligatoriska parametrar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/eb52c1e458fa092bba8577fffceb864c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>D\u00e4refter st\u00e4ller vi in \u00e5tkomst till Amazon i konsolen. Och vi ber Terraform g\u00f6ra en plan. Terraform-planen kommer att s\u00e4ga: \"Okej, f\u00f6r din resurs kan vi g\u00f6ra f\u00f6ljande.\" Och minst en resurs kommer att l\u00e4ggas till. Och inga f\u00f6r\u00e4ndringar f\u00f6rv\u00e4ntas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/879e645596121ee5d05ac247b4be19ee.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e4r du \u00e4r n\u00f6jd kan du be Terraform att till\u00e4mpa och Terraform kommer att skapa en instans \u00e5t dig, och du f\u00e5r en virtuell maskin i din moln.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/77b7fe4d6abcc9116233f48caa887465.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vidare utvecklas v\u00e5rt projekt. Vi l\u00e4gger till vissa f\u00f6r\u00e4ndringar. Vi ber om fler instanser, vi l\u00e4gger till 53 poster.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/98ce7e1f9d1f85aa5e78c269a0708ac1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och vi upprepar. Vi ber om en plan. Vi ser vilka f\u00f6r\u00e4ndringar som planeras. Vi till\u00e4mpar. P\u00e5 s\u00e5 s\u00e4tt v\u00e4xer v\u00e5r infrastruktur. <\/p>\n<p><\/p>\n<p>Terraform anv\u00e4nder n\u00e5got som kallas state-filer. Det vill s\u00e4ga, alla f\u00f6r\u00e4ndringar som skickas till Amazon sparas i en fil d\u00e4r varje resurs du har beskrev har motsvarande resurser som skapats i Amazon. P\u00e5 s\u00e5 s\u00e4tt vet Terraform exakt vad som beh\u00f6ver \u00e4ndras i Amazon n\u00e4r en beskrivning av en resurs \u00e4ndras.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6e83efffb7af6ab967b4716be170b47b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dessa state-filer var ursprungligen bara filer. Och vi lagrade dem i Git, vilket var extremt besv\u00e4rligt. N\u00e5gon gl\u00f6mde alltid att g\u00f6ra en commit av f\u00f6r\u00e4ndringar, vilket ledde till m\u00e5nga konflikter. <\/p>\n<p><\/p>\n<p>Nu finns det en m\u00f6jlighet att anv\u00e4nda en backend, det vill s\u00e4ga Terraform anger i vilken bucket och med vilken nyckel state-filen ska sparas. Och Terraform tar hand om att h\u00e4mta denna state-fil, g\u00f6ra all magi och l\u00e4gga tillbaka det slutgiltiga resultatet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/e6687463a9fe3cff979f44ac7778b4e8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V\u00e5r infrastruktur v\u00e4xer. H\u00e4r \u00e4r v\u00e5r kod. Och nu vill vi inte bara skapa en virtuell maskin, vi vill ha en testmilj\u00f6.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/0effb09fa04d3d520c1cdbb34ce97810.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terraform g\u00f6r det m\u00f6jligt att skapa n\u00e5got som kallas en modul, det vill s\u00e4ga beskriva samma sak i en specifik mapp.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/95c8395b10142fe550b0719161211f15.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och till exempel i testningen kalla p\u00e5 denna modul och f\u00e5 samma resultat som om vi hade utf\u00f6rt Terraform apply i sj\u00e4lva modulen. F\u00f6r testningen kommer koden att se ut s\u00e5 h\u00e4r.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/fa4c16e3835a4507a858d2ddb767daf3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>F\u00f6r produktion kan vi skicka vissa f\u00f6r\u00e4ndringar dit, eftersom vi inte beh\u00f6ver stora instanser i testningen, medan stora instanser i produktion \u00e4r precis vad som beh\u00f6vs.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/19478de23da2278567e66bacef78a0a9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och fram\u00f6ver kommer jag att \u00e5terv\u00e4nda till projektet. Det var en komplex uppgift, infrastrukturen planerades att vara mycket stor. Det var n\u00f6dv\u00e4ndigt att organisera all kod s\u00e5 att den var bekv\u00e4m f\u00f6r alla: b\u00e5de f\u00f6r dem som utf\u00f6r underh\u00e5ll av denna kod och f\u00f6r dem som g\u00f6r f\u00f6r\u00e4ndringar. Det var planerat att varje utvecklare skulle kunna g\u00e5 in och justera infrastrukturen efter behov f\u00f6r sin del av plattformen. <\/p>\n<p><\/p>\n<p>Detta \u00e4r katalogtr\u00e4det som rekommenderas av HashiCorp sj\u00e4lvt, om du har ett stort projekt och det \u00e4r meningsfullt att dela upp hela infrastrukturen i mindre delar, och beskriva varje del i en separat mapp. <\/p>\n<p><\/p>\n<p>Med ett omfattande bibliotek av resurser kan man i testningen och produktionen kalla p\u00e5 ungef\u00e4r samma. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/c30cdc3d3ce5441bc0ae4a485069dacc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I v\u00e5rt fall passade det inte riktigt, eftersom teststacken f\u00f6r utvecklare eller f\u00f6r testning beh\u00f6vde f\u00e5s p\u00e5 ett enklare s\u00e4tt. Att g\u00e5 igenom mappar och anv\u00e4nda dem i r\u00e4tt ordning, samt oroa sig f\u00f6r att databasen skulle starta, f\u00f6r att sedan starta instansen som anv\u00e4nder denna databas, ville vi inte. D\u00e4rf\u00f6r k\u00f6rdes all testning fr\u00e5n en och samma mapp. D\u00e4r anropades samma moduler, men allt genomf\u00f6rdes p\u00e5 en g\u00e5ng.<\/p>\n<p><\/p>\n<p>Terraform tar hand om alla beroenden. Och skapar alltid resurser i den ordning som g\u00f6r att man kan f\u00e5 IP-adressen, till exempel, fr\u00e5n den nyskapade instansen, och f\u00e5 den IP-adressen i en route53-post. <\/p>\n<p><\/p>\n<p>Dessutom \u00e4r plattformen v\u00e4ldigt stor. Och att k\u00f6ra teststacken, \u00e4ven om det bara \u00e4r f\u00f6r en timme eller \u00e5tta timmar, \u00e4r en ganska kostsam aff\u00e4r. <\/p>\n<p><\/p>\n<p>Vi automatiserade detta. Jenkins-jobbet gjorde det m\u00f6jligt att k\u00f6ra stacken. Man beh\u00f6vde starta en pull request med de \u00e4ndringar som utvecklaren ville testa, ange alla n\u00f6dv\u00e4ndiga alternativ, komponenter samt storlekar. Om han ville utf\u00f6ra prestandatestning, kunde han ta fler instanser. Om han bara beh\u00f6vde kontrollera att ett formul\u00e4r \u00f6ppnas, kunde han k\u00f6ra det p\u00e5 minimala inst\u00e4llningar. Man kunde ocks\u00e5 ange om en kluster beh\u00f6vdes eller inte, och s\u00e5 vidare. <\/p>\n<p><\/p>\n<p>Och sedan pushade Jenkins ett shell-skript som lite modifierade koden i Terraform-mappen. Det tog bort on\u00f6diga filer, lade till n\u00f6dv\u00e4ndiga filer. Och sedan, med ett enda k\u00f6rning, startade Terraform apply stacken. <\/p>\n<p><\/p>\n<p>Och d\u00e4refter f\u00f6ljde andra steg, som jag inte vill g\u00e5 djupare in p\u00e5. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b288c0b320d8cb6e282db994bc1c1f43.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eftersom vi beh\u00f6vde lite fler alternativ f\u00f6r testningen \u00e4n i produktion, var vi tvungna att g\u00f6ra kopior av modulerna f\u00f6r att kunna l\u00e4gga till de funktioner som endast beh\u00f6vdes i testningen. <\/p>\n<p><\/p>\n<p>Och s\u00e5 blev det s\u00e5 att i testningen ville man liksom testa de \u00e4ndringar som skulle g\u00e5 till produktion. Men i verkligheten testades en sak, medan n\u00e5got annat till\u00e4mpades i produktion. Det fanns en liten klyfta, eftersom alla \u00e4ndringar i produktion till\u00e4mpades av driftteamet. Och ibland h\u00e4nde det att de \u00e4ndringar som skulle g\u00e5 fr\u00e5n testningen till produktion f\u00f6rblev i en annan version. <\/p>\n<p><\/p>\n<p>Ut\u00f6ver detta fanns det ett problem d\u00e4r en ny tj\u00e4nst lades till, som skilde sig n\u00e5got fr\u00e5n en redan befintlig. Ist\u00e4llet f\u00f6r att modifiera den existerande modulen fick man g\u00f6ra en kopia av den och l\u00e4gga till n\u00f6dv\u00e4ndiga \u00e4ndringar. <\/p>\n<p><\/p>\n<p>I grund och botten \u00e4r Terraform inte ett riktigt spr\u00e5k. Det \u00e4r en deklaration. Om vi beh\u00f6ver deklarera n\u00e5got, s\u00e5 g\u00f6r vi det. Och allt detta fungerar.<\/p>\n<p><\/p>\n<p>Vid ett tillf\u00e4lle, n\u00e4r en av mina pull requests diskuterades, sa en kollega att vi inte beh\u00f6vde skapa sn\u00f6flingor. Jag blev nyfiken p\u00e5 vad han menade. Det finns en vetenskaplig fakta som s\u00e4ger att det inte finns tv\u00e5 identiska sn\u00f6flingor i v\u00e4rlden, de skiljer sig alla lite grann. S\u00e5 snart jag h\u00f6rde detta k\u00e4nde jag vikten av Terraform-koden. F\u00f6r n\u00e4r det kr\u00e4vdes att g\u00e5 fr\u00e5n en version till en annan, kr\u00e4vde Terraform en breaking chain-\u00e4ndring, det vill s\u00e4ga att koden inte l\u00e4ngre var kompatibel med den n\u00e4sta versionen. Och man beh\u00f6vde g\u00f6ra en pull request som t\u00e4ckte n\u00e4stan h\u00e4lften av filerna i infrastrukturen f\u00f6r att f\u00f6ra infrastrukturen till n\u00e4sta version av Terraform.<\/p>\n<p><\/p>\n<p>Och efter att en s\u00e5dan sn\u00f6flinga d\u00f6k upp, f\u00f6rvandlades all Terraform-kod vi hade till en stor, stor h\u00f6g med sn\u00f6. <\/p>\n<p><\/p>\n<p>F\u00f6r en extern utvecklare, som inte \u00e4r en del av driften, spelar det inte s\u00e5 stor roll, eftersom han gjorde en pull request och hans resurs startade. Och allt, sedan \u00e4r det inte hans bekymmer. Men f\u00f6r DevOps-teamet, som ser till att allt \u00e4r okej, kr\u00e4vs det att man g\u00f6r alla dessa \u00e4ndringar. Kostnaden f\u00f6r dessa \u00e4ndringar \u00f6kade mycket med varje ytterligare sn\u00f6flinga.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/d07039414027798861d1424bb2c686b6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det finns en historia om en student p\u00e5 ett seminarium som ritade tv\u00e5 perfekta cirklar med krita p\u00e5 tavlan. L\u00e4raren blev f\u00f6rv\u00e5nad \u00f6ver hur han lyckades rita dem s\u00e5 j\u00e4mnt utan passare. Studenten svarade: \"Mycket enkelt, jag snurrade en k\u00f6ttkvarn i tv\u00e5 \u00e5r i arm\u00e9n.\" <\/p>\n<p><\/p>\n<p>Och av de fyra \u00e5r som jag har deltagit i detta projekt har jag p\u00e5 cirka tv\u00e5 \u00e5r sysslat med Terraform. Och sj\u00e4lvklart har jag n\u00e5gra knep, n\u00e5gra tips p\u00e5 hur man kan f\u00f6renkla Terraform-koden, arbeta med den som ett programmeringsspr\u00e5k och minska belastningen p\u00e5 utvecklarna som m\u00e5ste h\u00e5lla denna kod uppdaterad. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9413c6adf1933482dcc822b021773df9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det f\u00f6rsta jag skulle vilja b\u00f6rja med \u00e4r Symlinks. Terraform har mycket upprepande kod. Till exempel, anropet av leverant\u00f6ren sker praktiskt taget vid varje punkt d\u00e4r vi skapar en del av infrastrukturen, det \u00e4r alltid detsamma. D\u00e4rf\u00f6r \u00e4r det logiskt att flytta det till en separat mapp. Och d\u00e4r det kr\u00e4vs av leverant\u00f6ren, skapa Symlinks till den h\u00e4r filen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6dcf36cc8c94e7a70cf6ab1456cc1215.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Till exempel, i produktion anv\u00e4nder ni en assume role som till\u00e5ter er att f\u00e5 \u00e5tkomst till ett externt Amazon-konto. Om ni \u00e4ndrar en fil, kommer alla andra som finns i resursstrukturen att ha de n\u00f6dv\u00e4ndiga r\u00e4ttigheterna f\u00f6r att Terraform ska veta vilket Amazon-segment det ska ansluta till. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6df9a89ef48ae9a7adda7fb1f86b76aa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Var fungerar inte Symlinks? Som sagt, i Terraform finns det state-filer. Och de \u00e4r verkligen, verkligen bra. Men grejen \u00e4r att Terraform initierar backend i den allra f\u00f6rsta fasen. Och det kan inte anv\u00e4nda n\u00e5gra variabler i dessa parametrar, de m\u00e5ste alltid skrivas som text. <\/p>\n<p><\/p>\n<p>Och som resultat, n\u00e4r n\u00e5gon skapar en ny resurs, kopierar de en del av koden fr\u00e5n andra mappar. Och de kan g\u00f6ra ett misstag med nyckeln eller med bucket. Till exempel, de g\u00f6r en sandbox-pryl fr\u00e5n sandbox, men sen g\u00f6r de en i produktionen. Och det kan h\u00e4nda att bucket i produktionen kommer att anv\u00e4ndas fr\u00e5n sandbox. Sj\u00e4lvklart kommer det att uppt\u00e4ckas snabbt. Det kan \u00e5tg\u00e4rdas p\u00e5 n\u00e5got s\u00e4tt, men det \u00e4r \u00e4nd\u00e5 en f\u00f6rlust av tid och p\u00e5 ett s\u00e4tt resurser. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/757294dc6a1a27fc4a5fe174cc4aa7d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vad kan vi g\u00f6ra h\u00e4rn\u00e4st? Innan vi arbetar med Terraform m\u00e5ste vi initiera det. Vid initieringen laddar Terraform ner alla plugins. Vid n\u00e5got tillf\u00e4lle br\u00f6ts de fr\u00e5n en monolitisk arkitektur till en mer mikrotj\u00e4nstarkitektur. Och det \u00e4r alltid n\u00f6dv\u00e4ndigt att k\u00f6ra Terraform init f\u00f6r att h\u00e4mta alla moduler och alla plugins.<\/p>\n<p><\/p>\n<p>Och vi kan anv\u00e4nda ett shell-script som, f\u00f6r det f\u00f6rsta, kan h\u00e4mta alla variabler. Shell-scriptet \u00e4r inte begr\u00e4nsat. F\u00f6r det andra, s\u00f6kv\u00e4gar. Om vi alltid anv\u00e4nder den s\u00f6kv\u00e4g som finns i repositoryt som nyckel till state-filen, s\u00e5 \u00e4r d\u00e4rf\u00f6r risken f\u00f6r fel eliminerad. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b70dbc6d8edb1b255c64d722a7e40680.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Varifr\u00e5n f\u00e5r vi data? JSON-fil. Terraform till\u00e5ter att skriva infrastrukturen inte bara i hcl (HashiCorp Configuration Language), utan \u00e4ven i JSON.<\/p>\n<p><\/p>\n<p>JSON \u00e4r l\u00e4tt att l\u00e4sa fr\u00e5n shell-scriptet. D\u00e4rf\u00f6r kan vi placera en konfigurationsfil med bucket p\u00e5 n\u00e5got st\u00e4lle. Och anv\u00e4nda denna bucket b\u00e5de i Terraform-koden och i shell-scriptet f\u00f6r initiering. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/a18b92cac763003ec49af8d4a37e19d9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Varf\u00f6r \u00e4r det viktigt att ha en bucket f\u00f6r Terraform? F\u00f6r att det finns n\u00e5got som kallas remote state-filer. Det vill s\u00e4ga, n\u00e4r jag skapar en resurs m\u00e5ste jag, f\u00f6r att s\u00e4ga till Amazon: \"Skapa g\u00e4rna en instans\", ange m\u00e5nga obligatoriska parametrar. <\/p>\n<p><\/p>\n<p>Och dessa identifierare lagras i en annan mapp. Jag kan s\u00e4ga: \"Terraform, g\u00e5 sn\u00e4lla till state-filen f\u00f6r den aktuella resursen och h\u00e4mta dessa identifierare \u00e5t mig.\" P\u00e5 s\u00e5 s\u00e4tt blir det en slags enhetlighet mellan olika regioner eller milj\u00f6er.<\/p>\n<p><\/p>\n<p>Det \u00e4r inte alltid m\u00f6jligt att anv\u00e4nda en fj\u00e4rrstate-fil. Till exempel, om du har skapat en VPC manuellt. Och den Terraform-kod som skapar VPC:n skapar en s\u00e5 pass olik VPC att det tar l\u00e5ng tid och kr\u00e4vs m\u00e5nga justeringar f\u00f6r att f\u00e5 det att fungera, d\u00e4rf\u00f6r kan man anv\u00e4nda f\u00f6ljande l\u00f6sning. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/04ffcd97e2fae323d9b4d81e5f6c751a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det vill s\u00e4ga att g\u00f6ra en modul som p\u00e5 n\u00e5got s\u00e4tt skapar en VPC och ger dig identifierarna, men i sj\u00e4lva verket \u00e4r det bara en fil med h\u00e5rdkodade v\u00e4rden som kan anv\u00e4ndas f\u00f6r att skapa samma instans.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9cd878c459f377caf5af9bf27b026187.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det \u00e4r inte alltid n\u00f6dv\u00e4ndigt att spara state-filen i molnet. Till exempel n\u00e4r moduler testas kan man anv\u00e4nda backend-initialisering, d\u00e4r filen sparas bara p\u00e5 disken under testningen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/70fee8d4105cfddacafeec00825127b5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lite om testning nu. Vad kan man testa i Terraform? F\u00f6rmodligen mycket, men jag kommer att prata om dessa 4 saker.<\/p>\n<p><\/p>\n<p>HashiCorp har en viss f\u00f6rst\u00e5else f\u00f6r hur Terraform-koden ska formateras. Terraform fmt l\u00e5ter dig formatera koden du redigerar enligt denna standard. D\u00e4rf\u00f6r m\u00e5ste testerna absolut verifiera om formateringen st\u00e4mmer \u00f6verens med vad HashiCorp har f\u00f6reskrivit, s\u00e5 att du inte beh\u00f6ver \u00e4ndra placeringen av parenteser osv. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/bb99ffdd9f963f0f44ea7b5379689737.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e4sta \u00e4r Terraform validate. Det g\u00f6r lite mer \u00e4n bara syntaktisk kontroll \u2013 typ, \u00e4r alla parenteser parvisa. Vad \u00e4r viktigt h\u00e4r? V\u00e5r infrastruktur \u00e4r ganska omfattande. Det finns m\u00e5nga olika mappar, och i varje m\u00e5ste Terraform validate k\u00f6ras.<\/p>\n<p><\/p>\n<p>F\u00f6r att p\u00e5skynda testningen k\u00f6r vi flera processer parallellt. <\/p>\n<p><\/p>\n<p>Parallell \u00e4r en riktigt bra grej, anv\u00e4nd den.<\/p>\n<p><\/p>\n<p>Men varje g\u00e5ng Terraform initieras g\u00e5r den till HashiCorp och fr\u00e5gar: \"Vilka \u00e4r de senaste versionerna av pluggarna? Och den plugin jag har i cache - \u00e4r den aktuell eller inte?\". Och detta inneb\u00e4r en f\u00f6rsening vid varje steg. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/836e90327c7a60c493f42f0a055e248b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Om man talar om f\u00f6r Terraform var pluggarna finns, s\u00e4ger Terraform: \"Okej, det h\u00e4r \u00e4r antagligen den senaste versionen. Jag beh\u00f6ver inte g\u00e5 n\u00e5gonstans, jag b\u00f6rjar direkt validera din Terraform-kod.\"<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8ab344cf8de7087d30a1212d44691c20.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>F\u00f6r att fylla mappen med n\u00f6dv\u00e4ndiga pluggar har vi en mycket enkel Terraform-kod som bara beh\u00f6ver initieras. H\u00e4r m\u00e5ste man sj\u00e4lvklart ange alla leverant\u00f6rer som p\u00e5 n\u00e5got s\u00e4tt \u00e4r involverade i din kod, annars s\u00e4ger Terraform: \"Jag k\u00e4nner inte till n\u00e5gon leverant\u00f6r eftersom den inte finns i cachen.\"<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b8130753045624d38bce32ba08b56fb0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e4sta steg \u00e4r Terraform plan. Som n\u00e4mnt, utveckling \u00e4r cyklisk. Vi g\u00f6r kod med \u00e4ndringar. Och sedan m\u00e5ste vi ta reda p\u00e5 vilka \u00e4ndringar som planeras p\u00e5 infrastrukturen. <\/p>\n<p><\/p>\n<p>Och n\u00e4r infrastrukturen \u00e4r v\u00e4ldigt, v\u00e4ldigt stor, kan man \u00e4ndra en modul, fixa en testmilj\u00f6 eller en specifik region och bryta n\u00e5got n\u00e4rliggande. D\u00e4rf\u00f6r b\u00f6r Terraform plan g\u00f6ras f\u00f6r hela infrastrukturen och visa vilka \u00e4ndringar som \u00e4r planerade.<\/p>\n<p><\/p>\n<p>Detta kan g\u00f6ras smart. Vi har till exempel skrivit ett script p\u00e5 Python som l\u00f6ser beroenden. Beroende p\u00e5 vad som har \u00e4ndrats: Terraform-modulen eller bara en specifik komponent, g\u00f6r det planer f\u00f6r alla beroende mappar.<\/p>\n<p><\/p>\n<p>Terraform plan b\u00f6r g\u00f6ras p\u00e5 beg\u00e4ran. \u00c5tminstone \u00e4r det vad vi g\u00f6r. <\/p>\n<p><\/p>\n<p>Tester \u00e4r sj\u00e4lvklart bra att g\u00f6ra f\u00f6r varje f\u00f6r\u00e4ndring, f\u00f6r varje commit, men planer \u00e4r ganska kostsamma. Och i pull request s\u00e4ger vi: \"V\u00e4nligen ge mig planer\". En robot s\u00e4tts ig\u00e5ng. Och den skickar i kommentarer eller som bifogade filer alla planer som f\u00f6rv\u00e4ntas fr\u00e5n dina \u00e4ndringar. <\/p>\n<p><\/p>\n<p>Planen \u00e4r en ganska kostsam process. Den tar tid eftersom Terraform g\u00e5r till Amazon och fr\u00e5gar: \"Finns denna instans fortfarande? Har denna autoskalexakt dessa parametrar?\". Och f\u00f6r att snabba p\u00e5 processen kan man anv\u00e4nda parametern refresh=false. Det inneb\u00e4r att Terraform kommer att h\u00e4mta state fr\u00e5n S3. Och kommer att tro att state exakt motsvarar det som finns i Amazon.<\/p>\n<p><\/p>\n<p>En s\u00e5dan Terraform-plan g\u00e5r mycket snabbare, men tillst\u00e5ndet m\u00e5ste motsvara din infrastruktur, dvs. n\u00e5gonstans, n\u00e5gon g\u00e5ng m\u00e5ste Terraform refresh k\u00f6ras. Terraform refresh g\u00f6r just det, s\u00e5 att tillst\u00e5ndet st\u00e4mmer \u00f6verens med vad som finns i den verkliga infrastrukturen. <\/p>\n<p><\/p>\n<p>Och det \u00e4r viktigt att n\u00e4mna s\u00e4kerhet. Det \u00e4r h\u00e4r man borde b\u00f6rja. D\u00e4r du k\u00f6r Terraform, och Terraform arbetar med din infrastruktur, finns det en s\u00e5rbarhet. Det vill s\u00e4ga, du k\u00f6r i grunden kod. Och om pull requesten inneh\u00e5ller n\u00e5gon skadlig kod, kan den k\u00f6ras p\u00e5 en infrastruktur som har f\u00f6r mycket \u00e5tkomst. S\u00e5 var f\u00f6rsiktig med var du k\u00f6r Terraform-planen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/2153cc01acf2b1f46978f837b82b317e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e4sta sak jag vill prata om \u00e4r testning av user-data.<\/p>\n<p><\/p>\n<p>Vad \u00e4r user-data? I Amazon, n\u00e4r vi skapar en instans, kan vi skicka n\u00e5got slags meddelande med instansen \u2013 metadata. N\u00e4r instansen startas finns vanligtvis cloud init alltid p\u00e5 dessa instanser. Cloud init l\u00e4ser detta meddelande och s\u00e4ger: \"Okej, idag \u00e4r jag - load balancer\". Och i enlighet med dessa instruktioner utf\u00f6r det vissa \u00e5tg\u00e4rder.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/406ac9341e102f5e0d7ca239d10675cd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Men tyv\u00e4rr, n\u00e4r vi g\u00f6r Terraform-plan och Terraform-till\u00e4mpning, ser user-data ut som en sorts gr\u00f6t av siffror. Det vill s\u00e4ga, det skickar bara en hash. Och allt du kan se i planen \u00e4r om det kommer att ske n\u00e5gra f\u00f6r\u00e4ndringar eller om hashen f\u00f6rblir densamma. <\/p>\n<p><\/p>\n<p>Och om man inte uppm\u00e4rksammar detta kan ett skadat textdokument hamna p\u00e5 Amazon, p\u00e5 den verkliga infrastrukturen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/cd7b56f1149d9cbebb0ad3228c0eeb5f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Som ett alternativ kan man ange inte hela infrastrukturen vid k\u00f6rning, utan endast mallen. Och i koden s\u00e4ga: \"Var sn\u00e4ll och skriv ut denna mall f\u00f6r mig\". Och slutligen kan man f\u00e5 en utskrift av hur dina data kommer att se ut p\u00e5 Amazon.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/86da779cdf7f9cacfd80a196efde47f7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ett annat alternativ \u00e4r att anv\u00e4nda en modul f\u00f6r att generera user-data. Du till\u00e4mpar denna modul. F\u00e5r en fil p\u00e5 disken. J\u00e4mf\u00f6r den med referensen. Och p\u00e5 s\u00e5 s\u00e4tt, om n\u00e5gon junior beslutar sig f\u00f6r att justera user-data lite, kommer dina tester att s\u00e4ga: \"Okej, h\u00e4r och h\u00e4r \u00e4r n\u00e5gra f\u00f6r\u00e4ndringar \u2013 det \u00e4r okej\".<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/7e69ec1b2c04710066d93ee48f872254.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e4sta sak jag vill prata om \u00e4r att automatisera Terraform-till\u00e4mpning.<\/p>\n<p><\/p>\n<p>Sj\u00e4lvklart \u00e4r det ganska skr\u00e4mmande att g\u00f6ra Terraform-till\u00e4mpning automatiskt, f\u00f6r vem vet vilka \u00e4ndringar som kommit och hur f\u00f6r\u00f6dande de kan vara f\u00f6r den levande infrastrukturen. <\/p>\n<p><\/p>\n<p>F\u00f6r testmilj\u00f6n \u2013 \u00e4r detta helt okej. Det vill s\u00e4ga, jobben som skapar testmilj\u00f6n \u00e4r n\u00e5got som alla utvecklare beh\u00f6ver. Och ett uttryck som \"jag har allt fungerande\" \u00e4r inte ett sk\u00e4mt, utan ett bevis p\u00e5 att personen har brytt sig, har satt upp stacken, k\u00f6rt tester p\u00e5 denna stack och har s\u00e4kerst\u00e4llt att allt \u00e4r okej och sagt: \"Okej, den koden jag sl\u00e4pper har testats.\"<\/p>\n<p><\/p>\n<p>I produktion, sandbox och andra milj\u00f6er som \u00e4r viktigare f\u00f6r aff\u00e4ren kan man delvis till\u00e4mpa vissa resurser ganska s\u00e4kert, eftersom det inte leder till att n\u00e5gon d\u00f6r. Det handlar om: autoscale-grupper, s\u00e4kerhetsgrupper, roller, route53 och d\u00e4r listan kan bli ganska stor. Men h\u00e5ll ett \u00f6ga p\u00e5 vad som h\u00e4nder och l\u00e4s rapporter om automatiska till\u00e4mpningar. <\/p>\n<p><\/p>\n<p>D\u00e4r det \u00e4r farligt eller l\u00e4skigt att till\u00e4mpa, till exempel om det handlar om resurser med persistent, med databaser, ska ni f\u00e5 rapporter om att det finns oanv\u00e4nda \u00e4ndringar i n\u00e5got stycke av infrastrukturen. Ingenj\u00f6ren f\u00e5r sedan genom \u00f6vervakning starta jobs f\u00f6r att till\u00e4mpa eller g\u00f6r det fr\u00e5n sin konsol. <\/p>\n<p><\/p>\n<p>I Amazon finns det n\u00e5got som kallas Terminate protection. Och det kan skydda er i vissa fall fr\u00e5n o\u00f6nskade \u00e4ndringar. Det vill s\u00e4ga, Terraform g\u00e5r till Amazon och s\u00e4ger: \"Jag beh\u00f6ver d\u00f6da denna instans f\u00f6r att skapa en annan.\" Men Amazon svarar: \"Tyv\u00e4rr, inte idag. Vi har Terminate protection aktiverat.\"<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9f4258d8688556829586a1e308f5a1e2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och gr\u00e4dden p\u00e5 moset \u2013 \u00e4r kodoptimering. N\u00e4r vi arbetar med Terraform-kod m\u00e5ste vi \u00f6verf\u00f6ra ett mycket stort antal parametrar till modulen. Det \u00e4r de parametrar som beh\u00f6vs f\u00f6r att skapa en viss resurs. Och koden blir till stora listor av parametrar som m\u00e5ste \u00f6verf\u00f6ras fr\u00e5n modul till modul, s\u00e4rskilt om modulerna \u00e4r inb\u00e4ddade. <\/p>\n<p><\/p>\n<p>Och det \u00e4r mycket sv\u00e5rt att l\u00e4sa. Det \u00e4r mycket sv\u00e5rt att g\u00f6ra granskning. Och det h\u00e4nder ofta att vissa parametrar g\u00e5r igenom granskningen och de \u00e4r inte helt de som beh\u00f6vs. Och det kostar tid och pengar att \u00e5tg\u00e4rda det senare.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/ad7e8a91692212fda9f2561854b881c9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>D\u00e4rf\u00f6r f\u00f6resl\u00e5r jag att ni anv\u00e4nder n\u00e5got som kallas komplex parameter som inkluderar en slags tr\u00e4ddiagram av v\u00e4rden. Det vill s\u00e4ga, ni beh\u00f6ver en mapp d\u00e4r ni anger alla v\u00e4rden som ni skulle vilja ha p\u00e5 n\u00e5gon milj\u00f6.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/909632949eb30057bf86b116239d9077.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och genom att anropa denna modul kan man f\u00e5 ett tr\u00e4d som genereras i en gemensam modul, det vill s\u00e4ga i en gemensam modul som fungerar lika f\u00f6r hela infrastrukturen.<\/p>\n<p><\/p>\n<p>I denna modul kan du g\u00f6ra vissa ber\u00e4kningar, med hj\u00e4lp av en ny funktion i Terraform som kallas locals. Och sedan kan du genom en output ge n\u00e5got komplext parameter som kan inkludera hash, arrayer och s\u00e5 vidare. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/25c14e0397f8d95c301e0dfe6ae761df.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det \u00e4r allt f\u00f6r de b\u00e4sta insikterna jag har. Jag skulle ocks\u00e5 vilja ber\u00e4tta en historia om Columbus. N\u00e4r han s\u00f6kte pengar f\u00f6r sin expedition f\u00f6r att uppt\u00e4cka Indien (som han d\u00e5 trodde), trodde ingen p\u00e5 honom och de ans\u00e5g det vara om\u00f6jligt. D\u00e5 sa han: \"F\u00e5 \u00e4gget att inte ramla.\" Alla bankirer, mycket rika och f\u00f6rmodligen smarta m\u00e4nniskor, f\u00f6rs\u00f6kte p\u00e5 n\u00e5got s\u00e4tt st\u00e4lla \u00e4gget upp, men det f\u00f6ll hela tiden. D\u00e5 tog Columbus \u00e4gget, tryckte lite p\u00e5 det. Det sprack och \u00e4gget stod still. De sa: \"\u00c5h, det h\u00e4r \u00e4r f\u00f6r enkelt!\". Och Columbus svarade: \"Ja, det \u00e4r f\u00f6r enkelt. Och n\u00e4r jag uppt\u00e4cker Indien, kommer alla att anv\u00e4nda denna handelsv\u00e4g.\" <\/p>\n<p><\/p>\n<p>Det jag just ber\u00e4ttade f\u00f6r er \u00e4r nog tillr\u00e4ckligt enkla och triviala saker. Och n\u00e4r du l\u00e4r dig om dem och b\u00f6rjar anv\u00e4nda dem \u00e4r det helt okej. S\u00e5 anv\u00e4nd dem. Och om dessa \u00e4r helt normala f\u00f6r dig, s\u00e5 vet du \u00e5tminstone hur man st\u00e4ller \u00e4gget s\u00e5 att det inte ramlar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/37bf83d04b99f089f2319c8d2e8aaeb4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L\u00e5t oss sammanfatta: <\/p>\n<p><\/p>\n<ul>\n<li>F\u00f6rs\u00f6k att undvika sn\u00f6flingor. Ju f\u00e4rre sn\u00f6flingor, desto mindre resurser beh\u00f6ver du f\u00f6r att g\u00f6ra n\u00e5gra f\u00f6r\u00e4ndringar i hela din stora infrastruktur. <\/li>\n<li>Kontinuerliga f\u00f6r\u00e4ndringar. Det vill s\u00e4ga n\u00e4r det har skett f\u00f6r\u00e4ndringar i koden, b\u00f6r du s\u00e5 snabbt som m\u00f6jligt f\u00f6ra din infrastruktur i linje med dessa f\u00f6r\u00e4ndringar. Det ska inte finnas situationer d\u00e4r n\u00e5gon kommer om tv\u00e5 eller tre m\u00e5nader f\u00f6r att kolla p\u00e5 Elasticsearch, g\u00f6r Terraform plan, och det finns en massa f\u00f6r\u00e4ndringar som de inte f\u00f6rv\u00e4ntade sig. Och det tar v\u00e4ldigt mycket tid att f\u00e5 allt tillbaka i ordning. <\/li>\n<li>Tester och automatisering. Ju mer din kod \u00e4r t\u00e4ckt av tester och funktioner, desto mer \u00e4r du s\u00e4ker p\u00e5 att du g\u00f6r allt r\u00e4tt. Och automatisk leverans \u00f6kar din s\u00e4kerhet flera g\u00e5nger. <\/li>\n<li>Koden f\u00f6r test- och produktionsmilj\u00f6er b\u00f6r vara praktiskt taget identiska. Praktiskt taget, eftersom produktion \u00e4nd\u00e5 \u00e4r lite annorlunda och det alltid kommer att finnas n\u00e5gra nyanser som g\u00e5r utanf\u00f6r testmilj\u00f6n. Men \u00e4nd\u00e5 kan detta s\u00e4kerst\u00e4llas med plus-minus. <\/li>\n<li>Och om ni har v\u00e4ldigt mycket Terraform-kod och det kr\u00e4vs mycket tid f\u00f6r att h\u00e5lla denna kod aktuell, s\u00e5 \u00e4r det aldrig f\u00f6r sent att g\u00f6ra refactoring och f\u00e5 den i ett bra skick. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. 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>Immutable infrastructure. Leverans av AMI enligt schema. <\/li>\n<li>Struktur f\u00f6r route53, n\u00e4r ni har m\u00e5nga poster och vill att de ska vara i ordnad ordning. <\/li>\n<li>Kamp mot API rate limits. Det \u00e4r n\u00e4r Amazon s\u00e4ger: \"Alla, jag kan inte ta emot fler f\u00f6rfr\u00e5gningar, v\u00e4nligen v\u00e4nta.\" Och halva f\u00f6retaget v\u00e4ntar tills de kan starta sin infrastruktur. <\/li>\n<li>Spotinstanser. Amazon \u00e4r inte billigt och spots g\u00f6r det m\u00f6jligt att spara ganska mycket. Man kan h\u00e5lla ett helt f\u00f6redrag om detta. <\/li>\n<li>S\u00e4kerhet och IAM roller. <\/li>\n<li>S\u00f6kning efter f\u00f6rlorade resurser, n\u00e4r ni har instanser i Amazon av ok\u00e4nt ursprung, de kostar pengar. \u00c4ven om en instans kostar 100-150 dollar i m\u00e5naden \u2013 per \u00e5r blir det \u00f6ver 1 000. Att hitta s\u00e5dana resurser \u00e4r en l\u00f6nsam uppgift. <\/li>\n<li>Och reserverade instanser. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/69ddbf4c726bcc15aea1a1e2d67a3fc8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det \u00e4r allt f\u00f6r mig. Terraform \u00e4r riktigt fantastiskt, anv\u00e4nd det. Tack!<\/p>\n<p><\/p>\n<p>Fr\u00e5gor<\/p>\n<p><\/p>\n<p><em>Tack f\u00f6r f\u00f6redraget! Er state-fil ligger i S3, hur hanterar ni problemet med att flera personer kan ta den state-filen och f\u00f6rs\u00f6ka g\u00f6ra en deployment?<\/em><\/p>\n<p><\/p>\n<p>F\u00f6r det f\u00f6rsta, vi har ingen br\u00e5dska. F\u00f6r det andra, vi har flaggor d\u00e4r vi meddelar att vi arbetar med en viss del av koden. Det vill s\u00e4ga, trots att infrastrukturen \u00e4r mycket stor, betyder det inte att n\u00e5gon st\u00e4ndigt till\u00e4mpar n\u00e5got. Under den aktiva fasen var det ett problem, v\u00e5ra state-filer lagrades i Git. Det var viktigt, annars skapade n\u00e5gon en state-fil och vi fick manuellt samla dem f\u00f6r att allt skulle forts\u00e4tta. Denna problematik finns inte l\u00e4ngre. Faktum \u00e4r att Terraform har l\u00f6st denna uppgift. Och om n\u00e5got st\u00e4ndigt f\u00f6r\u00e4ndras kan man anv\u00e4nda l\u00e5s som f\u00f6rhindrar det du n\u00e4mnde.<\/p>\n<p><\/p>\n<p><em>Anv\u00e4nder ni den \u00f6ppna versionen eller enterprise?<\/em><\/p>\n<p><\/p>\n<p>Ingen enterprise, det vill s\u00e4ga allt som kan h\u00e4mtas gratis. <\/p>\n<p><\/p>\n<p><em>Jag heter Stanislav. Jag ville g\u00f6ra en liten till\u00e4gg. Ni ber\u00e4ttade om en funktion fr\u00e5n Amazon som g\u00f6r att instansen blir of\u00f6rst\u00f6rbar. Det finns \u00e4ven i Terraform, d\u00e4r man i blocket Life Second kan skriva en f\u00f6rbud mot \u00e4ndringar, eller ett f\u00f6rbud mot f\u00f6rst\u00f6relse.<\/em> <\/p>\n<p><\/p>\n<p>Jag hade begr\u00e4nsad tid. Bra observation. <\/p>\n<p><\/p>\n<p><em>Jag ville ocks\u00e5 fr\u00e5ga om tv\u00e5 saker. F\u00f6r det f\u00f6rsta, ni ber\u00e4ttade om tester. Har ni anv\u00e4nt n\u00e5gra verktyg f\u00f6r testning? Jag har h\u00f6rt talas om pluginet Test Kitchen. Finns det n\u00e5got annat? Och jag skulle ocks\u00e5 vilja fr\u00e5ga om Local Values. Hur skiljer de sig i grund och botten fr\u00e5n Input Variables? Och varf\u00f6r kan jag inte parametrera n\u00e5got enbart genom Local Values? Jag har f\u00f6rs\u00f6kt f\u00f6rst\u00e5 detta \u00e4mne, men jag har inte riktigt lyckats.<\/em><\/p>\n<p><\/p>\n<p>Vi kan prata mer detaljerat om detta efter rummet. Testverktygen \u00e4r helt egenutvecklade. Det finns inget s\u00e4rskilt d\u00e4r f\u00f6r att genomf\u00f6ra tester. Generellt finns det alternativ d\u00e4r automatiserade tester skapar infrastruktur n\u00e5gonstans, kontrollerar att den \u00e4r okej, och sedan tar bort allt med en rapport som visar att er infrastruktur fortfarande \u00e4r i bra form. Vi har inte det, eftersom teststaplar k\u00f6rs varje dag. Och det \u00e4r tillr\u00e4ckligt. Om n\u00e5got b\u00f6rjar g\u00e5 fel s\u00e5 kommer det att b\u00f6rja falla s\u00f6nder utan att vi beh\u00f6ver kontrollera det n\u00e5gon annanstans. <\/p>\n<p><\/p>\n<p>Vad g\u00e4ller Local Values, l\u00e5t oss forts\u00e4tta samtalet efter rummet. <\/p>\n<p><\/p>\n<p><em>Hej! Tack f\u00f6r presentationen! Mycket l\u00e4rorikt. Du n\u00e4mnde att ni har mycket enhetlig kod f\u00f6r att beskriva infrastrukturen. Har ni \u00f6verv\u00e4gt att generera denna kod?<\/em><\/p>\n<p><\/p>\n<p>Bra fr\u00e5ga, tack! Saken \u00e4r den att n\u00e4r vi anv\u00e4nder infrastruktur som kod, antar vi att vi tittar p\u00e5 koden och f\u00f6rst\u00e5r vilken infrastruktur som ligger bakom den. Om koden genereras, beh\u00f6ver vi f\u00f6rest\u00e4lla oss vilken kod som kommer att genereras f\u00f6r att f\u00f6rst\u00e5 vilken infrastruktur som kommer att finnas d\u00e4r. Antingen genererar vi koden, commitar den, och i praktiken f\u00e5r vi samma sak. D\u00e4rf\u00f6r gick vi den v\u00e4g vi har skrivit, det fick vi ut. Plus att generatorer kom n\u00e5got senare, n\u00e4r vi b\u00f6rjade med detta. Och det var f\u00f6r sent att \u00e4ndra.<\/p>\n<p><\/p>\n<p><em>Har du h\u00f6rt n\u00e5got om jsonnet?<\/em><\/p>\n<p><\/p>\n<p>Nej. <\/p>\n<p><\/p>\n<p><em>Kolla, det \u00e4r en riktigt h\u00e4ftig grej. Jag ser ett specifikt fall d\u00e4r det kan till\u00e4mpas och generera datastruktur.<\/em> <\/p>\n<p><\/p>\n<p>Generatorer \u00e4r bra, n\u00e4r man har det som i sk\u00e4mtet om rakhyveln. Det vill s\u00e4ga, f\u00f6rsta g\u00e5ngen ser ansiktena olika ut, men sen har alla samma ansikte. Generatorer fungerar v\u00e4ldigt bra. Men tyv\u00e4rr har vi lite olika ansikten. Det \u00e4r ett problem. <\/p>\n<p><\/p>\n<p><em>Bara titta. Tack!<\/em><\/p>\n<p><\/p>\n<p><em>Jag heter Maxim, jag kommer fr\u00e5n Sberbank. Du ber\u00e4ttade lite om att du f\u00f6rs\u00f6kte g\u00f6ra Terraform till en motsvarighet till ett programmeringsspr\u00e5k. \u00c4r det inte enklare att anv\u00e4nda Ansible?<\/em><\/p>\n<p><\/p>\n<p>Det \u00e4r v\u00e4ldigt olika saker. Man kan b\u00e5de skapa resurser med Ansible och Puppet i Amazon. Men Terraform \u00e4r verkligen anpassat f\u00f6r det. <\/p>\n<p><\/p>\n<p><em>Har ni bara Amazon?<\/em><\/p>\n<p><\/p>\n<p>Det handlar inte om att vi bara har Amazon. Vi har n\u00e4stan bara Amazon. Men den nyckelfunktion som Terraform har \u00e4r att det kommer ih\u00e5g. I Ansible, om man s\u00e4ger: \"Starta 5 instanser\", s\u00e5 startar den dem, och sen s\u00e4ger du: \"Nu beh\u00f6ver jag 3.\" Och Terraform s\u00e4ger: \"Okej, jag tar bort 2\", medan Ansible s\u00e4ger: \"Okej, h\u00e4r \u00e4r 3.\" Totalt blir det 8.<\/p>\n<p><\/p>\n<p><em>Hej! Tack f\u00f6r din presentation! Det var mycket intressant att h\u00f6ra om Terraform. Jag vill genast ge en liten kommentar ang\u00e5ende att Terraform trots allt inte har en stabil release, s\u00e5 var f\u00f6rsiktig med Terraform.<\/em><\/p>\n<p><\/p>\n<p>En sked \u00e4r bra till lunchen. Det vill s\u00e4ga, om du beh\u00f6ver en l\u00f6sning s\u00e5 skjuter du ibland upp det som \u00e4r instabilt och s\u00e5 vidare, men det fungerar och det har hj\u00e4lpt oss. <\/p>\n<p><\/p>\n<p><em>Jag har en fr\u00e5ga. Ni anv\u00e4nder en remote backend, ni anv\u00e4nder S3. Varf\u00f6r anv\u00e4nder ni inte den officiella backend?<\/em><\/p>\n<p><\/p>\n<p>Officiell?<\/p>\n<p><\/p>\n<p><em>Terraform Cloud.<\/em><\/p>\n<p><\/p>\n<p>N\u00e4r kom den?<\/p>\n<p><\/p>\n<p><em>F\u00f6r cirka 4 m\u00e5nader sedan.<\/em> <\/p>\n<p><\/p>\n<p>Om den hade kommit f\u00f6r 4 \u00e5r sedan, s\u00e5 skulle jag troligen ha svarat p\u00e5 din fr\u00e5ga.<\/p>\n<p><\/p>\n<p><em>D\u00e4r finns redan en inbyggd funktion och l\u00e5s, och man kan lagra state-filen. Testa det. Men jag har inte testat det heller.<\/em><\/p>\n<p><\/p>\n<p>Vi \u00e5ker i ett stort t\u00e5g som r\u00f6r sig i h\u00f6g hastighet. Man kan inte bara ta och kasta ut n\u00e5gra vagnar. <\/p>\n<p><\/p>\n<p><em>Du pratade om sn\u00f6flingor, varf\u00f6r anv\u00e4nde du inte branch? Varf\u00f6r gick det inte att g\u00f6ra s\u00e5?<\/em><\/p>\n<p><\/p>\n<p>Vi har den inst\u00e4llningen att hela infrastrukturen finns i ett repositorium. Terraform, Puppet, alla skript som p\u00e5 n\u00e5got s\u00e4tt \u00e4r relaterade till detta, de ligger alla i ett repositorium. P\u00e5 s\u00e5 s\u00e4tt kan vi garantera att inkrementella \u00e4ndringar testas en i taget. Om det hade varit en massa branches s\u00e5 skulle ett s\u00e5dant projekt vara praktiskt taget om\u00f6jligt att underh\u00e5lla. Det g\u00e5r sex m\u00e5nader och de skiljer sig s\u00e5 mycket att det blir ett rent straff. Det \u00e4r det som jag ville fly ifr\u00e5n innan refaktoreringen. <\/p>\n<p><\/p>\n<p><em>Det vill s\u00e4ga, det fungerar inte?<\/em><\/p>\n<p><\/p>\n<p>Det h\u00e4r fungerar \u00f6verhuvudtaget inte.<\/p>\n<p><\/p>\n<p>I branch har jag tagit bort slide-mappen. Det vill s\u00e4ga, om man g\u00f6r en mapp f\u00f6r varje teststack, till exempel, team A \u2013 de har sin egen mapp, team B har sin egen mapp, s\u00e5 fungerar inte det heller. Vi har gjort en enhetlig kod f\u00f6r testmilj\u00f6n som var tillr\u00e4ckligt flexibel f\u00f6r att passa alla. Det vill s\u00e4ga, vi underh\u00f6ll en kod. <\/p>\n<p><\/p>\n<p><em>Hej! Jag heter Jura! Tack f\u00f6r presentationen! Jag har en fr\u00e5ga om moduler. Ni s\u00e4ger att ni anv\u00e4nder moduler. Hur hanterar ni situationen om n\u00e5gon g\u00f6r \u00e4ndringar i en modul som inte \u00e4r kompatibla med n\u00e5gon annans \u00e4ndringar? Versionerar ni moduler eller f\u00f6rs\u00f6ker ni f\u00e5 dem att passa b\u00e5da kraven?<\/em><\/p>\n<p><\/p>\n<p>Det h\u00e4r \u00e4r ett problem med en stor sn\u00f6skala. Det \u00e4r n\u00e5got vi lider av n\u00e4r en till synes ofarlig \u00e4ndring kan bryta en del av infrastrukturen. Och det kommer bara att m\u00e4rkas efter en viss tid.<\/p>\n<p><\/p>\n<p><em>Det vill s\u00e4ga, \u00e4r det fortfarande ol\u00f6st?<\/em><\/p>\n<p><\/p>\n<p>Ni g\u00f6r universella moduler. Undvik sn\u00f6flingor. Och allt kommer att fungera. Den andra delen av presentationen handlar om hur man undviker det.<\/p>\n<p><\/p>\n<p><em>Hej! Tack f\u00f6r presentationen! Jag skulle vilja klarg\u00f6ra en sak. Bakom kulisserna finns en stor h\u00f6g, som jag kom hit f\u00f6r. Hur \u00e4r Puppet och rollutdelning integrerade?<\/em><\/p>\n<p><\/p>\n<p>User-data.<\/p>\n<p><\/p>\n<p><em>Det vill s\u00e4ga, spottar ni bara ut en fil och utf\u00f6r p\u00e5 n\u00e5got s\u00e4tt enligt den?<\/em><\/p>\n<p><\/p>\n<p>User-data \u00e4r en anteckning, det vill s\u00e4ga, n\u00e4r vi skapar en klon av en bild, s\u00e5 startar en daemon och f\u00f6rs\u00f6ker f\u00f6rst\u00e5 vem den \u00e4r, l\u00e4ser anteckningen att den \u00e4r en load balancer.<\/p>\n<p><\/p>\n<p><em>Det vill s\u00e4ga, \u00e4r det en separat process som \u00f6verl\u00e4mnas?<\/em><\/p>\n<p><\/p>\n<p>Vi uppfann inte det. Vi anv\u00e4nder det. <\/p>\n<p><\/p>\n<p><em>Hej! Jag har precis en fr\u00e5ga om User-data. Ni n\u00e4mnde att det finns problem, att n\u00e5gon kan skicka n\u00e5got felaktigt. Finns det n\u00e5got s\u00e4tt att lagra user-data i samma Git, s\u00e5 att det alltid \u00e4r klart vad som refereras av User-data?<\/em><\/p>\n<p><\/p>\n<p>Vi genererar User-data fr\u00e5n template. Det vill s\u00e4ga, det kommer in ett antal variabler. Och Terraform genererar det slutgiltiga resultatet. D\u00e4rf\u00f6r kan man inte bara titta p\u00e5 template och s\u00e4ga vad som kommer att h\u00e4nda, eftersom alla problem beror p\u00e5 att utvecklaren tror att han skickar en str\u00e4ng i den h\u00e4r variabeln, men ist\u00e4llet kommer en array. Och s\u00e5 har han - pl\u00f6tsligt och jag - den, den, n\u00e4sta rad, och allt kraschar. Om det \u00e4r en ny resurs och n\u00e5gon bygger upp den, ser att n\u00e5got inte fungerar, s\u00e5 kan det snabbt l\u00f6sas. Men om det \u00e4r en autoskalningsgrupp som har uppdaterats, d\u00e5 kan instanserna i autoskalningsgruppen b\u00f6rja bytas ut. Och pl\u00f6tsligt fungerar inte n\u00e5got. Det \u00e4r frustrerande.<\/p>\n<p><\/p>\n<p><em>S\u00e5 det enda l\u00f6sningen \u00e4r att testa?<\/em><\/p>\n<p><\/p>\n<p>Ja, du ser problemet, du l\u00e4gger till teststeg. Det vill s\u00e4ga, output kan ocks\u00e5 testas. Kanske inte s\u00e5 bekv\u00e4mt, men du kan ocks\u00e5 s\u00e4tta vissa mark\u00f6rer - kontrollera att User-data \u00e4r ordentligt f\u00e4st h\u00e4r. <\/p>\n<p><\/p>\n<p><em>Jag heter Timur. Det \u00e4r v\u00e4ldigt bra att det finns f\u00f6rel\u00e4sningar om hur man organiserar Terraform korrekt.<\/em><\/p>\n<p><\/p>\n<p>Jag har inte ens b\u00f6rjat.<\/p>\n<p><\/p>\n<p><em>Jag tror att det kommer att vara p\u00e5 n\u00e4sta konferens. Jag har en enkel fr\u00e5ga. Varf\u00f6r h\u00e5rdkodifierar ni v\u00e4rdet i en separat modul, ist\u00e4llet f\u00f6r att anv\u00e4nda tfvars, det vill s\u00e4ga, vad g\u00f6r en modul med v\u00e4rden b\u00e4ttre \u00e4n tfvars?<\/em><\/p>\n<p><\/p>\n<p>Det vill s\u00e4ga, jag h\u00e4r (bild: Production\/environment\/settings.tf) ska skriva: domain = variabel, domain vpcnetwork, variabel vpcnetwork och stvars \u2013 h\u00e4mta samma sak?<\/p>\n<p><\/p>\n<p><em>Vi g\u00f6r precis s\u00e5. Vi refererar till modulens inst\u00e4llningsk\u00e4lla, till exempel.<\/em><\/p>\n<p><\/p>\n<p>I princip \u00e4r det en tfvars. Tfvars \u00e4r mycket praktiska i testmilj\u00f6er. Jag har tfvars f\u00f6r stora instanser, f\u00f6r sm\u00e5. Och jag la en fil i mappen. Och fick det jag ville ha. N\u00e4r vi bygger infrastruktur vill vi kunna se och genast f\u00f6rst\u00e5 allt. Men det blir s\u00e5 att man m\u00e5ste titta h\u00e4r, sedan titta p\u00e5 tfvars.<\/p>\n<p><\/p>\n<p><em>S\u00e5 allt ska vara p\u00e5 ett st\u00e4lle?<\/em><\/p>\n<p><\/p>\n<p>Ja, tfvars \u00e4r n\u00e4r ni har en kod. Och den anv\u00e4nds p\u00e5 flera olika st\u00e4llen med olika nyanser. D\u00e5 skulle ni ha skickat tfvars och f\u00e5tt era nyanser. Och vi \u2013 det \u00e4r infrastruktur som kod i sin renaste form. Tittade och f\u00f6rstod. <\/p>\n<p><\/p>\n<p><em>Hej! Har du r\u00e5kat ut f\u00f6r situationer d\u00e4r molnleverant\u00f6ren blandar sig i det du gjort med Terraform? Anta att vi \u00e4ndrar metadata. Det finns ssh-nycklar d\u00e4r. Och Google l\u00e4gger st\u00e4ndigt in sina egna metadatanoteringar och nycklar. Och Terraform s\u00e4ger alltid att det finns f\u00f6r\u00e4ndringar. Efter varje k\u00f6rning, \u00e4ven om ingenting har f\u00f6r\u00e4ndrats, s\u00e4ger det alltid att det ska uppdatera det f\u00e4ltet.<\/em><\/p>\n<p><\/p>\n<p>Med nycklarna, men \u2013 ja, en del av infrastrukturen p\u00e5verkas av detta, allts\u00e5 kan Terraform inte \u00e4ndra n\u00e5gonting. Vi kan inte \u00e4ndra n\u00e5gonting manuellt heller. Vi lever med detta.<\/p>\n<p><\/p>\n<p><em>Allts\u00e5 har ni st\u00f6tt p\u00e5 detta, men har inte hittat n\u00e5gon l\u00f6sning, det k\u00f6r p\u00e5 och p\u00e5 av sig sj\u00e4lv?<\/em><\/p>\n<p><\/p>\n<p>Tyv\u00e4rr, ja. <\/p>\n<p><\/p>\n<p><em>Hej! Jag heter Starkov Stanislav. Mail.ru Group. Hur l\u00f6ser ni problemet med att generera taggen p\u00e5 ..., hur \u00f6verf\u00f6r ni den inuti? Jag f\u00f6rst\u00e5r det som att ni anv\u00e4nder User-data f\u00f6r att ange hostnamn, och styr Puppet? Och den andra delen av fr\u00e5gan. Hur hanterar ni denna fr\u00e5ga i SG, allts\u00e5 n\u00e4r ni genererar SG, hundra identiska instanser, hur namnger ni dem korrekt?<\/em><\/p>\n<p><\/p>\n<p>De instanser som \u00e4r mycket viktiga f\u00f6r oss namnger vi vackert. De som inte beh\u00f6vs f\u00e5r en till\u00e4ggsnamn som indikerar att det \u00e4r en autoscale-grupp. Och i teorin kan de tas bort f\u00f6r att skapa en ny. <\/p>\n<p><\/p>\n<p>N\u00e4r det g\u00e4ller problematiken med taggar s\u00e5 \u00e4r det inte ett problem utan ett behov. Och vi anv\u00e4nder taggar v\u00e4ldigt, v\u00e4ldigt mycket eftersom infrastrukturen \u00e4r stor och dyr. Vi beh\u00f6ver se vart pengarna g\u00e5r, s\u00e5 taggarna g\u00f6r att vi kan sp\u00e5ra vad och vart v\u00e5ra kostnader g\u00e5r. Och i sin tur hj\u00e4lper det oss att leta efter var f\u00f6r mycket pengar spenderas. <\/p>\n<p><\/p>\n<p>Vad var fr\u00e5gan om igen?<\/p>\n<p><\/p>\n<p><em>N\u00e4r SG skapar hundra instanser, beh\u00f6ver de s\u00e4rskiljas p\u00e5 n\u00e5got s\u00e4tt?<\/em><\/p>\n<p><\/p>\n<p>Nej, det beh\u00f6vs inte. Varje instans har en agent som rapporterar om problem. Om agenten rapporterar s\u00e5 vet agenten om det och \u00e5tminstone finns IP-adressen. Redan nu kan man kolla upp. F\u00f6r det andra anv\u00e4nder vi Consul f\u00f6r Discovery, d\u00e4r vi inte har Kubernetes. Och Consul visar ocks\u00e5 IP-adressen f\u00f6r instansen.<\/p>\n<p><\/p>\n<p><em>Allts\u00e5, ni orienterar er efter IP, inte hostnamn?<\/em><\/p>\n<p><\/p>\n<p>Det \u00e4r om\u00f6jligt att orientera sig efter hostnamn, det finns f\u00f6r m\u00e5nga. Det finns instansidentifierare \u2013 AE m.fl. Man kan hitta den n\u00e5gonstans, kan sl\u00e4nga in den i s\u00f6kningen. <\/p>\n<p><\/p>\n<p><em>Hej! Jag f\u00f6rst\u00e5r att Terraform \u00e4r en bra grej, anpassad f\u00f6r moln.<\/em> <\/p>\n<p><\/p>\n<p>Inte bara. <\/p>\n<p><\/p>\n<p><em>Denna fr\u00e5ga intresserar mig. Om du best\u00e4mmer dig f\u00f6r att flytta, l\u00e5t oss s\u00e4ga, till Bare Metal massivt med alla dina instanser? Kommer det inte att uppst\u00e5 n\u00e5gra problem? Eller m\u00e5ste man \u00e4nd\u00e5 anv\u00e4nda andra produkter, som den n\u00e4mnda Ansible?<\/em><\/p>\n<p><\/p>\n<p>Ansible handlar lite om n\u00e5got annat. Det vill s\u00e4ga, Ansible fungerar n\u00e4r instansen har startat. Terraform fungerar innan instansen har startat. \u00d6verg\u00e5ngen till Bare Metal \u2013 nej. <\/p>\n<p><\/p>\n<p><em>Just nu nej, men f\u00f6retaget kan komma och s\u00e4ga: \"Vi g\u00f6r det\".<\/em><\/p>\n<p><\/p>\n<p>\u00d6verg\u00e5ng till en annan molnleverant\u00f6r \u2013 ja, men h\u00e4r \u00e4r det en annan grej. Man m\u00e5ste skriva Terraform-kod p\u00e5 ett s\u00e4tt s\u00e5 att man kan byta till n\u00e5got annat moln med mindre arbete. <\/p>\n<p><\/p>\n<p>I b\u00f6rjan var m\u00e5let att v\u00e5r infrastruktur skulle vara agnostisk, det vill s\u00e4ga att vilket moln som helst skulle fungera, men vid n\u00e5got tillf\u00e4lle gav f\u00f6retaget upp och sa: \"Okej, under de kommande N \u00e5ren kommer vi inte att flytta n\u00e5gonstans, vi kan anv\u00e4nda tj\u00e4nster fr\u00e5n Amazon\".<\/p>\n<p><\/p>\n<p>Terraform g\u00f6r det m\u00f6jligt att skapa Front-End-jobb, konfigurera PagerDuty, data-dokument etc. Det har m\u00e5nga olika funktioner. Det kan praktiskt taget kontrollera hela v\u00e4rlden.<\/p>\n<p><\/p>\n<p><em>Tack f\u00f6r presentationen! Jag har ocks\u00e5 arbetat med Terraform i fyra \u00e5r. Under den gradvisa \u00f6verg\u00e5ngen till Terraform, till infrastrukturen, till deklarativ beskrivning, st\u00f6tte vi p\u00e5 situationer d\u00e4r n\u00e5gon gjorde saker manuellt, och du f\u00f6rs\u00f6kte skapa en plan. Och fick ett fel. Hur hanterar ni s\u00e5dana problem? Hur hittar ni de f\u00f6rlorade resurser som har angetts?<\/em><\/p>\n<p><\/p>\n<p>Fr\u00e4mst manuellt och visuellt, om vi ser n\u00e5got konstigt i rapporten, analyserar vi vad som p\u00e5g\u00e5r, eller s\u00e5 tar vi helt enkelt bort det. Det \u00e4r faktiskt vanligt med pull requests. <\/p>\n<p><\/p>\n<p><em>Om det finns ett fel, g\u00f6r ni en rollback? Har ni f\u00f6rs\u00f6kt med det?<\/em><\/p>\n<p><\/p>\n<p>Nej, det \u00e4r en m\u00e4nniskas beslut i stunden n\u00e4r han ser ett problem.<\/p>\n<p>K\u00e4lla: <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 5.0.4 - aioseo.com -->\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\/sv\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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:url\" content=\"https:\/\/prohoster.info\/sv\/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\udd47M\u00f6nster i Terraform f\u00f6r att bek\u00e4mpa kaos och manuellt arbete. Maxim Kostrykin (Ixtens) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sv\/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":"sv_SE","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:url":"https:\/\/prohoster.info\/sv\/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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/98123","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=98123"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/98123\/revisions"}],"predecessor-version":[{"id":164071,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/98123\/revisions\/164071"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/98124"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=98123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=98123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=98123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}