Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Det verkar som att Terraform-utvecklare erbjuder ganska anvÀndbara bÀsta metoder för att arbeta med AWS-infrastruktur. Men det finns en liten detalj. Med tiden ökar antalet miljöer och varje har sina egna sÀrdrag. En nÀstan exakt kopia av applikationsstegen dyker upp i grannregionen. Terraform-koden mÄste kopieras och redigeras noggrant enligt de nya kraven eller sÄ mÄste man skapa en snöflinga.

Min presentation handlar om mönster i Terraform för att motverka kaos och manuella rutiner i stora och lÄngvariga projekt.

Video:

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Jag Àr 40 Är och har arbetat inom IT i 20 Är. Jag har jobbat pÄ Ixtens i 12 Är. Vi sysslar med e-commerce-driven development. Och de senaste 5 Ären har jag tillÀmpat DevOps-praktiker.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Mitt berÀttande kommer att handla om erfarenheter frÄn ett projekt pÄ ett företag vars namn jag inte kommer att avslöja pÄ grund av ett sekretessavtal.

Siffrorna pÄ bilden Àr angivna för att förstÄ projektets omfattning. Och allt jag kommer att sÀga hÀrnÀst Àr relaterat till Amazon.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Jag gick med i det hÀr projektet för 4 Är sedan. Och mitt under den pÄgÄende omstruktureringen av infrastrukturen, eftersom projektet hade vuxit. De mönster som anvÀndes passade inte lÀngre. Med tanke pÄ den planerade tillvÀxten av projektet behövde vi tÀnka pÄ nÄgot nytt.

Tack till Matvej som igÄr berÀttade om vad som hÀnde pÄ Dodo Pizza. Det Àr det som hÀnde hos oss för 4 Är sedan.

Utvecklarna kom in och började skapa infrastrukturen koden.

De mest uppenbara anledningarna till varför detta krÀvdes var behovet av snabbare time to market. Det var viktigt att DevOps-teamet inte skulle vara flaskhalsen vid lanseringen. För övrigt anvÀndes Terraform och Puppet redan pÄ den allra första nivÄn.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Terraform Àr ett open source-projekt frÄn HashiCorp. För dem som inte har nÄgon aning om vad detta Àr, följer de kommande bilderna.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Infrastruktur som kod betyder att vi kan beskriva vÄr infrastruktur och be nÄgra robotar att skapa de resurser som vi har beskrivit.

Till exempel, vi behöver virtuell maskin. Vi kommer att beskriva det, lÀgga till ett par obligatoriska parametrar.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

DÀrefter stÀller vi in Ätkomst till Amazon i konsolen. Och vi ber Terraform göra en plan. Terraform-planen kommer att sÀga: "Okej, för din resurs kan vi göra följande." Och minst en resurs kommer att lÀggas till. Och inga förÀndringar förvÀntas.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

NÀr du Àr nöjd kan du be Terraform att tillÀmpa och Terraform kommer att skapa en instans Ät dig, och du fÄr en virtuell maskin i din moln.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Vidare utvecklas vÄrt projekt. Vi lÀgger till vissa förÀndringar. Vi ber om fler instanser, vi lÀgger till 53 poster.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Och vi upprepar. Vi ber om en plan. Vi ser vilka förÀndringar som planeras. Vi tillÀmpar. PÄ sÄ sÀtt vÀxer vÄr infrastruktur.

Terraform anvÀnder nÄgot som kallas state-filer. Det vill sÀga, alla förÀndringar som skickas till Amazon sparas i en fil dÀr varje resurs du har beskrev har motsvarande resurser som skapats i Amazon. PÄ sÄ sÀtt vet Terraform exakt vad som behöver Àndras i Amazon nÀr en beskrivning av en resurs Àndras.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Dessa state-filer var ursprungligen bara filer. Och vi lagrade dem i Git, vilket var extremt besvÀrligt. NÄgon glömde alltid att göra en commit av förÀndringar, vilket ledde till mÄnga konflikter.

Nu finns det en möjlighet att anvÀnda en backend, det vill sÀga Terraform anger i vilken bucket och med vilken nyckel state-filen ska sparas. Och Terraform tar hand om att hÀmta denna state-fil, göra all magi och lÀgga tillbaka det slutgiltiga resultatet.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

VÄr infrastruktur vÀxer. HÀr Àr vÄr kod. Och nu vill vi inte bara skapa en virtuell maskin, vi vill ha en testmiljö.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Terraform gör det möjligt att skapa nÄgot som kallas en modul, det vill sÀga beskriva samma sak i en specifik mapp.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Och till exempel i testningen kalla pÄ denna modul och fÄ samma resultat som om vi hade utfört Terraform apply i sjÀlva modulen. För testningen kommer koden att se ut sÄ hÀr.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

För produktion kan vi skicka vissa förÀndringar dit, eftersom vi inte behöver stora instanser i testningen, medan stora instanser i produktion Àr precis vad som behövs.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Och framöver kommer jag att ÄtervÀnda till projektet. Det var en komplex uppgift, infrastrukturen planerades att vara mycket stor. Det var nödvÀndigt att organisera all kod sÄ att den var bekvÀm för alla: bÄde för dem som utför underhÄll av denna kod och för dem som gör förÀndringar. Det var planerat att varje utvecklare skulle kunna gÄ in och justera infrastrukturen efter behov för sin del av plattformen.

Detta Àr katalogtrÀdet som rekommenderas av HashiCorp sjÀlvt, om du har ett stort projekt och det Àr meningsfullt att dela upp hela infrastrukturen i mindre delar, och beskriva varje del i en separat mapp.

Med ett omfattande bibliotek av resurser kan man i testningen och produktionen kalla pÄ ungefÀr samma.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

