Terraform-dan CloudFormation-a keçdi - və peşman oldum

İnfrastrukturun təkrarlanan mətn formatında kod kimi təqdim edilməsi siçanlarla oynamağı tələb etməyən sistemlər üçün sadə ən yaxşı təcrübədir. Bu təcrübənin bir adı var - Kod kimi infrastruktur, və indiyə qədər onu həyata keçirmək üçün iki məşhur vasitə var, xüsusən AWS-də: Terraform и CloudFormation.

Terraform-dan CloudFormation-a keçdi - və peşman oldum
Terraform və CloudFormation ilə təcrübənin müqayisəsi

Gəlməzdən əvvəl Twitch (o Amazon Jr.) Mən işlədim bir başlanğıcda və üç il Terraform istifadə etdi. Yeni yerdə mən də bütün gücümlə Terraform-dan istifadə etdim və sonra şirkət CloudFormation da daxil olmaqla Amazon-da olan hər şeyə keçidi itələdi. Mən hər ikisi üçün ən yaxşı təcrübələri səylə inkişaf etdirmişəm və hər iki alətdən çox mürəkkəb, təşkilati iş axınlarında istifadə etmişəm. Daha sonra, Terraform-dan CloudFormation-a köçməyin nəticələrini düşünərək düşünəndən sonra əmin oldum ki, Terraform, yəqin ki, təşkilat üçün ən yaxşı seçimdir.

Terraform Dəhşətli

Beta proqram təminatı

Terraform hələ 1.0 versiyasını belə buraxmayıb, bu onu istifadə etməmək üçün yaxşı səbəbdir. İlk dəfə özüm sınadığımdan bəri çox dəyişdi, amma o zaman terraform apply tez-tez bir neçə yeniləmədən sonra və ya sadəcə bir neçə il istifadədən sonra pozulur. Mən deyərdim ki, “indi hər şey fərqlidir”, amma... deyəsən hamı belə deyir, elə deyilmi? Əvvəlki versiyalarla uyğun gəlməyən dəyişikliklər var, baxmayaraq ki, onlar uyğundur və hətta resurs mağazalarının sintaksisi və abstraksiyaları indi bizə lazım olan şeydir. Alət həqiqətən yaxşılaşdı, amma... :-0

Digər tərəfdən, AWS geriyə uyğunluğu qorumaqla yaxşı iş gördü. Bu, yəqin ki, ona görədir ki, onların xidmətləri tez-tez təşkilat daxilində hərtərəfli sınaqdan keçirilir və yalnız bundan sonra adı dəyişdirilərək dərc olunur. Beləliklə, "çox çalışdılar" ifadəsi bir azdır. AWS kimi müxtəlif və mürəkkəb sistem üçün API-lərlə geriyə doğru uyğunluğu saxlamaq olduqca çətindir. Geniş istifadə olunan ictimai API-ləri saxlamaq məcburiyyətində qalan hər kəs bunu uzun illər ərzində etməyin nə qədər çətin olduğunu başa düşməlidir. Ancaq yaddaşımda CloudFormation-ın davranışı illər ərzində heç vaxt dəyişməyib.

Qarşılaşın ayağı... güllədir

Mən bildiyimə görə resursu silin kənar adam CF yığınınızdan CloudFormation yığını mümkün deyil. Eyni şey Terraforma da aiddir. Mövcud resursları yığınınıza idxal etməyə imkan verir. Funksiyanın heyrətamiz olduğunu söyləmək olar, lakin böyük güclə böyük məsuliyyət gəlir. Siz sadəcə yığına resurs əlavə etməlisiniz və yığınınızla işləyərkən bu resursu silə və ya dəyişdirə bilməzsiniz. Bir gün əks nəticə verdi. Bir gün Twitch-də kimsə təsadüfən başqasının AWS təhlükəsizlik qrupunu öz Terraform yığınına daxil etdi və heç bir fitnə-fəsad törətmədi. Mən bir neçə əmr daxil etdim və... təhlükəsizlik qrupu (daxil olan trafiklə birlikdə) yox oldu.

Terraform Əla

Natamam vəziyyətdən bərpa

