TĂ« paraqesĂ«sh infrastrukturĂ«n si kod nĂ« njĂ« format tekstual tĂ« ripĂ«rsĂ«ritshĂ«m Ă«shtĂ« njĂ« praktikĂ« e thjeshtĂ« dhe mĂ« e mirĂ« pĂ«r sistemet, me tĂ« cilĂ«n nuk duhet tĂ« merresh. Kjo praktikĂ« ka marrĂ« emrin â , dhe deri mĂ« tani, pĂ«r ta realizuar atĂ«, veçanĂ«risht nĂ« AWS, ekzistojnĂ« dy mjete popullore: dhe .

Po krahason përvojën time me Terraform dhe CloudFormation
Para se të vija në (po ashtu ) kam punuar dhe për rreth tre vjet kam përdorur Terraform. Në vendin e ri, unë gjithashtu kam përdorur shumë Terraform, dhe më pas kompania kaloi në të gjithë sistemin e Amazon, duke përfshirë CloudFormation. Unë punova me përkushtim për të zhvilluar praktikat më të mira për të dy ato, dhe përdorja të dyja mjetet në procese të punës shumë të komplikuara në nivel organizate. Më vonë, pas një vlerësimi të kujdesshëm të pasojave të kalimit nga Terraform në CloudFormation, arrita në përfundimin se Terraform, ndoshta, është zgjedhja më e mirë për organizatën.
Terraform është i tmerrshëm
Beta-version e softuerit
Terraform ende nuk ka lëshuar as versionin 1.0, dhe kjo është një arsye e fortë për ta mos përdorur. Që nga hera e parë që e provova, ka ndryshuar shumë, por atëherë terraform apply shpesh prishej pas disa azhurnimeve ose thjesht pas disa vjetësh të përdorimit. Do të thoja se "tani gjithçka është ndryshe", por... kështu flasin të gjithë, apo jo? Ka ndryshime që janë të pa kompatibilitet me versionet e mëparshme, edhe pse ato janë të arsyeshme, dhe madje ndjehet si të kishte ndodhur që sintaksa dhe abstraksionet e depozitave të burimeve tani janë pikërisht siç duhej. Mjeti duket se ka shpërthyer vërtet më mirë, por... :-0
Nga ana tjetĂ«r, AWS ka bĂ«rĂ« njĂ« punĂ« tĂ« shkĂ«lqyer nĂ« mbĂ«shtetje tĂ« kompatibilitetit me versionet e mĂ«parshme. TĂ« gjithĂ«, ndoshta, pĂ«r shkak se shĂ«rbimet e tyre shpesh testohen mirĂ« brenda organizatĂ«s dhe vetĂ«m mĂ« pas, pasi i japin emrin, publikohen. Pra, "kanĂ« bĂ«rĂ« njĂ« punĂ« tĂ« shkĂ«lqyer" Ă«shtĂ« njĂ« nĂ«nvlerĂ«sim. TĂ« mbash kompatibilitetin me versionet e mĂ«parshme tĂ« API-ve pĂ«r njĂ« sistem kaq tĂ« variueshĂ«m dhe tĂ« ndĂ«rlikuar si AWS Ă«shtĂ« jashtĂ«zakonisht e vĂ«shtirĂ«. Ădo njeri qĂ« ka pasur pĂ«rvojĂ« nĂ« mbajtjen e API-ve publike, tĂ« pĂ«rdorura njĂ«lloj gjerĂ«sisht, duhet tĂ« kuptojĂ« se sa e vĂ«shtirĂ« Ă«shtĂ« kjo gjatĂ« kaq shumĂ« vitesh. NdonĂ«se, pĂ«r sa i pĂ«rket komportimit tĂ« CloudFormation, nga sa e mbaj mend nuk ka ndryshuar asnjĂ«herĂ« me kalimin e viteve.
Njoftohu, këmbë... kjo është një plumb
Sa di unë, për të fshirë një burim të jashtme Një stek CloudFormation nuk mund të importohet nga steku im CF. Situata është e ngjashme me Terraform. Ai lejon importimin e burimeve ekzistuese në stekun tuaj. Funksioni, mund të thuhet, është mahnitës, por me një forcë të madhe vjen edhe një përgjegjësi e madhe. Sapo të shtosh një burim në stek, gjatë kohës që punon me stekun tënd, nuk mund ta fshish ose ndryshosh atë burim. Një herë kjo kishte pasoja. Disa herë në faqen e Twitch, dikush, pa ndonjë qëllim të keq, rastësisht importoi një grup sigurie AWS në stekun e tij Terraform. E futi disa komanda dhe... grupi i sigurisë (bashkë me trafikun e ardhshëm) zhduku.
Terraform i Madh
Rikuperimi nga gjendje të paplota
NdonjĂ«herĂ« CloudFormation nuk mund tĂ« kalojĂ« plotĂ«sisht nga njĂ« gjendje nĂ« tjetĂ«r. PĂ«rsĂ«ri do tĂ« pĂ«rpiqet tĂ« kthehet nĂ« gjendjen e mĂ«parshme. FatkeqĂ«sisht, kjo nuk Ă«shtĂ« gjithmonĂ« e mundur. TĂ« rikuperosh atĂ« qĂ« Ă«shtĂ« shkatĂ«rruar mund tĂ« jetĂ« frikĂ«suese â kurrĂ« nuk e di nĂ«se CloudFormation do tĂ« gĂ«zohet qĂ« e thyejnĂ« atĂ« â edhe nĂ«se Ă«shtĂ« pĂ«r ta riparuar. Ai nuk di tĂ« pĂ«rcaktojĂ« nĂ«se do tĂ« kthehet apo jo nĂ« gjendjen e mĂ«parshme dhe si rregull ngec pĂ«r orĂ«, duke pritur njĂ« mrekulli.
Terraform, nga ana tjetër, ka prirjen të rikuperohet pas kalimeve të dështuara në një mënyrë më të eleganteshme dhe ofron një set të zgjeruar alatësh për debug.
Ndryshime më të qarta në gjendjet e dokumentit
«Mirë, balancuesi i ngarkesës, ti po ndryshon. Por si?»
- inxhinieri i shqetësuar, i gatshëm të shtypë butonin «prano».
NdonjĂ«herĂ« mĂ« nevojitet tĂ« bĂ«j disa manovra me balancuesin e ngarkesĂ«s nĂ« stekun CloudFormation â pĂ«r shembull, tĂ« shtoj numrin e portit ose tĂ« ndryshoj grupin e sigurisĂ«. Ndryshimet ClouFormation i tregon dobĂ«t. UnĂ«, si nĂ« gjilpĂ«ra, kontrolloj dhjetĂ« herĂ« skedarin yaml, pĂ«r t'u siguruar qĂ« nuk kam fshier asgjĂ« tĂ« nevojshme dhe as nuk kam shtuar diçka tĂ« tepĂ«rt.
Terraform në këtë drejtim është shumë më transparent. Ndonjëherë ai madje është tepër transparent (lexo: bezdisshëm). Fatmirësisht, në versionin e fundit u përfshi një përmirësim në paraqitjen e ndryshimeve - tani është e qartë se çfarë ndryshon.
Fleksibiliteti
Shkruani softuerin nga prapavija.
TĂ« flasim hapur, karakteristika mĂ« e rĂ«ndĂ«sishme e njĂ« programi tĂ« qĂ«ndrueshĂ«m Ă«shtĂ« aftĂ«sia pĂ«r t'u adaptuar ndaj ndryshimeve. Ădo program duhet ta shkruani nĂ« mĂ«nyrĂ« tĂ« kundĂ«rt. MĂ« shpesh kam gabuar duke marrĂ« njĂ« shĂ«rbim "tĂ« thjeshtĂ«" dhe mĂ« pas pĂ«rpiqesha ta futja gjithçka nĂ« njĂ« stivĂ« tĂ« vetme CloudFormation ose Terraform. Dhe, sigurisht, pas disa muajsh zbulova se kisha kuptuar gjithçka gabim dhe shĂ«rbimi nuk ishte aq i thjeshtĂ«! Ndaj, kishte nevojĂ« tĂ« ndaja stivĂ«n e madhe nĂ« componente tĂ« vogla. Kur punoni me CloudFormation, kjo Ă«shtĂ« e mundur vetĂ«m nĂ«se rishkruani stivĂ«n ekzistuese, dhe unĂ«, me bazat e tĂ« dhĂ«nave tĂ« mia, nuk e bĂ«j kĂ«tĂ«. Terraform, nga ana tjetĂ«r, lejon qĂ« tĂ« analizoni stivĂ«n dhe ta ndani atĂ« nĂ« pjesĂ« mĂ« tĂ« kuptueshme.
Modulet në git
Të ndash kodin Terraform ndërmjet shumë stivave është shumë më e lehtë sesa me kodin CloudFormation. Me Terraform mund të vendosni kodin në një depo git dhe ta referoni atë duke përdorur kontrollin semantik të versioneve. Cilido që ka akses në këtë depo mund ta përdorë sërish kodin e përbashkët. Ekuivalenti në CloudFormation është S3, por ai nuk ka të njëjtat avantazhe dhe nuk ka asnjë arsye për të cilën do të duhej të heqim dorë nga git në favor të S3.
Organizata po rritej dhe aftësia për të ndarë stivat e përbashkëta arriti nivelin kritik. Me Terraform, kjo ndodh lehtësisht dhe natyrshëm, ndërsa CloudFormation do t'ju detyrojë të kaloni disa ringa përpara se të arrini diçka të ngjashme.
Operacione si kod
«Të shkruajmë dhe mirë është».
âinzhinieri 3 vjet para se tĂ« shpikĂ« biçikletĂ«n Terraform.
Kur bëhet fjalë për zhvillimin e softuerit, Go ose një program në Java nuk është vetëm kod.

