Att representera infrastruktur som kod i ett reproducerbart textformat Àr en enkel, bÀsta praxis för system som inte behöver knÄdas. Denna praxis har fÄtt namnet - , och hittills finns det tvÄ populÀra verktyg för att genomföra detta, sÀrskilt i AWS: och .

Jag jÀmför erfarenheten av att arbeta med Terraform och CloudFormation
Innan jag kom till (Àven kÀnd som ) arbetade jag och i tre Är anvÀnde jag Terraform. PÄ min nya arbetsplats anvÀnde jag ocksÄ Terraform friskt, men senare pressade företaget införandet av allt som liknade Amazon, inklusive CloudFormation. Jag utvecklade noggrant bÀsta praxis för bÄde och anvÀnde bÄda verktygen i mycket komplexa arbetsflöden pÄ organisationsnivÄ. Efter att ha övervÀgt konsekvenserna av att gÄ frÄn Terraform till CloudFormation insÄg jag att Terraform antagligen Àr det bÀsta valet för organisationen.
Terraform SkrÀmmande
Beta-version av mjukvara
Terraform har inte ens lanserat version 1.0 Àn, och det Àr en god anledning att inte anvÀnda det. Sedan jag först testade det har det förÀndrats mycket, men dÄ var det fortfarande terraform apply ofta trasigt efter nÄgra uppdateringar eller bara efter ett par Ärs anvÀndning. Jag skulle sÀga att 'nu Àr allt annorlunda', men... sÄ verkar alla sÀga, eller hur? Det finns förÀndringar som Àr inkompatibla med tidigare versioner, Àven om de Àr rimliga, och till och med en kÀnsla av att syntax och abstraktioner av resurslagring nu Àr precis vad de ska vara. Verktyget verkar verkligen ha blivit bÀttre, men... :-0
à andra sidan har AWS gjort ett bra jobb med att stödja bakÄtkompatibilitet med tidigare versioner. Förmodligen dÀrför att deras tjÀnster ofta testas ordentligt internt innan de publiceras under ett nytt namn. SÄ det Àr en underdrift att sÀga att de 'gjorde ett bra jobb'. Att upprÀtthÄlla bakÄtkompatibilitet med tidigare API-versioner för ett sÄ mÄngfacetterat och komplext system som AWS Àr otroligt svÄrt. Alla som har behövt underhÄlla offentliga API:er som anvÀnds sÄ brett vet hur svÄrt detta Àr att göra under sÄ mÄnga Är. Men CloudFormations beteende har under min tid aldrig förÀndrats genom Ären.
HÀlsning, fot... detta Àr en kula
SÄvitt jag vet gÄr det inte att ta bort en resurs frÄn tredje part Att importera en CloudFormation-stapel frÄn sin egen CF-stapel Àr omöjligt. Det Àr i princip samma sak med Terraform. Det tillÄter import av befintliga resurser till sin stapel. Funktionen Àr, kan man sÀga, fantastisk, men med stor makt kommer stort ansvar. SÄ fort du lÀgger en resurs i stapeln, kan du inte ta bort eller Àndra den resursen medan du arbetar med din stapel. En gÄng fick vi kÀnna av konsekvenserna. NÄgon pÄ Twitch, som inte hade nÄgot ont i sinnet, av misstag importerade nÄgon annans AWS-sÀkerhetsgrupp till sin egen Terraform-stapel. Han skrev nÄgra kommandon och⊠sÀkerhetsgruppen (tillsammans med den inkommande trafiken) försvann.
Terraform Stor
à terstÀllning frÄn ofullstÀndiga tillstÄnd
Ibland kan CloudFormation inte helt övergĂ„ frĂ„n ett tillstĂ„nd till ett annat. I sĂ„ fall försöker det Ă„tergĂ„ till det föregĂ„ende. TyvĂ€rr Ă€r det inte alltid möjligt. Att felsöka det som uppstĂ„tt kan vara ganska skrĂ€mmande â man vet aldrig om CloudFormation kommer att bli glad av att bli 'hackad' â Ă€ven om det Ă€r för reparation. Och om det verkligen gĂ„r att Ă„tergĂ„ till det föregĂ„ende tillstĂ„ndet vet det inte riktigt, och som standard hĂ€nger det i timmar i vĂ€ntan pĂ„ ett mirakel.
Terraform tvÀrt om har en tendens att ÄterhÀmta sig efter misslyckade övergÄngar pÄ ett mer elegant sÀtt och erbjuder ett utökat felsökningsverktyg.
Tydligare Àndringar i dokumentets tillstÄnd
«Okej, lastbalanserare, du förÀndras. Men hur?»
â orolig ingenjör, redo att trycka pĂ„ knappen «acceptera».
Ibland behöver jag göra vissa manipulationer med lastbalanseraren i CloudFormation-stapeln â till exempel lĂ€gga till ett portnummer eller Ă€ndra sĂ€kerhetsgruppen. CloudFormation visar förĂ€ndringar svagt. Jag, Ă„ sin sida, gĂ„r pĂ„ nĂ„lar och dubbelkollar yaml-filen tio gĂ„nger för att försĂ€kra mig om att jag inte raderar nĂ„got nödvĂ€ndigt eller lĂ€gger till nĂ„got onödigt.
Terraform Ă€r mycket mer transparent i detta avseende. Ibland Ă€r den till och med för transparent (lĂ€s: irriterande). Som tur Ă€r, har den senaste versionen förbĂ€ttrat visningen av Ă€ndringar â nu syns det tydligt vad som förĂ€ndras.
Flexibilitet
Skriv mjukvara baklÀnges.
Ărligt talat, den viktigaste kĂ€nnetecknen för lĂ„nglivat mjukvara Ă€r dess förmĂ„ga att anpassa sig till förĂ€ndringar. Skriv alltid programvara baklĂ€nges. Jag har oftast kört fast med den 'enkla' tjĂ€nsten, bara för att senare försöka pressa allt in i en enda CloudFormation- eller Terraform-stack. Och naturligtvis, efter mĂ„nader, visade det sig att jag hade förstĂ„tt allt fel, och tjĂ€nsten var faktiskt inte enkel! Nu behöver jag pĂ„ nĂ„got sĂ€tt dela upp den stora stacken i mindre bestĂ„ndsdela. NĂ€r man arbetar med CloudFormation Ă€r det möjligt att göra det endast efter att ha Ă„terskapat den existerande stacken, vilket jag, med mina databaser, inte gör. Terraform Ă„ sin sida gjorde det möjligt att dissekera stacken och dela upp den i mer begripliga mindre delar.
Moduler i git
Att dela Terraform-kod mellan flera stackar Àr mycket enklare Àn att dela CloudFormation-kod. Med Terraform kan man placera koden i ett git-repo och referera till den med hjÀlp av semantisk versionskontroll. Alla som har Ätkomst till detta repo kan ÄteranvÀnda den delade koden. Motsvarigheten i CloudFormation Àr S3, men den har inte samma fördelar, och det finns ingen anledning att överge git till förmÄn för S3.
Organisationen vÀxte och förmÄgan att dela gemensamma stackar nÄdde en kritisk nivÄ. Med Terraform gÄr detta enkelt och naturligt, medan CloudFormation fÄr dig att hoppa genom ringar innan nÄgot liknande fungerar för dig.
Operations som kod
»LÄt oss skripta och vara klara.«
âen ingenjör tre Ă„r innan han uppfann Terraform.
NÀr det gÀller mjukvaruutveckling Àr Go eller ett program i Java inte bara kod.