I vÄrt fall passade det inte riktigt, eftersom teststacken för utvecklare eller för testning behövde fÄs pÄ ett enklare sÀtt. Att gÄ igenom mappar och anvÀnda dem i rÀtt ordning, samt oroa sig för att databasen skulle starta, för att sedan starta instansen som anvÀnder denna databas, ville vi inte. DÀrför kördes all testning frÄn en och samma mapp. DÀr anropades samma moduler, men allt genomfördes pÄ en gÄng.

Terraform tar hand om alla beroenden. Och skapar alltid resurser i den ordning som gör att man kan fÄ IP-adressen, till exempel, frÄn den nyskapade instansen, och fÄ den IP-adressen i en route53-post.

Dessutom Àr plattformen vÀldigt stor. Och att köra teststacken, Àven om det bara Àr för en timme eller Ätta timmar, Àr en ganska kostsam affÀr.

Vi automatiserade detta. Jenkins-jobbet gjorde det möjligt att köra stacken. Man behövde starta en pull request med de Àndringar som utvecklaren ville testa, ange alla nödvÀndiga alternativ, komponenter samt storlekar. Om han ville utföra prestandatestning, kunde han ta fler instanser. Om han bara behövde kontrollera att ett formulÀr öppnas, kunde han köra det pÄ minimala instÀllningar. Man kunde ocksÄ ange om en kluster behövdes eller inte, och sÄ vidare.

Och sedan pushade Jenkins ett shell-skript som lite modifierade koden i Terraform-mappen. Det tog bort onödiga filer, lade till nödvÀndiga filer. Och sedan, med ett enda körning, startade Terraform apply stacken.

Och dÀrefter följde andra steg, som jag inte vill gÄ djupare in pÄ.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Eftersom vi behövde lite fler alternativ för testningen Àn i produktion, var vi tvungna att göra kopior av modulerna för att kunna lÀgga till de funktioner som endast behövdes i testningen.

Och sÄ blev det sÄ att i testningen ville man liksom testa de Àndringar som skulle gÄ till produktion. Men i verkligheten testades en sak, medan nÄgot annat tillÀmpades i produktion. Det fanns en liten klyfta, eftersom alla Àndringar i produktion tillÀmpades av driftteamet. Och ibland hÀnde det att de Àndringar som skulle gÄ frÄn testningen till produktion förblev i en annan version.

Utöver detta fanns det ett problem dÀr en ny tjÀnst lades till, som skilde sig nÄgot frÄn en redan befintlig. IstÀllet för att modifiera den existerande modulen fick man göra en kopia av den och lÀgga till nödvÀndiga Àndringar.

I grund och botten Àr Terraform inte ett riktigt sprÄk. Det Àr en deklaration. Om vi behöver deklarera nÄgot, sÄ gör vi det. Och allt detta fungerar.

Vid ett tillfÀlle, nÀr en av mina pull requests diskuterades, sa en kollega att vi inte behövde skapa snöflingor. Jag blev nyfiken pÄ vad han menade. Det finns en vetenskaplig fakta som sÀger att det inte finns tvÄ identiska snöflingor i vÀrlden, de skiljer sig alla lite grann. SÄ snart jag hörde detta kÀnde jag vikten av Terraform-koden. För nÀr det krÀvdes att gÄ frÄn en version till en annan, krÀvde Terraform en breaking chain-Àndring, det vill sÀga att koden inte lÀngre var kompatibel med den nÀsta versionen. Och man behövde göra en pull request som tÀckte nÀstan hÀlften av filerna i infrastrukturen för att föra infrastrukturen till nÀsta version av Terraform.

Och efter att en sÄdan snöflinga dök upp, förvandlades all Terraform-kod vi hade till en stor, stor hög med snö.

För en extern utvecklare, som inte Àr en del av driften, spelar det inte sÄ stor roll, eftersom han gjorde en pull request och hans resurs startade. Och allt, sedan Àr det inte hans bekymmer. Men för DevOps-teamet, som ser till att allt Àr okej, krÀvs det att man gör alla dessa Àndringar. Kostnaden för dessa Àndringar ökade mycket med varje ytterligare snöflinga.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Det finns en historia om en student pÄ ett seminarium som ritade tvÄ perfekta cirklar med krita pÄ tavlan. LÀraren blev förvÄnad över hur han lyckades rita dem sÄ jÀmnt utan passare. Studenten svarade: "Mycket enkelt, jag snurrade en köttkvarn i tvÄ Är i armén."

Och av de fyra Är som jag har deltagit i detta projekt har jag pÄ cirka tvÄ Är sysslat med Terraform. Och sjÀlvklart har jag nÄgra knep, nÄgra tips pÄ hur man kan förenkla Terraform-koden, arbeta med den som ett programmeringssprÄk och minska belastningen pÄ utvecklarna som mÄste hÄlla denna kod uppdaterad.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Det första jag skulle vilja börja med Àr Symlinks. Terraform har mycket upprepande kod. Till exempel, anropet av leverantören sker praktiskt taget vid varje punkt dÀr vi skapar en del av infrastrukturen, det Àr alltid detsamma. DÀrför Àr det logiskt att flytta det till en separat mapp. Och dÀr det krÀvs av leverantören, skapa Symlinks till den hÀr filen.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Till exempel, i produktion anvÀnder ni en assume role som tillÄter er att fÄ Ätkomst till ett externt Amazon-konto. Om ni Àndrar en fil, kommer alla andra som finns i resursstrukturen att ha de nödvÀndiga rÀttigheterna för att Terraform ska veta vilket Amazon-segment det ska ansluta till.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Var fungerar inte Symlinks? Som sagt, i Terraform finns det state-filer. Och de Àr verkligen, verkligen bra. Men grejen Àr att Terraform initierar backend i den allra första fasen. Och det kan inte anvÀnda nÄgra variabler i dessa parametrar, de mÄste alltid skrivas som text.