Bəzən CloudFormation bir vəziyyətdən digərinə tamamilə keçə bilmir. Eyni zamanda əvvəlkinə qayıtmağa çalışacaq. Təəssüf ki, bu həmişə mümkün deyil. Daha sonra baş verənləri aradan qaldırmaq olduqca qorxulu ola bilər - CloudFormation-ın sındırılmasından məmnun olub-olmayacağını heç vaxt bilmirsiniz - hətta onu düzəltmək üçün belə. Əvvəlki vəziyyətə qayıtmağın mümkün olub-olmamasından asılı olmayaraq, o, həqiqətən necə təyin edəcəyini bilmir və standart olaraq saatlarla möcüzə gözləyir.

Terraform, əksinə, uğursuz keçidlərdən daha zərif şəkildə bərpa etməyə meyllidir və qabaqcıl sazlama vasitələri təklif edir.

Sənəd vəziyyətinə daha aydın dəyişikliklər

“Yaxşı, yük balansçısı, sən dəyişirsən. Bəs necə?”

— narahat mühəndis, “qəbul et” düyməsini basmağa hazırdır.

Bəzən CloudFormation yığınında yük balanslaşdırıcısı ilə bəzi manipulyasiyalar etməliyəm, məsələn, port nömrəsi əlavə etmək və ya təhlükəsizlik qrupunu dəyişmək. ClouFormation dəyişiklikləri zəif göstərir. Mən sancaqlar və iynələr üzərində yaml faylını on dəfə iki dəfə yoxlayıram ki, lazım olan heç nəyi silməmişəm və lazımsız heç nə əlavə etməmişəm.

Terraform bu baxımdan daha şəffafdır. Bəzən o, hətta çox şəffaf olur (oxu: darıxdırıcı). Xoşbəxtlikdən, ən son versiya dəyişikliklərin təkmilləşdirilmiş ekranını ehtiva edir ki, indi nəyin dəyişdiyini dəqiq görə biləsiniz.

Esneklik

Proqram təminatını geriyə yazın.

Açıq desək, uzunömürlü proqram təminatının ən mühüm xüsusiyyəti dəyişikliklərə uyğunlaşmaq qabiliyyətidir. İstənilən proqramı geriyə yazın. Çox vaxt mən “sadə” xidmətdən istifadə edərək, sonra hər şeyi vahid CloudFormation və ya Terraform yığınına yığmaqla səhvlər etdim. Və təbii ki, aylar sonra hər şeyi səhv başa düşdüyüm məlum oldu və xidmət əslində sadə deyildi! İndi birtəhər böyük bir yığını kiçik komponentlərə bölməliyəm. CloudFormation ilə işlədiyiniz zaman bunu yalnız ilk növbədə mövcud yığını yenidən yaratmaqla etmək olar və mən bunu verilənlər bazalarımla etmirəm. Terraform, əksinə, yığını parçalamağa və daha başa düşülən kiçik hissələrə bölməyə imkan verdi.

Git-də modullar

Terraform kodunu çoxsaylı yığınlar arasında paylaşmaq CloudFormation kodunu paylaşmaqdan daha asandır. Terraform ilə siz kodunuzu git repozitoriyasına yerləşdirə və semantik versiya nəzarətindən istifadə edərək ona daxil ola bilərsiniz. Bu depoya girişi olan hər kəs paylaşılan kodu təkrar istifadə edə bilər. CloudFormation-un ekvivalenti S3-dür, lakin onun eyni faydaları yoxdur və S3-ün xeyrinə git-dən imtina etməyimiz üçün heç bir səbəb yoxdur.

Təşkilat böyüdü və ümumi yığınları paylaşma qabiliyyəti kritik səviyyəyə çatdı. Terraform bunu hər şeyi asan və təbii edir, halbuki CloudFormation siz bu kimi bir işə başlamazdan əvvəl sizi halqalardan keçməyə məcbur edəcək.

Kod kimi əməliyyatlar

"Gəlin onu yazaq və tamam."

— Terraform velosipedini icad etməzdən 3 il əvvəl mühəndis.

Proqram təminatının hazırlanmasına gəldikdə, Go və ya Java proqramı sadəcə kod deyil.

Terraform-dan CloudFormation-a keçdi - və peşman oldum
Kod olaraq kod

Üzərində işlədiyi infrastruktur da var.

Terraform-dan CloudFormation-a keçdi - və peşman oldum
Kod kimi infrastruktur

Bəs o haradandır? Buna necə nəzarət etmək olar? Kodunuz harada yaşayır? Tərtibatçılara giriş icazəsi lazımdırmı?

