Jag gick frÄn Terraform till CloudFormation - och Ängrade mig

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 - Infrastructure as Code, och hittills finns det tvÄ populÀra verktyg för att genomföra detta, sÀrskilt i AWS: Terraform och CloudFormation.

Jag gick frÄn Terraform till CloudFormation - och Ängrade mig
Jag jÀmför erfarenheten av att arbeta med Terraform och CloudFormation

Innan jag kom till Twitch (Àven kÀnd som Amazon Jr.) arbetade jag pÄ en startup 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.

Jag gick frÄn Terraform till CloudFormation - och Ängrade mig
Kod som kod

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

Jag gick frÄn Terraform till CloudFormation - och Ängrade mig
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?

Jag gick frÄn Terraform till CloudFormation - och Ängrade mig
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 skapa makron eller anpassad resurs. 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 ASG beantalk som utdata, 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.

UpptĂ€ckte driftsĂ€ttning — Ă€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 ignore_changes 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 aws-cdk, 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, inte allt bör vara ett bibliotek, 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 terraform cloud 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 som kod.

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