Och som resultat, nÀr nÄgon skapar en ny resurs, kopierar de en del av koden frÄn andra mappar. Och de kan göra ett misstag med nyckeln eller med bucket. Till exempel, de gör en sandbox-pryl frÄn sandbox, men sen gör de en i produktionen. Och det kan hÀnda att bucket i produktionen kommer att anvÀndas frÄn sandbox. SjÀlvklart kommer det att upptÀckas snabbt. Det kan ÄtgÀrdas pÄ nÄgot sÀtt, men det Àr ÀndÄ en förlust av tid och pÄ ett sÀtt resurser.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Vad kan vi göra hÀrnÀst? Innan vi arbetar med Terraform mÄste vi initiera det. Vid initieringen laddar Terraform ner alla plugins. Vid nÄgot tillfÀlle bröts de frÄn en monolitisk arkitektur till en mer mikrotjÀnstarkitektur. Och det Àr alltid nödvÀndigt att köra Terraform init för att hÀmta alla moduler och alla plugins.

Och vi kan anvÀnda ett shell-script som, för det första, kan hÀmta alla variabler. Shell-scriptet Àr inte begrÀnsat. För det andra, sökvÀgar. Om vi alltid anvÀnder den sökvÀg som finns i repositoryt som nyckel till state-filen, sÄ Àr dÀrför risken för fel eliminerad.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

VarifrÄn fÄr vi data? JSON-fil. Terraform tillÄter att skriva infrastrukturen inte bara i hcl (HashiCorp Configuration Language), utan Àven i JSON.

JSON Àr lÀtt att lÀsa frÄn shell-scriptet. DÀrför kan vi placera en konfigurationsfil med bucket pÄ nÄgot stÀlle. Och anvÀnda denna bucket bÄde i Terraform-koden och i shell-scriptet för initiering.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Varför Àr det viktigt att ha en bucket för Terraform? För att det finns nÄgot som kallas remote state-filer. Det vill sÀga, nÀr jag skapar en resurs mÄste jag, för att sÀga till Amazon: "Skapa gÀrna en instans", ange mÄnga obligatoriska parametrar.

Och dessa identifierare lagras i en annan mapp. Jag kan sÀga: "Terraform, gÄ snÀlla till state-filen för den aktuella resursen och hÀmta dessa identifierare Ät mig." PÄ sÄ sÀtt blir det en slags enhetlighet mellan olika regioner eller miljöer.

Det Àr inte alltid möjligt att anvÀnda en fjÀrrstate-fil. Till exempel, om du har skapat en VPC manuellt. Och den Terraform-kod som skapar VPC:n skapar en sÄ pass olik VPC att det tar lÄng tid och krÀvs mÄnga justeringar för att fÄ det att fungera, dÀrför kan man anvÀnda följande lösning.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Det vill sÀga att göra en modul som pÄ nÄgot sÀtt skapar en VPC och ger dig identifierarna, men i sjÀlva verket Àr det bara en fil med hÄrdkodade vÀrden som kan anvÀndas för att skapa samma instans.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Det Àr inte alltid nödvÀndigt att spara state-filen i molnet. Till exempel nÀr moduler testas kan man anvÀnda backend-initialisering, dÀr filen sparas bara pÄ disken under testningen.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Lite om testning nu. Vad kan man testa i Terraform? Förmodligen mycket, men jag kommer att prata om dessa 4 saker.

HashiCorp har en viss förstÄelse för hur Terraform-koden ska formateras. Terraform fmt lÄter dig formatera koden du redigerar enligt denna standard. DÀrför mÄste testerna absolut verifiera om formateringen stÀmmer överens med vad HashiCorp har föreskrivit, sÄ att du inte behöver Àndra placeringen av parenteser osv.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

NĂ€sta Ă€r Terraform validate. Det gör lite mer Ă€n bara syntaktisk kontroll – typ, Ă€r alla parenteser parvisa. Vad Ă€r viktigt hĂ€r? VĂ„r infrastruktur Ă€r ganska omfattande. Det finns mĂ„nga olika mappar, och i varje mĂ„ste Terraform validate köras.

För att pÄskynda testningen kör vi flera processer parallellt.

Parallell Àr en riktigt bra grej, anvÀnd den.

Men varje gÄng Terraform initieras gÄr den till HashiCorp och frÄgar: "Vilka Àr de senaste versionerna av pluggarna? Och den plugin jag har i cache - Àr den aktuell eller inte?". Och detta innebÀr en försening vid varje steg.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Om man talar om för Terraform var pluggarna finns, sÀger Terraform: "Okej, det hÀr Àr antagligen den senaste versionen. Jag behöver inte gÄ nÄgonstans, jag börjar direkt validera din Terraform-kod."

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

För att fylla mappen med nödvÀndiga pluggar har vi en mycket enkel Terraform-kod som bara behöver initieras. HÀr mÄste man sjÀlvklart ange alla leverantörer som pÄ nÄgot sÀtt Àr involverade i din kod, annars sÀger Terraform: "Jag kÀnner inte till nÄgon leverantör eftersom den inte finns i cachen."

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

NÀsta steg Àr Terraform plan. Som nÀmnt, utveckling Àr cyklisk. Vi gör kod med Àndringar. Och sedan mÄste vi ta reda pÄ vilka Àndringar som planeras pÄ infrastrukturen.