Terraform-dan CloudFormation-a keçdi - və peşman oldum
Kod kimi əməliyyatlar

Proqram tərtibatçısı olmaq sadəcə kod yazmaq demək deyil.

AWS yeganə deyil: siz yəqin ki, digər provayderlərdən istifadə edirsiniz. SignalFx, PagerDuty və ya Github. Bəlkə CI/CD üçün daxili Jenkins serveriniz və ya monitorinq üçün daxili Grafana tablosunuz var. Infra as Code müxtəlif səbəblərə görə seçilir və hər biri proqram təminatı ilə bağlı hər şey üçün eyni dərəcədə vacibdir.

Mən Twitch-də işlədiyim zaman biz Amazon-un qarışıq quraşdırılmış və AWS sistemləri daxilində xidmətləri sürətləndirdik. Biz əməliyyat xərclərini artıraraq bir çox mikroxidmətləri dayandırdıq və dəstəklədik. Müzakirələr belə getdi:

  • Я: Lənət olsun, bu, bir mikroservisin overclock edilməsi üçün çoxlu jestdir. Mən AWS hesabı yaratmaq üçün bu zibildən istifadə etməliyəm (biz 2 hesaba keçdik mikroservis), sonra bu xəbərdarlıqların qurulması üçün, bu kod anbarı üçün, bu da e-poçt siyahısı üçün, sonra bu...
  • Aparıcı: Gəlin onu skript edək və tamam.
  • Я: Yaxşı, amma ssenarinin özü dəyişəcək. Bütün bu daxili Amazon gizmoslarının güncəl olub olmadığını yoxlamaq üçün bir yola ehtiyacımız olacaq.
  • Aparıcı: Yaxşı səslənir. Və bunun üçün bir skript yazacağıq.
  • Я: Əla! Və yəqin ki, skript hələ də parametrləri təyin etməlidir. Onları qəbul edəcəkmi?
  • Aparıcı: Qoy getdiyi yerə aparsın!
  • Я: Proses dəyişə bilər və geriyə uyğunluq itiriləcək. Bir növ semantik versiyaya nəzarət tələb olunacaq.
  • Aparıcı: Əla fikir!
  • Я: Alətlər istifadəçi interfeysi daxilində əl ilə dəyişdirilə bilər. Bunu yoxlamaq və düzəltmək üçün bir yola ehtiyacımız olacaq.

…3 il sonra:

  • Aparıcı: Və biz terraforma aldıq.

Hekayənin əxlaqı belədir: sən olsan belə hər şey Amazonda baş üstə, siz hələ də AWS-dən olmayan bir şey istifadə edirsiniz və bu xidmətlər həmin vəziyyəti sinxronlaşdırmaq üçün konfiqurasiya dilindən istifadə edən bir vəziyyətə malikdir.

CloudFormation lambda vs git modulları terraform

lambda CloudFormation-ın fərdi məntiq probleminin həllidir. Lambda ilə edə bilərsiniz makrolar yaradın və ya istifadəçi resursu. Bu yanaşma Terraformun git modullarının semantik versiyasında mövcud olmayan əlavə mürəkkəblikləri təqdim edir. Mənim üçün ən aktual problem bütün bu istifadəçi lambdaları üçün icazələrin idarə edilməsi idi (və bunlar onlarla AWS hesabıdır). Digər mühüm problem “ilk gələn nədir, toyuq yoxsa yumurta?” problemi idi: bu, lambda kodu ilə bağlı idi. Bu funksiyanın özü infrastruktur və koddur və onun özü monitorinq və yeniləmələrə ehtiyac duyur. Tabutdakı son dırnaq lambda kodu dəyişikliklərinin semantik olaraq yenilənməsinin çətinliyi idi; biz də birbaşa əmr olmadan stek hərəkətlərinin qaçışlar arasında dəyişmədiyinə əmin olmalı idik.

Yadımdadır, bir dəfə klassik yük balanslaşdırıcısı ilə Elastic Beanstalk mühiti üçün kanareyka yerləşdirməsi yaratmaq istəyirdim. Ediləcək ən asan şey, istehsal mühitinin yanında EB üçün ikinci yerləşdirmə etmək və onu bir addım daha irəli aparmaq olardı: avtomatik miqyaslı kanareyka yerləşdirmə qrupunu istehsal mühitinə yerləşdirmə LB ilə birləşdirmək. Və Terraform istifadə etdiyi üçün Nəticə olaraq ASG beantalk, bunun üçün Terraform-da 4 əlavə kod xətti tələb olunacaq. CloudFormation-da müqayisə edilə bilən bir həllin olub-olmadığını soruşduqda, onlar mənə yerləşdirmə boru kəməri və hər şeyi olan bütöv bir git deposuna işarə etdilər, hamısı zəif 4 sətir Terraform kodunun edə biləcəyi bir şey naminə.