Kod som kod
Det finns ju ocksÄ infrastrukturen dÀr den körs.

Infrastructure as Code
Men var kommer den ifrÄn? Hur övervakar man den? Var finns din kod? Behöver utvecklarna behörighet för Ätkomst?

Operations som kod
Att vara mjukvaruutvecklare handlar inte bara om att skriva kod.
Inte bara AWS: du anvÀnder sÀkert tjÀnster frÄn andra leverantörer ocksÄ. SignalFx, PagerDuty eller Github. Kanske har du en intern Jenkins-server för CI/CD eller en intern Grafana-panel för övervakning. Infra som kod vÀljs av olika anledningar och alla Àr lika viktiga för allt som har att göra med mjukvara.
NÀr jag arbetade pÄ Twitch, förbÀttrade vi tjÀnster inom blandade inbyggda system och AWS-system. Vi skapade och underhöll mÄnga mikrotjÀnster, vilket ökade driftskostnaderna. Diskussionerna handlade ungefÀr sÄ hÀr:
- Jag: Fan, ganska mycket arbete för att fÄ igÄng en mikrotjÀnst. Jag mÄste anvÀnda det hÀr för att skapa ett AWS-konto (vi gick mot 2 konton pÄ mikrotjÀnst), sedan det hÀr för att konfigurera aviseringarna, det hÀr för kodförrÄdet, och det hÀr för e-postadresser, och sÄ det hÀr...
- Lead: LÄt oss fÄ det skripterat och klart.
- Jag: Okej, men sjÀlva skriptet kommer att Àndras. Vi behöver ett sÀtt att verifiera att alla dessa inbyggda Amazon-grejer har aktuellt tillstÄnd.
- Lead: LÄter bra. SÄ vi fÄr skriva ett skript för det.
- Jag: UtmÀrkt! Och skriptet behöver sÀkert ocksÄ ha parametrar. Kommer det att acceptera dem?
- Lead: Ja, det accepterar de, vad kan det annars göra!
- Jag: Processen kan förÀndras, bakÄtkompatibiliteten kan gÄ förlorad. Vi kommer att behöva nÄgon form av semantisk versionskontroll.
- Lead: UtmÀrkt idé!
- Jag: Verktygen kan Àndras manuellt i anvÀndargrÀnssnittet. Vi behöver ett sÀtt att kontrollera och ÄtgÀrda det.
...3 Är senare:
- Lead: Och nu har vi terraform.
Moralen i historien Àr: Àven om du Àr upp över öronen i allt Amazon-relaterat, anvÀnder du ÀndÄ nÄgot som inte Àr frÄn AWS, och dessa tjÀnster har ett tillstÄnd som anvÀnder ett sprÄk för konfiguration för att synkronisera det tillstÄndet.
CloudFormation lambda vs git-moduler terraform
lambda Ă€r CloudFormation-lösningen för anvĂ€ndarlogik. Med lambda kan man eller . Denna metod medför ytterligare komplexiteter som inte finns i den semantiska versionskontrollen av git-moduler i Terraform. För mig blev den mest akuta frĂ„gan hantering av behörigheter för alla dessa anvĂ€ndar-lambda (som involverar tiotals AWS-konton). En annan viktig frĂ„ga blev problemet med "vad kom först â hönan eller Ă€gget?": det handlade om lambda-koden. Denna funktion Ă€r bĂ„de infrastruktur och kod, och den behöver kontinuerlig övervakning och uppdateringar. Den sista spiken i kistan blev svĂ„righeten i den semantiska uppdateringen av lambda-kodens förĂ€ndringar; vi behövde ocksĂ„ se till att stacken inte förĂ€ndrades mellan körningar utan direkt kommando.
Jag kommer ihÄg en gÄng nÀr jag ville skapa en kanariedepoy för Elastic Beanstalk-miljön med en klassisk belastningsutjÀmnare. Det skulle vara enklast att göra en andra distribution för EB bredvid produktionsmiljön, och ta ett steg till genom att koppla samman den automatiskt skalbara gruppen av kanariedepoy med LB-distributionen i produktionsmiljön. Eftersom Terraform anvÀnder , det skulle krÀva 4 extra kodrader i Terraform. NÀr jag frÄgade om det fanns nÄgon jÀmförbar lösning i CloudFormation, pekade man mig pÄ ett helt arkiv pÄ git med distributionspipeline och annat: och allt detta bara för att vi skulle kunna göra de elÀndiga 4 raderna kod i Terraform.
Den upptÀcker driftsÀttning
Se till att verkligheten överensstÀmmer med förvÀntningarna.
â Ă€r en mycket kraftfull funktion för operations as code, eftersom den hjĂ€lper till att sĂ€kerstĂ€lla att verkligheten överensstĂ€mmer med förvĂ€ntningarna. Den Ă€r tillgĂ€nglig bĂ„de med CloudFormation och med Terraform. Men nĂ€r arbetsstacken vĂ€xte visade CloudFormation allt fler falska positiva resultat vid driftupptĂ€ckten.
Med Terraform har du mycket mer avancerade livscykelhakar för att upptÀcka drift. Till exempel skriver du kommandot direkt i ECS-uppgiftsdefinitionen om du vill ignorera Àndringar i definitionen av en specifik uppgift utan att ignorera Àndringar i hela ECS-distributionen.
CDK och framtiden för CloudFormation
CloudFormation Àr svÄrt att hantera i stora, tvÀrinfrastrukturiska skala. MÄnga av dessa svÄrigheter Àr erkÀnda, och verktyget behöver sÄdana saker som , en struktur för att definiera molninfrastruktur i kod och föra den genom AWS CloudFormation. Det blir intressant att se vad som vÀntar aws-cdk i framtiden, men det blir svÄrt för det att konkurrera med de andra fördelarna med Terraform; för att CloudFormation ska kunna förbÀttras krÀvs globala förÀndringar.
För att Terraform inte ska göra en besviken
Det Àr ju "infrastruktur som KOD", inte "som text".
Min första upplevelse av Terraform var ganska negativ. Jag tror att jag helt enkelt inte förstod konceptet. NĂ€stan alla ingenjörer upplever det först oavsiktligt som ett textformat som mĂ„ste omvandlas till önskad infrastruktur. DET ĂR INTE NĂDVĂNDIGT SĂ .
SjÀlvklart gÀller de grundlÀggande sanningarna för god programvaruutveckling Àven för Terraform.
Jag har sett hur mÄnga av de metoder som antas för att skapa bra kod ignoreras i Terraform. Du har studerat i Äratal för att bli en bra programmerare. Tveka inte att anvÀnda den kunskapen bara för att du arbetar med Terraform. GrundlÀggande principer för bra mjukvaruutveckling gÀller Àven för Terraform.
Hur kan man inte dokumentera koden?
Jag har stött pÄ enorma Terraform-staplar helt utan dokumentation. Hur kan man skriva kod i sidor utan att ha nÄgon dokumentation? LÀgg till dokumentation som förklarar din kod Terraform (betoning pÄ ordet "kod"), varför detta avsnitt Àr sÄ viktigt, och vad du gör.
Hur kan man driftsÀtta tjÀnster som tidigare var en stor main()-funktion?
Jag har stött pÄ mycket komplexa Terraform-staplar presenterade som en enda modul. Varför driftsÀtter vi inte mjukvara sÄ? Varför delar vi upp stora funktioner i mindre? Samma svar gÀller för Terraform. Om modulen Àr för stor, bör vi dela upp den i mindre moduler.
AnvÀnder inte ditt företag bibliotek?
Jag har sett ingenjörer som, nÀr de startar ett nytt projekt med Terraform, bara kopierar och klistrar in stora bitar frÄn andra projekt till sina egna, och sedan försökte fÄ dem att fungera. Skulle ni i ert företag arbeta sÄ med "produktions"-kod? Vi anvÀnder inte bibliotek utan anledning. Ja, men hur ska vi klara oss utan gemensamma bibliotek överhuvudtaget?!
AnvÀnder ni inte PEP8 eller gofmt?
De flesta sprÄk har ett standardformat som Àr allmÀnt accepterat. I Python Àr det PEP8. I Go Àr det gofmt. Terraform har sitt: terraform fmt. AnvÀnd det gÀrna!
Kommer du att anvÀnda React utan att veta JavaScript?
Terraform-moduler kan förenkla en del av den komplexa infrastruktur som du bygger, men det betyder inte att man helt kan ignorera den. Vill du anvÀnda Terraform korrekt utan att förstÄ resurser? Du Àr dömd: tiden kommer att gÄ, och du kommer fortfarande inte att behÀrska Terraform.
Kodrar du singeltoner, eller injicerar du beroenden?
Dependency injection Àr en erkÀnd bÀsta praxis för programutveckling, föredragen av singeltoner. Hur kommer detta till nytta i Terraform? Jag har stött pÄ Terraform-moduler som Àr beroende av ett fjÀrrlÀge. IstÀllet för att skriva moduler som hÀmtar frÄn fjÀrrlÀget, skriv en modul som tar emot parametrar. Och skicka sedan dessa parametrar till modulen.
Gör dina bibliotek tio saker bra eller en - utmÀrkt?
Bibliotek fungerar bÀst nÀr de fokuserar pÄ en enda uppgift som de utför utmÀrkt. IstÀllet för att skriva stora Terraform-moduler som försöker göra allt pÄ en gÄng, bryt ner dem i delar som gör en sak bra. Och kombinera dem sedan pÄ det sÀtt som behövs.
Hur gör ni förÀndringar i biblioteken utan att bryta bakÄtkompatibiliteten?
En gemensam Terraform-modul, precis som ett vanligt bibliotek, mÄste pÄ nÄgot sÀtt kommunicera förÀndringar till anvÀndarna utan att bryta bakÄtkompatibiliteten. NÀr sÄdana förÀndringar intrÀffar i biblioteken Àr det frustrerande, och precis lika frustrerande nÀr förÀndringar utan bakÄtkompatibilitet görs i Terraform-moduler. Det rekommenderas att anvÀnda git-tags och semver vid anvÀndning av Terraform-moduler.
Ăr produktionsservicen igĂ„ng pĂ„ din bĂ€rbara dator eller i datacentret?
Hashicorp har verktyg som för att köra din terraform. Dessa centraliserade tjÀnster förenklar hantering, revision och godkÀnnande av terraform-förÀndringar.
Skriver du inte tester?
Ingenjörer erkÀnner att koden mÄste testas, men de glömmer ofta bort att göra kontroller nÀr de arbetar med Terraform. För infrastrukturen kan detta leda till ovÀntade problem. Jag rekommenderar att "testa" eller "skapa exempel" pÄ staplar med moduler som kan deployas korrekt för att verifieras under CI/CD.
Terraform och mikrotjÀnster
Liv och död för företag med mikrotjÀnster beror pÄ hastighet, uppdateringar och avveckling av nya mikrotjÀnstarbets staplar.
Det mest utbredda negativa problemet med mikrotjÀnstarkitekturer, som inte gÄr att undkomma, handlar om arbete, och inte kod. Om man endast ser Terraform som ett sÀtt att automatisera den infrastrukturella sidan av mikrotjÀnstarkitekturen, berövar man sig de riktiga fördelarna med detta system. Nu Àr allt .
KĂ€lla: habr.com