Och nÀr infrastrukturen Àr vÀldigt, vÀldigt stor, kan man Àndra en modul, fixa en testmiljö eller en specifik region och bryta nÄgot nÀrliggande. DÀrför bör Terraform plan göras för hela infrastrukturen och visa vilka Àndringar som Àr planerade.

Detta kan göras smart. Vi har till exempel skrivit ett script pÄ Python som löser beroenden. Beroende pÄ vad som har Àndrats: Terraform-modulen eller bara en specifik komponent, gör det planer för alla beroende mappar.

Terraform plan bör göras pĂ„ begĂ€ran. Åtminstone Ă€r det vad vi gör.

Tester Àr sjÀlvklart bra att göra för varje förÀndring, för varje commit, men planer Àr ganska kostsamma. Och i pull request sÀger vi: "VÀnligen ge mig planer". En robot sÀtts igÄng. Och den skickar i kommentarer eller som bifogade filer alla planer som förvÀntas frÄn dina Àndringar.

Planen Àr en ganska kostsam process. Den tar tid eftersom Terraform gÄr till Amazon och frÄgar: "Finns denna instans fortfarande? Har denna autoskalexakt dessa parametrar?". Och för att snabba pÄ processen kan man anvÀnda parametern refresh=false. Det innebÀr att Terraform kommer att hÀmta state frÄn S3. Och kommer att tro att state exakt motsvarar det som finns i Amazon.

En sÄdan Terraform-plan gÄr mycket snabbare, men tillstÄndet mÄste motsvara din infrastruktur, dvs. nÄgonstans, nÄgon gÄng mÄste Terraform refresh köras. Terraform refresh gör just det, sÄ att tillstÄndet stÀmmer överens med vad som finns i den verkliga infrastrukturen.

Och det Àr viktigt att nÀmna sÀkerhet. Det Àr hÀr man borde börja. DÀr du kör Terraform, och Terraform arbetar med din infrastruktur, finns det en sÄrbarhet. Det vill sÀga, du kör i grunden kod. Och om pull requesten innehÄller nÄgon skadlig kod, kan den köras pÄ en infrastruktur som har för mycket Ätkomst. SÄ var försiktig med var du kör Terraform-planen.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

NÀsta sak jag vill prata om Àr testning av user-data.

Vad Ă€r user-data? I Amazon, nĂ€r vi skapar en instans, kan vi skicka nĂ„got slags meddelande med instansen – metadata. NĂ€r instansen startas finns vanligtvis cloud init alltid pĂ„ dessa instanser. Cloud init lĂ€ser detta meddelande och sĂ€ger: "Okej, idag Ă€r jag - load balancer". Och i enlighet med dessa instruktioner utför det vissa Ă„tgĂ€rder.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Men tyvÀrr, nÀr vi gör Terraform-plan och Terraform-tillÀmpning, ser user-data ut som en sorts gröt av siffror. Det vill sÀga, det skickar bara en hash. Och allt du kan se i planen Àr om det kommer att ske nÄgra förÀndringar eller om hashen förblir densamma.

Och om man inte uppmÀrksammar detta kan ett skadat textdokument hamna pÄ Amazon, pÄ den verkliga infrastrukturen.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Som ett alternativ kan man ange inte hela infrastrukturen vid körning, utan endast mallen. Och i koden sÀga: "Var snÀll och skriv ut denna mall för mig". Och slutligen kan man fÄ en utskrift av hur dina data kommer att se ut pÄ Amazon.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Ett annat alternativ Ă€r att anvĂ€nda en modul för att generera user-data. Du tillĂ€mpar denna modul. FĂ„r en fil pĂ„ disken. JĂ€mför den med referensen. Och pĂ„ sĂ„ sĂ€tt, om nĂ„gon junior beslutar sig för att justera user-data lite, kommer dina tester att sĂ€ga: "Okej, hĂ€r och hĂ€r Ă€r nĂ„gra förĂ€ndringar – det Ă€r okej".

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

NÀsta sak jag vill prata om Àr att automatisera Terraform-tillÀmpning.

SjÀlvklart Àr det ganska skrÀmmande att göra Terraform-tillÀmpning automatiskt, för vem vet vilka Àndringar som kommit och hur förödande de kan vara för den levande infrastrukturen.

För testmiljön – Ă€r detta helt okej. Det vill sĂ€ga, jobben som skapar testmiljön Ă€r nĂ„got som alla utvecklare behöver. Och ett uttryck som "jag har allt fungerande" Ă€r inte ett skĂ€mt, utan ett bevis pĂ„ att personen har brytt sig, har satt upp stacken, kört tester pĂ„ denna stack och har sĂ€kerstĂ€llt att allt Ă€r okej och sagt: "Okej, den koden jag slĂ€pper har testats."

I produktion, sandbox och andra miljöer som Àr viktigare för affÀren kan man delvis tillÀmpa vissa resurser ganska sÀkert, eftersom det inte leder till att nÄgon dör. Det handlar om: autoscale-grupper, sÀkerhetsgrupper, roller, route53 och dÀr listan kan bli ganska stor. Men hÄll ett öga pÄ vad som hÀnder och lÀs rapporter om automatiska tillÀmpningar.

DÀr det Àr farligt eller lÀskigt att tillÀmpa, till exempel om det handlar om resurser med persistent, med databaser, ska ni fÄ rapporter om att det finns oanvÀnda Àndringar i nÄgot stycke av infrastrukturen. Ingenjören fÄr sedan genom övervakning starta jobs för att tillÀmpa eller gör det frÄn sin konsol.