O, sürüşməni daha yaxşı aşkar edir

Reallığın gözləntilərə uyğun olduğundan əmin olun.

Drift aşkarlanması kod xüsusiyyəti kimi çox güclü əməliyyatdır, çünki o, reallığın gözləntilərə uyğun olmasını təmin edir. Həm CloudFormation, həm də Terraform ilə mövcuddur. Lakin istehsal yığını böyüdükcə, CloudFormation-da sürüşmə axtarışı getdikcə daha çox yanlış aşkarlamalar yaratdı.

Terraform ilə sürüşmənin aşkarlanması üçün daha təkmil həyat dövrü qarmaqlarınız var. Məsələn, əmri daxil edin dəyişiklikləri görməyin bütün ECS yerləşdirmənizdə edilən dəyişikliklərə məhəl qoymadan konkret tapşırıq tərifinə edilən dəyişikliklərə məhəl qoymamaq istəyirsinizsə, birbaşa ECS tapşırıq tərifində.

CDK və CloudFormation-ın gələcəyi

CloudFormation-ı böyük, çarpaz infrastruktur miqyasında idarə etmək çətindir. Bu çətinliklərin çoxu tanınır və alət kimi şeylərə ehtiyac duyur aws-cdk, kodda bulud infrastrukturunu müəyyən etmək və onu AWS CloudFormation vasitəsilə idarə etmək üçün çərçivə. Gələcəyin aws-cdk üçün nə gözlədiyini görmək maraqlı olacaq, lakin Terraformun digər güclü tərəfləri ilə rəqabət aparmaqda çətinlik çəkəcək; CloudFormation-ı yeniləşdirmək üçün qlobal dəyişikliklər tələb olunacaq.

Beləliklə, Terraform məyus olmasın

Bu, "mətn kimi" deyil, "kod kimi infrastruktur"dur.

Terraform haqqında ilk təəssüratım olduqca pis idi. Düşünürəm ki, mən sadəcə yanaşmanı başa düşmədim. Demək olar ki, bütün mühəndislər qeyri-ixtiyari olaraq onu istənilən infrastruktura çevrilməli olan mətn formatı kimi qəbul edirlər. BU ŞEKLƏ ETMƏYİN.

Yaxşı proqram təminatının inkişafının həqiqətləri Terraforma da aiddir.

Mən Terraform-da yaxşı kod yaratmaq üçün qəbul edilmiş bir çox təcrübənin nəzərə alınmadığını gördüm. Yaxşı proqramçı olmaq üçün illərlə təhsil almısınız. Terraform ilə işlədiyiniz üçün bu təcrübədən imtina etməyin. Yaxşı proqram təminatının inkişafının həqiqətləri Terraforma aiddir.

Kodu necə sənədləşdirmək olmaz?

Mən heç bir sənədi olmayan nəhəng Terraform yığınlarını gördüm. Səhifələrdə kodu necə yaza bilərsiniz - heç bir sənəd olmadan? Sizi izah edən sənədlər əlavə edin kod Terraform ("kod" sözünə vurğu), bu bölmənin niyə bu qədər vacib olduğunu və nə etdiyinizi.

Bir zamanlar böyük bir main() funksiyası olan xidmətləri necə yerləşdirə bilərik?

Tək modul kimi təqdim edilən çox mürəkkəb Terraform yığınlarını gördüm. Niyə proqram təminatını bu şəkildə yerləşdirmirik? Nə üçün böyük funksiyaları daha kiçiklərə ayırırıq? Eyni cavablar Terraforma da aiddir. Modulunuz çox böyükdürsə, onu daha kiçik modullara bölmək lazımdır.

Sizin şirkət kitabxanalardan istifadə etmirmi?