Kod si Kod
Sepse ka edhe infrastrukturën në të cilën ajo punon.

Infrastrukturë si Kod
Por nga vjen ajo aty? Si e monitoroni? Ku është kodi juaj? A kanë nevojë zhvilluesit për leje për akses?

Operacione si Kod
Të jesh zhvillues i softuerit nuk është vetëm të shkruash kod.
Jo vetëm AWS: sigurisht që po përdorni shërbime nga ofrues të tjerë. SignalFx, PagerDuty ose Github. Ndoshta keni një server të brendshëm Jenkins për CI/CD ose një panel të brendshëm Grafana për monitorim. Infrastrukturë si Kod zgjidhet për arsye të ndryshme, dhe çdo arsyetim është po aq i rëndësishëm për çdo gjë që lidhet me softuerin.
Kur pun punoja në Twitch, ne përshpejtonim shërbimet brenda sistemeve të përziera dhe sistemeve të AWS Amazon. Ne prodhonim dhe mbështetnim shumë mikrosërvish, duke rritur kostot operuese. Diskutimet zhvilloheshin pak a shumë në këtë mënyrë:
- UnĂ«: Pff, shumĂ« lĂ«vizje pĂ«r tĂ« nxitur njĂ« mikrosĂ«rvish. KĂ«tĂ« gjĂ« do tĂ« duhet ta pĂ«rdor pĂ«r tĂ« krijuar njĂ« llogari AWS (ne shkonim drejt 2 llogarive pĂ«r mikrosĂ«rvish), pastaj kĂ«tĂ« â pĂ«r tĂ« konfiguruar njoftime, ndonjĂ« tjetĂ«r â pĂ«r depozitĂ«n e kodit, dhe kĂ«tĂ« â pĂ«r listĂ«n e adresave tĂ« postĂ«s elektronike, dhe kĂ«tĂ« tjetĂ«râŠ
- Të dhënat: Do ta scriptim dhe kështu.
- Unë: Mirë, por vetë skripti do të ndryshojë. Na nevojitet një mënyrë për të verifikuar që të gjitha këto gjëra të integrohen nga amazon janë në gjendje të përditësuar.
- Të dhënat: Dëgjohet mirë. Dhe për këtë do të shkruajmë një skript.
- UnĂ«: ShkĂ«lqyer! Dhe skripti me siguri do tâi nevojitet disa parametra. A mund tâi pranojĂ« ata?
- TĂ« dhĂ«nat: Po, do tâi pranojĂ«, ku ta çosh!
- Unë: Procesi mund të ndryshojë, do të humbasë përputhshmërinë prapa. Do të nevojitet një lloj kontrolli semantik të versioneve.
- Të dhënat: Ide e shkëlqyer!
- Unë: Mjetet mund të ndryshojnë manualisht, brenda ndërfaqes së përdoruesit. Na nevojitet një mënyrë për ta verifikuar dhe rregulluar këtë.
âŠ3 vjet mĂ« vonĂ«:
- Të dhënat: Dhe kështu na doli terraform.
Mori e basht se: pavarësisht se je deri te kuajt në gjithçka amazon, ti prapë përdor diçka që nuk është nga AWS, dhe këto shërbime kanë një gjendje që përdor një gjuhë për konfigurimin për ta sinkronizuar atë gjendje.
CloudFormation lambda vs modulat git të terraform
lambda Ă«shtĂ« zgjidhja e CloudFormation pĂ«r çështjen e logjikĂ«s sĂ« pĂ«rdoruesit. Me lambda mund tĂ« ose . Ky qasje paraqet vĂ«shtirĂ«si shtesĂ« qĂ« nuk i ka kontrolli semantik i versioneve tĂ« moduleve git nĂ« Terraform. Problemi mĂ« i rĂ«ndĂ«sishĂ«m pĂ«r mua ishte menaxhimi i lejeve pĂ«r tĂ« gjitha kĂ«to lambda tĂ« pĂ«rdoruesit (dhe kĂ«to janĂ« dhjetĂ«ra llogari AWS). NjĂ« tjetĂ«r problem i rĂ«ndĂ«sishĂ«m ishte ai tipit "çfarĂ« ishte mĂ« parĂ« â pula apo veza?": ai ishte i lidhur me kodin lambda. Kjo funksion vetĂ« Ă«shtĂ« infrastrukturĂ« dhe kod dhe ajo gjithashtu ka nevojĂ« pĂ«r monitorim dhe pĂ«rditĂ«sime. Guri i fundit nĂ« arkĂ« ishte vĂ«shtirĂ«sia nĂ« pĂ«rditĂ«simin semantik tĂ« ndryshimeve tĂ« kodit lambda; duhej gjithashtu tĂ« bĂ«hej qĂ« veprimet e grumbullit tĂ« mos ndryshonin mes ekzekutimeve pa njĂ« komandĂ« tĂ« drejtpĂ«rdrejtĂ«.
I remember wanting to create a canary deployment for the Elastic Beanstalk environment with a classic load balancer. The easiest way would have been to make a second deployment for EB alongside the production environment, taking one more step: merging the auto-scaling group of the canary deployment with the LB deployment in the production environment. And since Terraform uses , this would require 4 extra lines of code in Terraform. When I asked if there was a comparable solution in CloudFormation, I was pointed to a whole repository on Git with a deployment pipeline and more: all this just to achieve those unfortunate 4 lines of Terraform code.
It detects drift better
Ensure that reality matches expectations.
â is a very powerful operations as code feature, as it helps ensure that reality matches expectations. It is available with both CloudFormation and Terraform. However, as the stack grows, drift detection in CloudFormation yielded more false positives.
With Terraform, you have much more advanced lifecycle hooks for drift detection. For example, you can enter the command directly in the ECS task definition if you want to ignore changes to a specific task definition without ignoring changes to the entire ECS deployment.
CDK and the future of CloudFormation
CloudFormation is difficult to manage at large, cross-infrastructure scales. Many of these challenges have been acknowledged, and the tool needs things like , a framework for defining cloud infrastructure as code and passing it through AWS CloudFormation. It will be interesting to see what awaits aws-cdk in the future, but it will struggle to compete with Terraform's other advantages; major changes will be needed to bring CloudFormation up to speed.
To avoid disappointing Terraform
This is 'infrastructure as CODE', not 'as text'.
My first impression of Terraform was quite negative. I think I just didn't understand the approach. Almost all engineers initially perceive it involuntarily as a text format that needs to be converted into the desired infrastructure. THIS IS NOT NECESSARY.
The basics of good software development apply to Terraform as well.
Kam pashë se shumë praktika, të pranuara për krijimin e kodit të mirë, injorohen në Terraform. Keni mësuar për vite me radhë për të bërë një programues të mirë. Mos e flakni këtë përvojë vetëm sepse po punoni me Terraform. Aforizmat e mira të zhvillimit të softuerit vlejnë edhe për Terraform.
Si mund të kodosh dhe të mos e dokumentosh atë?
Kam hasur steke të mëdha Terraform në mënyrë të plotë pa dokumentacion. Si mund të shkruash kod për faqe pa dokumentacion fare? Shto dokumentacion që shpjegon tuajin kod Terraform (theksi këtu është tek fjala 'kod'), pse ky seksion është kaq i rëndësishëm dhe çfarë po bëni.
Si mund të shpalosni shërbime, të cilat dikur ishin një funksion i madh main()?
Kam takuar steke shumĂ« komplekse Terraform, tĂ« paraqitura si njĂ« moduli i vetĂ«m. Pse nuk e shpalosim softuerin kĂ«shtu? Pse i ndajmĂ« funksionet e mĂ«dha nĂ« mĂ« tĂ« vogla? TĂ« njĂ«jtat pĂ«rgjigje vlejnĂ« edhe pĂ«r Terraform. NĂ«se moduli juaj Ă«shtĂ« shumĂ« i madh â duhet ta ndani nĂ« module mĂ« tĂ« vogla.
A nuk përdor kompania juaj biblioteka?
Kam parë si inxhinierët, duke zhvilluar një projekt të ri me Terraform, thjesht kopjonin dhe ngjisnin copa të mëdha nga projekte të tjera në të tyren, dhe pastaj i përpunonin derisa fillonte të funksiononte. A do të punonit kështu me kodin 'produksion' në kompaninë tuaj? Ne nuk përdorim biblioteka pa arsye. Po, por ku do të ishim pa biblioteka të përbashkëta në parim?!
A nuk përdorni PEP8 ose gofmt?
NĂ« shumicĂ«n e gjuhĂ«ve ka njĂ« skemĂ« standarde formatimi. NĂ« Python Ă«shtĂ« PEP8. NĂ« Go â gofmt. Terraform ka tĂ« vetin: terraform fmt. PĂ«rdorini me shĂ«ndet!
A do të përdorni React, pa e ditur JavaScript-in?
Modulet Terraform mund të thjeshtojnë një pjesë të infrastrukturës komplekse që po krijoni, por kjo nuk do të thotë se mund të punoni përsëri pa e kuptuar atë. Doni ta përdorni Terraform si duhet pa njohjen e burimeve? Jeni të dënuar: koha do të kalojë e ju nuk do ta zotëroni Terraform.
A kodoni me singleton, ose duke inkuadruar varësi?
Injekti i varësive është një praktikë e pranuar më e mirë për zhvillimin e softuerit, e preferuar nga singleton-at. Si mund të jetë e dobishme kjo në Terraform? Kam hasur në modula Terraform që varen nga stadi i largët. Në vend që të shkruani modula që nxjerrin nga stadi i largët, shkruani një modul që pranon parametër. Pastaj kaloni këto parametra në modul.
Bibliotekat tuaja bĂ«nĂ« dhjetĂ« gjĂ«ra mirĂ« apo njĂ« â shkĂ«lqyeshĂ«m?
Bibliotekat më së miri funksionojnë kur përqendrohen në një detyrë, të cilën e përfundojnë me mjeshtëri. Në vend që të shkruani modula të mëdhenj Terraform që përpiqen të bëjnë gjithçka, ndani ato në pjesë që bëjnë një gjë mirë. Mandej, kombinoni ato ashtu siç është e nevojshme.
Si prodhoni ndryshime në biblioteka pa përputhshmëri me versionet e mëparshme?
Një modul i përgjithshëm Terraform, si çdo bibliotekë tjetër, duhet të ndihmojë përdoruesit për të kuptuar ndryshimet pa përputhshmëri me versionet e mëparshme. Kur ndodhin këto ndryshime në biblioteka, të gjithë shqetësohen, dhe po ashtu është shqetësuese kur ndodhin ndryshime pa përputhshmëri në modulat Terraform. Rekomandohet të përdorni git tags dhe semver kur përdorni modula Terraform.
A ka shërbimi juaj ndonjëherë në laptopin tuaj apo në një qendër të të dhënave?
Hashicorp ka mjete si për të ekzekutuar terraform-in tuaj. Këto shërbime të centralizuara lehtësojnë menaxhimin, auditimin dhe miratimin e ndryshimeve në terraform.
A nuk shkruani teste?
Inxhinierët pranojnë se kodi duhet testuar, por shpesh e injorojnë këtë kur punojnë me Terraform. Kjo paraqet rreziqe të padëshiruara për infrastrukturën. Unë rekomandoj të "testoni" ose "krijoni shembuj" të stekëve duke përdorur modula që mund të vendosen saktë për t'u testuar gjatë CI/CD.
Terraform dhe mikrosërvicat
Jeta dhe vdekja e kompanive të mikrosërvicave varen nga shpejtësia, azhurnimi dhe shkatërrimi i stekëve të rinj të punës mikrosërvicave.
Problemi më i zakonshëm negativ që ndërlidhet me arkitekturën e mikrosërvicave dhe nga i cili nuk ka shpëtim, është ajo që ka të bëjë me punën dhe jo me kodin. Nëse e perceptoni Terraform-in vetëm si një mjet për të automatizuar anën infrastrukturore të arkitekturës së mikrosërvicave, atëherë po e humbni përparësinë e vërtetë të këtij sistemi. Tani është .
Burimi: habr.com