I Amazon finns det nÄgot som kallas Terminate protection. Och det kan skydda er i vissa fall frÄn oönskade Àndringar. Det vill sÀga, Terraform gÄr till Amazon och sÀger: "Jag behöver döda denna instans för att skapa en annan." Men Amazon svarar: "TyvÀrr, inte idag. Vi har Terminate protection aktiverat."

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Och grĂ€dden pĂ„ moset – Ă€r kodoptimering. NĂ€r vi arbetar med Terraform-kod mĂ„ste vi överföra ett mycket stort antal parametrar till modulen. Det Ă€r de parametrar som behövs för att skapa en viss resurs. Och koden blir till stora listor av parametrar som mĂ„ste överföras frĂ„n modul till modul, sĂ€rskilt om modulerna Ă€r inbĂ€ddade.

Och det Àr mycket svÄrt att lÀsa. Det Àr mycket svÄrt att göra granskning. Och det hÀnder ofta att vissa parametrar gÄr igenom granskningen och de Àr inte helt de som behövs. Och det kostar tid och pengar att ÄtgÀrda det senare.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

DÀrför föreslÄr jag att ni anvÀnder nÄgot som kallas komplex parameter som inkluderar en slags trÀddiagram av vÀrden. Det vill sÀga, ni behöver en mapp dÀr ni anger alla vÀrden som ni skulle vilja ha pÄ nÄgon miljö.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Och genom att anropa denna modul kan man fÄ ett trÀd som genereras i en gemensam modul, det vill sÀga i en gemensam modul som fungerar lika för hela infrastrukturen.

I denna modul kan du göra vissa berÀkningar, med hjÀlp av en ny funktion i Terraform som kallas locals. Och sedan kan du genom en output ge nÄgot komplext parameter som kan inkludera hash, arrayer och sÄ vidare.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Det Ă€r allt för de bĂ€sta insikterna jag har. Jag skulle ocksĂ„ vilja berĂ€tta en historia om Columbus. NĂ€r han sökte pengar för sin expedition för att upptĂ€cka Indien (som han dĂ„ trodde), trodde ingen pĂ„ honom och de ansĂ„g det vara omöjligt. DĂ„ sa han: "FĂ„ Ă€gget att inte ramla." Alla bankirer, mycket rika och förmodligen smarta mĂ€nniskor, försökte pĂ„ nĂ„got sĂ€tt stĂ€lla Ă€gget upp, men det föll hela tiden. DĂ„ tog Columbus Ă€gget, tryckte lite pĂ„ det. Det sprack och Ă€gget stod still. De sa: "Åh, det hĂ€r Ă€r för enkelt!". Och Columbus svarade: "Ja, det Ă€r för enkelt. Och nĂ€r jag upptĂ€cker Indien, kommer alla att anvĂ€nda denna handelsvĂ€g."

Det jag just berÀttade för er Àr nog tillrÀckligt enkla och triviala saker. Och nÀr du lÀr dig om dem och börjar anvÀnda dem Àr det helt okej. SÄ anvÀnd dem. Och om dessa Àr helt normala för dig, sÄ vet du Ätminstone hur man stÀller Àgget sÄ att det inte ramlar.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

LÄt oss sammanfatta:

  • Försök att undvika snöflingor. Ju fĂ€rre snöflingor, desto mindre resurser behöver du för att göra nĂ„gra förĂ€ndringar i hela din stora infrastruktur.
  • Kontinuerliga förĂ€ndringar. Det vill sĂ€ga nĂ€r det har skett förĂ€ndringar i koden, bör du sĂ„ snabbt som möjligt föra din infrastruktur i linje med dessa förĂ€ndringar. Det ska inte finnas situationer dĂ€r nĂ„gon kommer om tvĂ„ eller tre mĂ„nader för att kolla pĂ„ Elasticsearch, gör Terraform plan, och det finns en massa förĂ€ndringar som de inte förvĂ€ntade sig. Och det tar vĂ€ldigt mycket tid att fĂ„ allt tillbaka i ordning.
  • Tester och automatisering. Ju mer din kod Ă€r tĂ€ckt av tester och funktioner, desto mer Ă€r du sĂ€ker pĂ„ att du gör allt rĂ€tt. Och automatisk leverans ökar din sĂ€kerhet flera gĂ„nger.
  • Koden för test- och produktionsmiljöer bör vara praktiskt taget identiska. Praktiskt taget, eftersom produktion Ă€ndĂ„ Ă€r lite annorlunda och det alltid kommer att finnas nĂ„gra nyanser som gĂ„r utanför testmiljön. Men Ă€ndĂ„ kan detta sĂ€kerstĂ€llas med plus-minus.
  • Och om ni har vĂ€ldigt mycket Terraform-kod och det krĂ€vs mycket tid för att hĂ„lla denna kod aktuell, sĂ„ Ă€r det aldrig för sent att göra refactoring och fĂ„ den i ett bra skick.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

  • Immutable infrastructure. Leverans av AMI enligt schema.
  • Struktur för route53, nĂ€r ni har mĂ„nga poster och vill att de ska vara i ordnad ordning.
  • Kamp mot API rate limits. Det Ă€r nĂ€r Amazon sĂ€ger: "Alla, jag kan inte ta emot fler förfrĂ„gningar, vĂ€nligen vĂ€nta." Och halva företaget vĂ€ntar tills de kan starta sin infrastruktur.
  • Spotinstanser. Amazon Ă€r inte billigt och spots gör det möjligt att spara ganska mycket. Man kan hĂ„lla ett helt föredrag om detta.
  • SĂ€kerhet och IAM roller.
  • Sökning efter förlorade resurser, nĂ€r ni har instanser i Amazon av okĂ€nt ursprung, de kostar pengar. Även om en instans kostar 100-150 dollar i mĂ„naden – per Ă„r blir det över 1 000. Att hitta sĂ„dana resurser Ă€r en lönsam uppgift.
  • Och reserverade instanser.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrykin (Ixtens)