Mühəndislərin Terraformdan istifadə edərək yeni bir layihə hazırlayaraq, axmaqcasına digər layihələrdən nəhəng parçaları özlərininkilərə kopyalayıb yapışdırdıqlarını və sonra işə başlayana qədər onlarla necə məşğul olduqlarını gördüm. Şirkətinizdə “döyüş” kodu ilə belə işləyəcəksiniz? Biz təkcə kitabxanalardan istifadə etmirik. Bəli, hər şey kitabxana olmaq məcburiyyətində deyil, bəs biz prinsipcə ortaq kitabxanalarsız hardayıq?!

PEP8 və ya gofmt istifadə etmirsiniz?

Əksər dillərdə standart, qəbul edilmiş formatlaşdırma sxemi var. Python-da bu PEP8-dir. In Go - gofmt. Terraformun özünəməxsus xüsusiyyətləri var: terraform fmt. Sağlamlığınız üçün həzz alın!

JavaScript bilmədən React istifadə edəcəksiniz?

Terraform modulları yaratdığınız kompleks infrastrukturun bəzi hissəsini sadələşdirə bilər, lakin bu, onunla heç də məşğul ola bilməyəcəyiniz demək deyil. Resursları başa düşmədən Terraformdan düzgün istifadə etmək istəyirsiniz? Siz məhkumsunuz: vaxt keçəcək və siz heç vaxt Terraformu mənimsəməyəcəksiniz.

Singtonlar və ya asılılıq inyeksiyası ilə kodlaşdırırsınız?

Asılılıq inyeksiyası proqram təminatının inkişafı üçün tanınmış ən yaxşı təcrübədir və singletonlara üstünlük verilir. Bu Terraformda necə faydalıdır? Mən uzaq vəziyyətdən asılı olan Terraform modullarını gördüm. Uzaq vəziyyəti əldə edən modulları yazmaq əvəzinə, parametrləri qəbul edən modul yazın. Və sonra bu parametrləri modula ötürün.

Kitabxanalarınız on şeyi yaxşı edir, yoxsa bir şeyi əla?

Ən yaxşı işləyən kitabxanalar, çox yaxşı gördükləri bir işə diqqət yetirənlərdir. Hər şeyi bir anda etməyə çalışan böyük Terraform modulları yazmaq əvəzinə, onların bir işi yaxşı görən hissələrini qurun. Və lazım olduqda onları birləşdirin.

Geriyə uyğunluq olmadan kitabxanalara necə dəyişikliklər edirsiniz?

Ümumi bir Terraform modulu, adi kitabxana kimi, geriyə uyğunlaşmadan dəyişiklikləri birtəhər istifadəçilərə çatdırmalıdır. Kitabxanalarda bu dəyişikliklərin baş verməsi zəhlətökəndir və Terraform modullarında geriyə uyğun olmayan dəyişikliklərin edilməsi də eynilə bezdiricidir. Terraform modullarından istifadə edərkən git teqlərindən və semverdən istifadə etmək tövsiyə olunur.

İstehsal xidmətiniz laptopunuzda və ya məlumat mərkəzində işləyir?

Hashicorp kimi alətlərə malikdir terraform bulud Terraformunuzu idarə etmək üçün. Bu mərkəzləşdirilmiş xidmətlər ərazi dəyişikliklərini idarə etməyi, yoxlamağı və təsdiq etməyi asanlaşdırır.

Testlər yazmırsan?

Mühəndislər kodun sınaqdan keçirilməsinin lazım olduğunu başa düşürlər, lakin Terraform ilə işləyərkən özləri tez-tez sınaqdan keçirməyi unudurlar. İnfrastruktur üçün bu, xain anlarla doludur. Məsləhətim CI/CD zamanı sınaqdan keçirmək üçün düzgün yerləşdirilə bilən modullardan istifadə edərək yığınları "sınamaq" və ya "nümunə yaratmaq"dır.

Terraform və mikroservislər

Mikroservis şirkətlərinin həyatı və ölümü yeni mikroservis iş bloklarının sürətindən, innovasiyasından və pozulmasından asılıdır.

Mikroservis arxitekturaları ilə əlaqəli və aradan qaldırıla bilməyən ən çox yayılmış mənfi cəhət kodla deyil, işlə bağlıdır. Əgər siz Terraformu mikroservis arxitekturasının yalnız infrastruktur tərəfini avtomatlaşdırmağın bir yolu kimi düşünürsünüzsə, o zaman sistemin əsl faydalarını əldən vermiş olursunuz. İndi artıq hər şey kod kimidir.

Mənbə: www.habr.com

Добавить комментарий