Kod şəklində infrastrukturun təqdimatı - sistemlər üçün ən yaxşı praktikadır ki, bunun üçün heç bir qavrayışa ehtiyac yoxdur. Bu praktikaya " ", və onun həyata keçirilməsi üçün, xüsusən də AWS-də, iki populyar alət var: və .

Terraform və CloudFormation ilə iş təcrübəmi müqayisə edirəm
Amazon Jr.-a gəlməmişdən əvvəl (yəni ) bir startapda işləyirdim Terraform Kakofoniyası
Beta versiyası
Terraform-un hələ 1.0 versiyası belə çıxmayıb, bu isə onun istifadəsinə ciddi bir səbəbdir. İlk dəfə onu sınadığım zaman çox dəyişdi, amma o vaxtlar "
terraform apply bir neçə yeniləmədən sonra tez-tez xarab olurdu və ya sadəcə bir neçə illik istismardan sonra. Deyə bilərdim ki, "indiki vaxtda hər şey fərqlidir", lakin... belə ancaq hamı deyir, elə deyilmi? Sürümə uyğun olmayan dəyişikliklər var, amma onlar mütləq yerindır, hətta resurs anbarlarının sintaksisi və abstraksiyaları da indi ideal görünür. Alət sanki həqiqətən daha yaxşı olub, amma... Digər tərəfdən, AWS əvvəllər sürümlərlə uyğunluğu dəstəklədiyi üçün yaxşı işlər görüb. Hamısı, ehtimal ki, onların xidmətlərini təşkilat daxilində yaxşı test edir və yalnız sonra başlığını dəyişərək açıqlayır. Odur ki, "yaxşı iş görüblər" demək hələ də zəif bir ifadədir. AWS kimi çox variantlı və mürəkkəb bir sistem üçün API-lərin köhnə sürümlərlə uyğunluğunu saxlamaq inanılmaz dərəcədə çətindir. İctimai API-ləri illərlə dəstəkləməyə çalışan hər kəs başa düşməlidir ki, bu, nə qədər çətindir. Amma CloudFormation-un davranışı isə mənim xatirimdə heç bir dəfə illər ərzində dəyişməyib.
Tanış ol, ayaq... bu isə güllədir
Bildiyimə görə, xarici resursu
silmək xarici CloudFormation stekini öz CF stekindən keçirmək mümkün deyil. Terraformla da vəziyyət demək olar ki, eynidir. O, mövcud resursları öz stekinə idxal etməyə imkan tanıyır. Funksiya, demək olar ki, möhtəşəmdir, amma böyük güc ilə birlikdə böyük məsuliyyət də gəlir. Yalnız resursu steyə daxil etmək kifayətdir və sen öz stekinlə işləyərkən bu resursu silmək və ya dəyişmək mümkün deyil. Bir dəfə buna görə bəlalı bir vəziyyət yarandı. Twitch saytında kiminsə, heç bir pis niyyət olmadan, təsadüfən birinin AWS təhlükəsizlik qrupunu öz Terraform stekinə idxal etməsi oldu. Bir neçə əmri daxil etdi və... təhlükəsizlik qrupu (gələn trafiklə birlikdə) itib.
Terraform Böyük
Tam olmayan vəziyyətlərdən bərpa
Bəzən CloudFormation bir vəziyyətdən digərinə tam keçə bilmir. Bununla bərabər, o, əvvəlki vəziyyətə qayıtmağa çalışacaq. Təəssüf ki, bu hər zaman mümkün olmur. Sonraki nəticələri düzəltmək bəzən qorxunc olur — heç vaxt bilmirik ki, CloudFormation onun haker edildiyini, hətta düzəltmək üçün, sevinəcəkmi. Əvvəlki vəziyyətə qayıtmağı bacarıb-bacarmayacağını demək çətindir, və o, adətən möcüzəni gözləməklə saatlar keçir.
Terraform isə, əksinə, uğursuz keçidlərdən sonra daha zərif şəkildə bərpa olunmağa meyillidir və genişləndirilmiş debuq alətlərini təqdim edir.
Sənədin vəziyyətlərində daha aşkar dəyişikliklər
«Yaxşı, balanslaşdırıcı, sən dəyişirsən. Amma necə?»
— qorxulu mühəndis, «qəbul etmək» düyməsini basmağa hazır.
Bəzən CloudFormation stekində balanslaşdırıcı ilə bir neçə manipulasiya aparmalıyam — məsələn, port nömrəsini əlavə etmək və ya təhlükəsizlik qrupunu dəyişdirmək. CloudFormation dəyişiklikləri zəif göstərir. Mən isə, həyəcanla, bir on dəfə yaml faylını yenidən yoxlayıram ki, lazım olan bir şeyi silmədim və ya artıq bir şey əlavə etmədim.
Terraform bu məsələdə daha şəffafdır. Bəzən hətta çox şəffafdır (oxu: bezdirir). Xoşbəxtlikdən, son versiyaya yaxşılaşdırılmış dəyişikliklərin göstərilməsi əlavə edildi — indi dəqiq görünür ki, nə dəyişir.
Fleksiblilik
Proqramı geridən yazın.
Düzdürsə, uzunmüddətli proqram təminatının ən vacib fərqləndirici xüsusiyyəti dəyişikliklərə uyğunlaşma qabiliyyətidir. Hər hansı bir proqramı geridən yazmalısınız. Mən tez-tez bu «sadə» servisi götürməkdə səhv etmişəm, sonra isə onu CloudFormation və ya Terraform stekində bir yerdə doldurmağa çalışmışam. Təbii ki, aylar sonra ortaya çıxır ki, mən hər şeyi pis başa düşmüşəm və xidmət əslində sadə deyil! Və beləliklə, böyük steki kiçik hissələrə parçalamaq lazımdır. CloudFormation ilə işlədikdə, bunu yalnız mövcud steyi yenidən yaratdıqdan sonra edə bilərsiniz, amma mən, öz DB-lərimlə bunu etməzdim. Terraform isə steyi diseksləməyə və onu daha anlaşıqlı kiçik hissələrə ayırmağa imkan verirdi.
Git-də modullar
Terraform kodunu çoxsaylı steklər arasında paylaşmaq, CloudFormation kodunu paylaşmaqdan daha asandır. Terraform ilə kodu git deposuna yerləşdirə bilərsiniz və ona semantik versiya idarə etməsi ilə müraciət edə bilərsiniz. Bu depoya çıxışı olan hər kəs, paylaşılmış kodu yenidən istifadə edə bilər. CloudFormation üçün müvafiq olan S3-dür, lakin onun eyni üstünlükləri yoxdur və git-dən S3-ə keçmək üçün heç bir səbəbimiz yoxdur.
Təşkilat böyüyürdü və ümumi stekləri paylaşmaq qabiliyyəti kritik səviyyəyə çatmışdı. Terraform ilə bütün bunlar asan və təbii olur, halbuki CloudFormation sizi bunun üçün bir neçə təhlükəyə məruz qaldırır.
Kod kimi əməliyyatlar
„Skripti yazarıq və bitirəcəyik.“
— mühəndis, Terraformun ixtira edilməsindən 3 il əvvəl.
Proqram təminatı inkişaf etdirmə məsələsindən danışarkən, Go və ya Java proqramı sadəcə kod deyil.