Det Àr allt för mig. Terraform Àr riktigt fantastiskt, anvÀnd det. Tack!

FrÄgor

Tack för föredraget! Er state-fil ligger i S3, hur hanterar ni problemet med att flera personer kan ta den state-filen och försöka göra en deployment?

För det första, vi har ingen brÄdska. För det andra, vi har flaggor dÀr vi meddelar att vi arbetar med en viss del av koden. Det vill sÀga, trots att infrastrukturen Àr mycket stor, betyder det inte att nÄgon stÀndigt tillÀmpar nÄgot. Under den aktiva fasen var det ett problem, vÄra state-filer lagrades i Git. Det var viktigt, annars skapade nÄgon en state-fil och vi fick manuellt samla dem för att allt skulle fortsÀtta. Denna problematik finns inte lÀngre. Faktum Àr att Terraform har löst denna uppgift. Och om nÄgot stÀndigt förÀndras kan man anvÀnda lÄs som förhindrar det du nÀmnde.

AnvÀnder ni den öppna versionen eller enterprise?

Ingen enterprise, det vill sÀga allt som kan hÀmtas gratis.

Jag heter Stanislav. Jag ville göra en liten tillÀgg. Ni berÀttade om en funktion frÄn Amazon som gör att instansen blir oförstörbar. Det finns Àven i Terraform, dÀr man i blocket Life Second kan skriva en förbud mot Àndringar, eller ett förbud mot förstörelse.

Jag hade begrÀnsad tid. Bra observation.

Jag ville ocksÄ frÄga om tvÄ saker. För det första, ni berÀttade om tester. Har ni anvÀnt nÄgra verktyg för testning? Jag har hört talas om pluginet Test Kitchen. Finns det nÄgot annat? Och jag skulle ocksÄ vilja frÄga om Local Values. Hur skiljer de sig i grund och botten frÄn Input Variables? Och varför kan jag inte parametrera nÄgot enbart genom Local Values? Jag har försökt förstÄ detta Àmne, men jag har inte riktigt lyckats.

Vi kan prata mer detaljerat om detta efter rummet. Testverktygen Àr helt egenutvecklade. Det finns inget sÀrskilt dÀr för att genomföra tester. Generellt finns det alternativ dÀr automatiserade tester skapar infrastruktur nÄgonstans, kontrollerar att den Àr okej, och sedan tar bort allt med en rapport som visar att er infrastruktur fortfarande Àr i bra form. Vi har inte det, eftersom teststaplar körs varje dag. Och det Àr tillrÀckligt. Om nÄgot börjar gÄ fel sÄ kommer det att börja falla sönder utan att vi behöver kontrollera det nÄgon annanstans.

Vad gÀller Local Values, lÄt oss fortsÀtta samtalet efter rummet.

Hej! Tack för presentationen! Mycket lÀrorikt. Du nÀmnde att ni har mycket enhetlig kod för att beskriva infrastrukturen. Har ni övervÀgt att generera denna kod?

Bra frÄga, tack! Saken Àr den att nÀr vi anvÀnder infrastruktur som kod, antar vi att vi tittar pÄ koden och förstÄr vilken infrastruktur som ligger bakom den. Om koden genereras, behöver vi förestÀlla oss vilken kod som kommer att genereras för att förstÄ vilken infrastruktur som kommer att finnas dÀr. Antingen genererar vi koden, commitar den, och i praktiken fÄr vi samma sak. DÀrför gick vi den vÀg vi har skrivit, det fick vi ut. Plus att generatorer kom nÄgot senare, nÀr vi började med detta. Och det var för sent att Àndra.

Har du hört nÄgot om jsonnet?

Nej.

Kolla, det Àr en riktigt hÀftig grej. Jag ser ett specifikt fall dÀr det kan tillÀmpas och generera datastruktur.

Generatorer Àr bra, nÀr man har det som i skÀmtet om rakhyveln. Det vill sÀga, första gÄngen ser ansiktena olika ut, men sen har alla samma ansikte. Generatorer fungerar vÀldigt bra. Men tyvÀrr har vi lite olika ansikten. Det Àr ett problem.

Bara titta. Tack!

Jag heter Maxim, jag kommer frĂ„n Sberbank. Du berĂ€ttade lite om att du försökte göra Terraform till en motsvarighet till ett programmeringssprĂ„k. Är det inte enklare att anvĂ€nda Ansible?

Det Àr vÀldigt olika saker. Man kan bÄde skapa resurser med Ansible och Puppet i Amazon. Men Terraform Àr verkligen anpassat för det.

Har ni bara Amazon?

Det handlar inte om att vi bara har Amazon. Vi har nÀstan bara Amazon. Men den nyckelfunktion som Terraform har Àr att det kommer ihÄg. I Ansible, om man sÀger: "Starta 5 instanser", sÄ startar den dem, och sen sÀger du: "Nu behöver jag 3." Och Terraform sÀger: "Okej, jag tar bort 2", medan Ansible sÀger: "Okej, hÀr Àr 3." Totalt blir det 8.

Hej! Tack för din presentation! Det var mycket intressant att höra om Terraform. Jag vill genast ge en liten kommentar angÄende att Terraform trots allt inte har en stabil release, sÄ var försiktig med Terraform.

En sked Àr bra till lunchen. Det vill sÀga, om du behöver en lösning sÄ skjuter du ibland upp det som Àr instabilt och sÄ vidare, men det fungerar och det har hjÀlpt oss.

Jag har en frÄga. Ni anvÀnder en remote backend, ni anvÀnder S3. Varför anvÀnder ni inte den officiella backend?

Officiell?

Terraform Cloud.

NĂ€r kom den?

För cirka 4 mÄnader sedan.

Om den hade kommit för 4 Är sedan, sÄ skulle jag troligen ha svarat pÄ din frÄga.

DÀr finns redan en inbyggd funktion och lÄs, och man kan lagra state-filen. Testa det. Men jag har inte testat det heller.

Vi Äker i ett stort tÄg som rör sig i hög hastighet. Man kan inte bara ta och kasta ut nÄgra vagnar.

Du pratade om snöflingor, varför anvÀnde du inte branch? Varför gick det inte att göra sÄ?

Vi har den instÀllningen att hela infrastrukturen finns i ett repositorium. Terraform, Puppet, alla skript som pÄ nÄgot sÀtt Àr relaterade till detta, de ligger alla i ett repositorium. PÄ sÄ sÀtt kan vi garantera att inkrementella Àndringar testas en i taget. Om det hade varit en massa branches sÄ skulle ett sÄdant projekt vara praktiskt taget omöjligt att underhÄlla. Det gÄr sex mÄnader och de skiljer sig sÄ mycket att det blir ett rent straff. Det Àr det som jag ville fly ifrÄn innan refaktoreringen.

Det vill sÀga, det fungerar inte?

Det hÀr fungerar överhuvudtaget inte.

I branch har jag tagit bort slide-mappen. Det vill sĂ€ga, om man gör en mapp för varje teststack, till exempel, team A – de har sin egen mapp, team B har sin egen mapp, sĂ„ fungerar inte det heller. Vi har gjort en enhetlig kod för testmiljön som var tillrĂ€ckligt flexibel för att passa alla. Det vill sĂ€ga, vi underhöll en kod.

Hej! Jag heter Jura! Tack för presentationen! Jag har en frÄga om moduler. Ni sÀger att ni anvÀnder moduler. Hur hanterar ni situationen om nÄgon gör Àndringar i en modul som inte Àr kompatibla med nÄgon annans Àndringar? Versionerar ni moduler eller försöker ni fÄ dem att passa bÄda kraven?

Det hÀr Àr ett problem med en stor snöskala. Det Àr nÄgot vi lider av nÀr en till synes ofarlig Àndring kan bryta en del av infrastrukturen. Och det kommer bara att mÀrkas efter en viss tid.

Det vill sÀga, Àr det fortfarande olöst?

Ni gör universella moduler. Undvik snöflingor. Och allt kommer att fungera. Den andra delen av presentationen handlar om hur man undviker det.

Hej! Tack för presentationen! Jag skulle vilja klargöra en sak. Bakom kulisserna finns en stor hög, som jag kom hit för. Hur Àr Puppet och rollutdelning integrerade?

User-data.

Det vill sÀga, spottar ni bara ut en fil och utför pÄ nÄgot sÀtt enligt den?

User-data Àr en anteckning, det vill sÀga, nÀr vi skapar en klon av en bild, sÄ startar en daemon och försöker förstÄ vem den Àr, lÀser anteckningen att den Àr en load balancer.

Det vill sÀga, Àr det en separat process som överlÀmnas?

Vi uppfann inte det. Vi anvÀnder det.

Hej! Jag har precis en frÄga om User-data. Ni nÀmnde att det finns problem, att nÄgon kan skicka nÄgot felaktigt. Finns det nÄgot sÀtt att lagra user-data i samma Git, sÄ att det alltid Àr klart vad som refereras av User-data?

Vi genererar User-data frÄn template. Det vill sÀga, det kommer in ett antal variabler. Och Terraform genererar det slutgiltiga resultatet. DÀrför kan man inte bara titta pÄ template och sÀga vad som kommer att hÀnda, eftersom alla problem beror pÄ att utvecklaren tror att han skickar en strÀng i den hÀr variabeln, men istÀllet kommer en array. Och sÄ har han - plötsligt och jag - den, den, nÀsta rad, och allt kraschar. Om det Àr en ny resurs och nÄgon bygger upp den, ser att nÄgot inte fungerar, sÄ kan det snabbt lösas. Men om det Àr en autoskalningsgrupp som har uppdaterats, dÄ kan instanserna i autoskalningsgruppen börja bytas ut. Och plötsligt fungerar inte nÄgot. Det Àr frustrerande.

SÄ det enda lösningen Àr att testa?

Ja, du ser problemet, du lÀgger till teststeg. Det vill sÀga, output kan ocksÄ testas. Kanske inte sÄ bekvÀmt, men du kan ocksÄ sÀtta vissa markörer - kontrollera att User-data Àr ordentligt fÀst hÀr.

Jag heter Timur. Det Àr vÀldigt bra att det finns förelÀsningar om hur man organiserar Terraform korrekt.

Jag har inte ens börjat.

Jag tror att det kommer att vara pÄ nÀsta konferens. Jag har en enkel frÄga. Varför hÄrdkodifierar ni vÀrdet i en separat modul, istÀllet för att anvÀnda tfvars, det vill sÀga, vad gör en modul med vÀrden bÀttre Àn tfvars?

Det vill sĂ€ga, jag hĂ€r (bild: Production/environment/settings.tf) ska skriva: domain = variabel, domain vpcnetwork, variabel vpcnetwork och stvars – hĂ€mta samma sak?

Vi gör precis sÄ. Vi refererar till modulens instÀllningskÀlla, till exempel.

I princip Àr det en tfvars. Tfvars Àr mycket praktiska i testmiljöer. Jag har tfvars för stora instanser, för smÄ. Och jag la en fil i mappen. Och fick det jag ville ha. NÀr vi bygger infrastruktur vill vi kunna se och genast förstÄ allt. Men det blir sÄ att man mÄste titta hÀr, sedan titta pÄ tfvars.