Kod kimi kod
Amma onun işlədiyi infrastruktur da var.

İnfrastruktur Kod kimi
Amma o orada haradan gəlir? Necə izlənir? Kodunuz haradadır? Tərtibatçılara çıxış icazəsi lazımdırmı?

Kod kimi əməliyyatlar
Proqram təminatı inkişaf etdiricisi olmaq, sadəcə kod yazmaq deyil.
Sadəcə AWS ilə kifayətlənməyin: güman ki, siz digər provayderlərin xidmətlərindən də istifadə edirsiniz. SignalFx, PagerDuty və ya Github. Bəlkə də, CI/CD üçün daxili Jenkins serveriniz var ya da monitorinq üçün daxili Grafana idarəetmə paneliniz var. Infra as Code müxtəlif səbəblərlə seçilir və heç biri proqram təminatı ilə bağlı hər şeydən az önəmli deyil.
Twitch-də işlədiyim zaman, biz AWS Amazon-dakı qarışıq sistemlər içində xidmətləri sürətləndirirdik. Biz bir çox mikro xidmətləri istehsal edirdik və onları qoruyurdur, beləliklə, istismar xərcləri artırdı. Müzakirələr belə baş verirdi:
- Mən: Vay, bir mikro xidməti işə salmaq üçün çox hərəkət var. Mən bu şeyi istifadə etməliyəm ki, AWS hesabı yarada bilim (biz 2 hesab əldə etməyə çalışırdıq mikro xidməti), sonra bu bildirişlər üçün, hələ bu - kod deposu üçün, və bu - e-poçt ünvanlarının siyahısı üçün, və bu…
- Lider: Skripti yazarıq.
- Mən: Yaxşı, amma skript dəyişəcək. Amazonun bütün bu sistemlərinin aktuallığını təmin edəcək bir yol olmalıdır.
- Lider: Qulaq asın, yaxşı səslənir. Bunu yazmalıyıq.
- Mən: Gözəl! Skriptə mütləq parametrlər verməliyik. Onları qəbul edəcəkmi?
- Lider: Bəli, qəbul edəcək, harada olsa!
- Mən: Proses dəyişə bilər, geriyə uyğunluq itiriləcək. Bəzi semantik versiya idarə etməyə ehtiyac olacaq.
- Lider: Əla fikirdir!
- Mən: Alətləri əllə, istifadəçi interfeysində dəyişmək olar. Bunu yoxlamaq və düzəltmək üçün bir yol olmalıdır.
…3 il sonra:
- Lider: Və bizim terraform yarandı.
Bu hekayənin morali belədir: hətta əgər siz özünüzü tamamilə amazon sisteminə qoşsanız, hələ də AWS-dən olmayan bir şeydən istifadə edirsiniz və bu xidmətlərin konfiqurasiya üçün dil istifadə edən bir vəziyyəti var ki, bu da həmin vəziyyəti senkronizasiya edir.
CloudFormation lambda vs git-modulları terraform
lambda — CloudFormation-un istifadəçi məntiqi sualı üçün həllidir. Lambda vasitəsiylə və . Bu yanaşma, Terraform-un git-modullarında semantik versiya kontrolü ilə olmayan əlavə çətinliklər təqdim edir. Mənim üçün ən aktual problem, bu istifadəçi lambdas üçün bütün icazələrin idarə olunması oldu (bu isə onlarla AWS hesabı deməkdir). İkinci dərəcəli problem isə 'ilk nə oldu — toyuq yoxsa yumurta?' sualıyla bağlı idi: bu, lambda kodu ilə bağlı idi. Bu funksiya — infrastruktur və kod, və o, öz monitorinqi və yeniləmələrə ehtiyac duyurdu. Lambdanın kodundakı dəyişikliklərin semantik yenilənməsi ilə bağlı çətinlik sonuncu mədh oldu; üstəlik, yüklənmələr arasında vaxtında baxış olmadan, yığın fəaliyyətlərinin dəyişməməsini də təmin etməli idik.
Yadımda, bir dəfə Elastic Beanstalk mühiti üçün klassik yük balanslaşdırıcısı ilə kanar paylaması yaratmaq istədim. EB üçün istehsal mühitinin yanında başqa bir yerləşdirmə etmək daha asan olardı, əlavə bir addım ataraq: avtomatik miqyaslanan kanar paylaması qrupunu istehsal mühitindəki LB yerləşdirməsi ilə birləşdirmək. Terraform , bunun üçün Terraform-da 4 əlavə kod sətiri tələb olunacaq. CloudFormation-da uyğun bir həllin olub olmadığını soruşanda, mənə yerləşdirmə boru kəməri ilə dolu bir git reposuna işarə etdilər: və bütün bunlar, 4 sətir kodun Terraform-da edə biləcəyi üçündü.
O, drift aşkar etmədə daha yaxşıdır
Reallığın gözləntilərə uyğun olduğuna əmin olun.
— operations as code-da çox güclü bir funksiyadır, çünki reallığın gözləntilərə uyğun olduğunu təmin etməyə kömək edir. Bu, həm CloudFormation, həm də Terraform ilə mümkündür. Ancaq iş yığanınız böyüdükcə, CloudFormation-da drift axtarışı daha çox səhv aşkar etməyə başlayır.
Terraform-da drift aşkar etmək üçün daha inkişaf etmiş dövrə gözləmələri var. Məsələn, istədiyiniz halda müəyyən bir tapşırıq tərifində dəyişikləri gözardı etmək istədiyinizdə, komandaya birbaşa ECS tapşırığının tərifində daxil edirsiniz, beləliklə, ECS yerləşdirməsinin bütün dəyişikliklərini yox saymadan, müəyyən bir tapşırığın tərifindəki dəyişiklikləri gözardı edirsiniz.
CDK və CloudFormation-un gələcəyi
CloudFormation, böyük, infrastrukturar aralıqlarda idarə etmək çətindir. Bu çətinliklərin bir çoxu qəbul edilmişdir və vasitənin buna ehtiyacı var , bulud infrastrukturasını kodda müəyyənləşdirmək üçün bir quruluş və onu AWS CloudFormation vasitəsilə keçirmək. AWS CDK-nın gələcəkdə nə ilə üzləşəcəyini görmək maraqlı olacaq, lakin Terraform-un digər üstünlükləri ilə rəqabət aparmaq onun üçün çətin olacaq; CloudFormation-u bərabər gətirmək üçün qlobal dəyişikliklər tələb olunacaq.
Terraform sizi məyus etməsin
Bu, «kod olaraq infrastrukturnu» ifadə edir, «mətin olaraq» deyil.
Terraform haqqında ilk təəssüratım çox pis idi. Düşünürəm ki, yanaşmanı tam anlamadım. Demək olar ki, bütün mühəndislər onu birbaşa mətin formatı kimi ələ alırlar, bunu arzu olunan infrastrukturlar halına çevirmək üçün. BU NECƏSİNDƏN OLMAZ.
Yaxşı proqram təminatı inkişafının aydın həqiqətləri Terraform-a da aiddir
Mən gördüm ki, yaxşı kod yaratmaq üçün qəbul olunan bir çox praktikalar Terraform-da nəzərə alınmır. Siz illərlə yaxşı proqramçı olmaq üçün öyrənmisiniz. Terraform ilə işlədiyinizə görə bu təcrübədən imtina etməyin. Yaxşı proqram təminatı inkişafının aydın həqiqətləri Terraform-a da aiddir.
Necə olur ki, kodu sənədləşdirmirsiniz?
Mən tam olaraq sənədləşdirmədən böyük Terraform paketlərinə rast gəldim. Kod yazmaq üçün səhifələrlə necə yaradırsınız — tamamilə sənədləşmədən? Sizin kodunuzun izahını verən sənədləri əlavə edin kod Terraform (burada «kod» sözünə vurğu edilir), bu bölmənin niyə bu qədər vacib olduğunu və nəyə görə olduğunu.
Necə olur ki, əvvəllər bir böyük main() funksiyası olan xidmətləri başlatmaq olmalıdır?
Mən çox mürəkkəb Terraform paketlərinə rast gəldim, hamısı bir moduldur. Niyə biz proqramı belə başlatmırıq? Niyə böyük funksiyaları daha kiçik hissələrə bölürük? Eyni cavablar Terraform üçün də doğrudur. Əgər modulunuz çox böyükdürsə — onu daha kiçik modullara parçalayın.
Sizin şirkətiniz kitabxanalardan istifadə etmir?
Mən gördüm ki, mühəndislər yeni bir layihəni Terraform ilə başlatarkən, digər layihələrdən böyük hissələri kopyalayıb özlərinə əlavə edərək, sonra işləməyə çaşdılar ki, işə başlasın. Siz öz şirkətinizdə «dövri» kodla belə işləyirdiniz? Biz sadəcə kitabxanalardan istifadə etməyik. Bəli, amma ümumi kitabxanasız hara gedirik?!
PEP8 və ya gofmt-dan istifadə etmirik?
Çoxsaylı dillərdə standart şablon formatlaşdırma var. Python-da bu PEP8-dir. Go-da — gofmt. Terraform-un da öz formatı var: terraform fmt. İstifadə edin!
React ilə JavaScript bilmirikmi?
Terraform modulları sizin yaratdığınız mürəkkəb infrastrukturanızın bir hissəsini sadələşdirə bilər, amma bu, demək deyil ki, siz onun içini heç bilmək olmaz. Terraform-u düzgün istifadə etmək istəyirsinizsə — qaçılmazsınız: zaman keçəcək, amma Terraform-u öyrənməyəcəksiniz.
Siz singleton-larla kod yazırsınız, yoxsa asılılıqları tətbiq edirsiniz?
Asılıqlara daxil olma, proqram təminatı inkişafı üçün ən yaxşı təcrübə kimi tanınır və singletons tərəfindən üstünlük verilir. Bu, Terraform-da necə faydalıdır? Mən, uzaq vəziyyətdən asılı olan Terraform modulları ilə qarşılaşdım. Uzaq vəziyyətdən məlumat çıxaran modullar yazmaq əvəzinə, parametr qəbul edən bir modul yazın. Və sonra bu parametrləri modula ötürün.
Kitabxanalarınız on şeyi yaxşı edirmi, yoxsa birini — mükəmməl?
Bir tapşırığa yönəlmiş kitabxanalar ən yaxşısıdır və onu mükəmməl yerinə yetirirlər. Hər şeyi eyni anda etməyə çalışan böyük Terraform modulları yazmaqdansa, onları tək bir şeyi yaxşı yerinə yetirən hissələrə ayırın. Və sonra lazımınca birləşdirin.
Kitabxanalarda geri uyğunluq olmadan dəyişiklikləri necə edirsiniz?
Ümumi Terraform modulu, adi kitabxana kimi, istifadəçilərə geri uyğunluq olmadan dəyişikliklər etdiyində bir şəkildə məlumat verməlidir. Kitabxanalarda baş verən belə dəyişikliklər narahat edir, eyni zamanda Terraform modullarında geri uyğunluq olmadan baş verən dəyişikliklər də narahat edir. Terraform modulları ilə istifadə edərkən git tags və semver tətbiq etməyi tövsiyə edirik.
İstehsal xidməti noutbukunuzda yoxsa verilənlər mərkəzindəmi işləyir?
Hashicorp-un belə alətləri var sizin terraform-u işə salmaq üçün. Bu mərkəzləşdirilmiş xidmətlər, terraform-un idarə edilməsini, auditini və dəyişikliklərinin təsdiqini asanlaşdırır.
Test yazmırsınız?
Mühəndislər kodu test etməli olduqlarını qəbul edirlər, lakin Terraform ilə işləyərkən tez-tez testləri unudurlar. İnfrastruktur üçün bu, fəsadlı problemlərə yol aça bilər. Mən, CI/CD zamanı düzgün bir şəkildə yerləşdirilə bilən modulları istifadə edərək stekləri 'test etməyə' və ya 'nümunələr yaratmağa' tövsiyə edirəm.
Terraform və mikroservislər
Mikroservis şirkətlərinin həyatı və ömrü sürət, yenilənmə və yeni mikroservis iş stəklərinin dağıdılması ilə bağlıdır.
Mikroservis arxitekturalarının ən geniş yayılmış mənfi tərəfi, koddan deyil, işlə bağlıdır. Terraform-a yalnız mikroservis arxitekturasının infrastruktur tərəfini avtomatlaşdırmaq üçün yanaşsanız, bu sistemin əsl üstünlüklərindən məhrum olursunuz. İndi artıq .
Mənbə: habr.com