SÄ allt ska vara pÄ ett stÀlle?

Ja, tfvars Ă€r nĂ€r ni har en kod. Och den anvĂ€nds pĂ„ flera olika stĂ€llen med olika nyanser. DĂ„ skulle ni ha skickat tfvars och fĂ„tt era nyanser. Och vi – det Ă€r infrastruktur som kod i sin renaste form. Tittade och förstod.

Hej! Har du rÄkat ut för situationer dÀr molnleverantören blandar sig i det du gjort med Terraform? Anta att vi Àndrar metadata. Det finns ssh-nycklar dÀr. Och Google lÀgger stÀndigt in sina egna metadatanoteringar och nycklar. Och Terraform sÀger alltid att det finns förÀndringar. Efter varje körning, Àven om ingenting har förÀndrats, sÀger det alltid att det ska uppdatera det fÀltet.

Med nycklarna, men – ja, en del av infrastrukturen pĂ„verkas av detta, alltsĂ„ kan Terraform inte Ă€ndra nĂ„gonting. Vi kan inte Ă€ndra nĂ„gonting manuellt heller. Vi lever med detta.

AlltsÄ har ni stött pÄ detta, men har inte hittat nÄgon lösning, det kör pÄ och pÄ av sig sjÀlv?

TyvÀrr, ja.

Hej! Jag heter Starkov Stanislav. Mail.ru Group. Hur löser ni problemet med att generera taggen pÄ ..., hur överför ni den inuti? Jag förstÄr det som att ni anvÀnder User-data för att ange hostnamn, och styr Puppet? Och den andra delen av frÄgan. Hur hanterar ni denna frÄga i SG, alltsÄ nÀr ni genererar SG, hundra identiska instanser, hur namnger ni dem korrekt?

De instanser som Àr mycket viktiga för oss namnger vi vackert. De som inte behövs fÄr en tillÀggsnamn som indikerar att det Àr en autoscale-grupp. Och i teorin kan de tas bort för att skapa en ny.

NÀr det gÀller problematiken med taggar sÄ Àr det inte ett problem utan ett behov. Och vi anvÀnder taggar vÀldigt, vÀldigt mycket eftersom infrastrukturen Àr stor och dyr. Vi behöver se vart pengarna gÄr, sÄ taggarna gör att vi kan spÄra vad och vart vÄra kostnader gÄr. Och i sin tur hjÀlper det oss att leta efter var för mycket pengar spenderas.

Vad var frÄgan om igen?

NÀr SG skapar hundra instanser, behöver de sÀrskiljas pÄ nÄgot sÀtt?

Nej, det behövs inte. Varje instans har en agent som rapporterar om problem. Om agenten rapporterar sÄ vet agenten om det och Ätminstone finns IP-adressen. Redan nu kan man kolla upp. För det andra anvÀnder vi Consul för Discovery, dÀr vi inte har Kubernetes. Och Consul visar ocksÄ IP-adressen för instansen.

AlltsÄ, ni orienterar er efter IP, inte hostnamn?

Det Ă€r omöjligt att orientera sig efter hostnamn, det finns för mĂ„nga. Det finns instansidentifierare – AE m.fl. Man kan hitta den nĂ„gonstans, kan slĂ€nga in den i sökningen.

Hej! Jag förstÄr att Terraform Àr en bra grej, anpassad för moln.

Inte bara.

Denna frÄga intresserar mig. Om du bestÀmmer dig för att flytta, lÄt oss sÀga, till Bare Metal massivt med alla dina instanser? Kommer det inte att uppstÄ nÄgra problem? Eller mÄste man ÀndÄ anvÀnda andra produkter, som den nÀmnda Ansible?

Ansible handlar lite om nĂ„got annat. Det vill sĂ€ga, Ansible fungerar nĂ€r instansen har startat. Terraform fungerar innan instansen har startat. ÖvergĂ„ngen till Bare Metal – nej.

Just nu nej, men företaget kan komma och sÀga: "Vi gör det".

ÖvergĂ„ng till en annan molnleverantör – ja, men hĂ€r Ă€r det en annan grej. Man mĂ„ste skriva Terraform-kod pĂ„ ett sĂ€tt sĂ„ att man kan byta till nĂ„got annat moln med mindre arbete.

I början var mÄlet att vÄr infrastruktur skulle vara agnostisk, det vill sÀga att vilket moln som helst skulle fungera, men vid nÄgot tillfÀlle gav företaget upp och sa: "Okej, under de kommande N Ären kommer vi inte att flytta nÄgonstans, vi kan anvÀnda tjÀnster frÄn Amazon".

Terraform gör det möjligt att skapa Front-End-jobb, konfigurera PagerDuty, data-dokument etc. Det har mÄnga olika funktioner. Det kan praktiskt taget kontrollera hela vÀrlden.

Tack för presentationen! Jag har ocksÄ arbetat med Terraform i fyra Är. Under den gradvisa övergÄngen till Terraform, till infrastrukturen, till deklarativ beskrivning, stötte vi pÄ situationer dÀr nÄgon gjorde saker manuellt, och du försökte skapa en plan. Och fick ett fel. Hur hanterar ni sÄdana problem? Hur hittar ni de förlorade resurser som har angetts?

FrÀmst manuellt och visuellt, om vi ser nÄgot konstigt i rapporten, analyserar vi vad som pÄgÄr, eller sÄ tar vi helt enkelt bort det. Det Àr faktiskt vanligt med pull requests.

Om det finns ett fel, gör ni en rollback? Har ni försökt med det?

Nej, det Àr en mÀnniskas beslut i stunden nÀr han ser ett problem.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster