Terraform-dan CloudFormation-ga o'tdi - va bundan afsusdaman

Infratuzilmani takrorlanadigan matn formatida kod sifatida ko'rsatish sichqonlar bilan o'ynashni talab qilmaydigan tizimlar uchun oddiy eng yaxshi amaliyotdir. Ushbu amaliyotning nomi bor - Kod sifatida infratuzilma, va hozirgacha uni amalga oshirish uchun ikkita mashhur vosita mavjud, ayniqsa AWSda: Terraform и CloudFormation.

Terraform-dan CloudFormation-ga o'tdi - va bundan afsusdaman
Terraform va CloudFormation bilan tajribani solishtirish

Kelishdan oldin qisuvchi (U Amazon Jr.) Men ishladim bitta startapda va Terraformdan uch yil foydalandi. Yangi joyda men Terraform-dan bor kuchim bilan foydalandim va keyin kompaniya Amazon-dagi hamma narsaga, shu jumladan CloudFormation-ga o'tishni boshladi. Men ikkalasi uchun ham eng yaxshi amaliyotlarni ishlab chiqdim va ikkala vositadan ham juda murakkab, tashkilot miqyosidagi ish jarayonlarida foydalandim. Keyinchalik, Terraform-dan CloudFormation-ga o'tishning oqibatlarini o'ylab ko'rganimdan so'ng, men Terraform tashkilot uchun eng yaxshi tanlov ekanligiga amin bo'ldim.

Terraform dahshatli

Beta dasturiy ta'minot

Terraform hali 1.0 versiyasini chiqarmagan, bu uni ishlatmaslik uchun yaxshi sababdir. Men buni birinchi marta sinab ko'rganimdan beri juda o'zgardi, lekin o'sha paytda terraform apply ko'pincha bir necha yangilanishlardan keyin yoki bir necha yil foydalanishdan keyin buziladi. Men "hozir hamma narsa boshqacha", deb aytardim, lekin... hamma shunday deyapti shekilli, shunday emasmi? Oldingi versiyalarga mos kelmaydigan o'zgarishlar mavjud, garchi ular mos bo'lsa-da va hatto resurs do'konlarining sintaksisi va abstraktsiyalari endi bizga kerak bo'lgan narsaga o'xshaydi. Asbob haqiqatan ham yaxshilanganga o'xshaydi, lekin... :-0

Boshqa tomondan, AWS orqaga qarab muvofiqlikni saqlab qolish uchun yaxshi ish qildi. Buning sababi shundaki, ularning xizmatlari ko'pincha tashkilot ichida sinchkovlik bilan tekshiriladi va shundan keyingina nomi o'zgartiriladi va nashr etiladi. Shunday qilib, "ular qattiq harakat qilishdi" - bu juda kam. AWS kabi xilma-xil va murakkab tizim uchun API bilan orqaga qarab muvofiqlikni saqlab qolish juda qiyin. Keng tarqalgan bo'lib qo'llaniladigan umumiy API-larni saqlashga majbur bo'lgan har bir kishi buni ko'p yillar davomida qilish qanchalik qiyinligini tushunishi kerak. Ammo CloudFormation-ning xatti-harakati, mening xotiramda, yillar davomida hech qachon o'zgarmadi.

Oyog'i bilan tanishing ... bu o'q

Men bilishimcha, resursni o'chirib tashlang begona CF stekingizdan CloudFormation stekini olish mumkin emas. Terraform bilan ham xuddi shunday. Bu sizga mavjud resurslarni stekingizga import qilish imkonini beradi. Funktsiyani ajoyib deb aytish mumkin, lekin katta kuch bilan katta mas'uliyat keladi. Siz shunchaki stekga resurs qo'shishingiz kerak va siz stek bilan ishlayotganingizda bu resursni o'chira olmaysiz yoki o'zgartira olmaysiz. Bir kuni bu teskari natija berdi. Bir kuni Twitch-da kimdir tasodifan boshqa birovning AWS xavfsizlik guruhini o'zining Terraform stekiga import qildi, lekin hech qanday yomonlik qilmadi. Men bir nechta buyruqlarni kiritdim va ... xavfsizlik guruhi (kiruvchi trafik bilan birga) g'oyib bo'ldi.

Terraform ajoyib

Tugallanmagan holatlardan tiklanish

Ba'zan CloudFormation bir holatdan ikkinchisiga to'liq o'tolmaydi. Shu bilan birga, u avvalgisiga qaytishga harakat qiladi. Afsuski, bu har doim ham mumkin emas. Keyinchalik nima sodir bo'lganligini tuzatish juda qo'rqinchli bo'lishi mumkin - CloudFormation uni buzishdan xursand bo'ladimi yoki yo'qligini hech qachon bilmaysiz - hatto uni tuzatish uchun ham. Oldingi holatga qaytish mumkinmi yoki yo'qmi, u haqiqatan ham qanday aniqlashni bilmaydi va sukut bo'yicha mo''jizani kutish uchun soatlab osadi.

Boshqa tomondan, Terraform muvaffaqiyatsiz o'tishlardan ancha chiroyli tarzda tiklanadi va ilg'or disk raskadrovka vositalarini taklif qiladi.

Hujjat holatidagi o'zgarishlar aniqroq

“Yaxshi, yuk balansi, siz o'zgaryapsiz. Lekin qanday?"

— xavotirli muhandis, “qabul qilish” tugmasini bosishga tayyor.

Ba'zan men CloudFormation stekidagi yuk balansi bilan ba'zi manipulyatsiyalar qilishim kerak, masalan, port raqamini qo'shish yoki xavfsizlik guruhini o'zgartirish. ClouFormation o'zgarishlarni yomon ko'rsatadi. Men, ignalar va ignalar ustida, yaml faylini o'n marta qayta tekshirib ko'raman, men kerakli narsalarni o'chirmagan va keraksiz hech narsa qo'shmaganligimga ishonch hosil qilaman.

Terraform bu borada ancha shaffof. Ba'zan u hatto juda shaffof (o'qing: zerikarli). Yaxshiyamki, eng so'nggi versiya o'zgarishlarni yaxshilangan ko'rsatishni o'z ichiga oladi, shunda siz hozir aynan nima o'zgarib borayotganini ko'rishingiz mumkin.

Moslashuvchanlik

Dasturiy ta'minotni orqaga qarab yozing.

Ochig'ini aytganda, uzoq muddatli dasturiy ta'minotning eng muhim xususiyati o'zgarishlarga moslashish qobiliyatidir. Har qanday dasturiy ta'minotni orqaga yozing. Ko'pincha men "oddiy" xizmatni qo'llash orqali xatolarga yo'l qo'yganman va keyin hamma narsani bitta CloudFormation yoki Terraform stekiga to'plashni boshlaganman. Va, albatta, bir necha oy o'tgach, men hamma narsani noto'g'ri tushunganim ma'lum bo'ldi va xizmat aslida oddiy emas edi! Va endi men qandaydir tarzda katta stekni kichik qismlarga ajratishim kerak. CloudFormation bilan ishlaganingizda, buni faqat mavjud stekni qayta yaratish orqali amalga oshirish mumkin va men buni ma'lumotlar bazalarim bilan qilmayman. Boshqa tomondan, Terraform stekni ajratish va uni yanada tushunarli kichikroq qismlarga ajratish imkonini berdi.

Gitdagi modullar

Terraform kodini bir nechta steklar bo'ylab almashish CloudFormation kodini almashishdan ko'ra osonroqdir. Terraform yordamida siz kodingizni git omboriga joylashtirishingiz va semantik versiya boshqaruvi yordamida unga kirishingiz mumkin. Ushbu omborga kirish huquqiga ega har kim umumiy koddan qayta foydalanishi mumkin. CloudFormation-ning ekvivalenti S3, lekin u bir xil afzalliklarga ega emas va S3 foydasiga git-dan umuman voz kechishimizga hech qanday sabab yo'q.

Tashkilot o'sdi va umumiy steklarni almashish qobiliyati juda muhim darajaga yetdi. Terraform bularning barchasini oson va tabiiy qiladi, CloudFormation esa shunga o'xshash biror narsaga ega bo'lishingizdan oldin sizni halqalardan o'tishga majbur qiladi.

Kod sifatida operatsiyalar

"Keling, uni skript qilamiz va yaxshi."

— Terraform velosipedini ixtiro qilishdan 3 yil oldin muhandis.

Dasturiy ta'minotni ishlab chiqish haqida gap ketganda, Go yoki Java dasturi shunchaki kod emas.

Terraform-dan CloudFormation-ga o'tdi - va bundan afsusdaman
Kod sifatida kod

U ishlaydigan infratuzilma ham mavjud.

Terraform-dan CloudFormation-ga o'tdi - va bundan afsusdaman
Kod sifatida infratuzilma

Lekin u qayerdan? Uni qanday kuzatish mumkin? Sizning kodingiz qayerda yashaydi? Ishlab chiquvchilarga kirish ruxsati kerakmi?

Terraform-dan CloudFormation-ga o'tdi - va bundan afsusdaman
Kod sifatida operatsiyalar

Dasturiy ta'minotchi bo'lish shunchaki kod yozishni anglatmaydi.

AWS yagona emas: ehtimol siz boshqa provayderlardan foydalanasiz. SignalFx, PagerDuty yoki Github. Ehtimol sizda CI/CD uchun ichki Jenkins serveri yoki monitoring uchun ichki Grafana boshqaruv paneli mavjuddir. Infra as Code turli sabablarga ko'ra tanlanadi va ularning har biri dasturiy ta'minot bilan bog'liq barcha narsalar uchun bir xil darajada muhimdir.

Twitch’da ishlaganimda biz Amazon’ning aralash o‘rnatilgan va AWS tizimlari ichidagi xizmatlarni tezlashtirdik. Biz ko'plab mikroservislarni to'xtatdik va qo'llab-quvvatladik, bu esa operatsion xarajatlarni oshirdi. Munozaralar quyidagicha kechdi:

  • Я: Jin ursin, bu bitta mikroservisni overclock qilish uchun juda ko'p ishoralar. AWS hisobini yaratish uchun men ushbu axlatdan foydalanishim kerak (biz 2 ta hisob qaydnomasiga o'tdik mikroservis), keyin bu ogohlantirishlarni o'rnatish uchun, bu kodlar ombori uchun, bu elektron pochta ro'yxati uchun, keyin esa bu...
  • Qo'rg'oshin: Keling, uni skript qilamiz va yaxshi.
  • Я: Yaxshi, lekin skriptning o'zi o'zgaradi. Ushbu o'rnatilgan Amazon gizmoslarining barchasi yangilanganligini tekshirish usuli kerak bo'ladi.
  • Qo'rg'oshin: Juda yaxshi. Va biz buning uchun skript yozamiz.
  • Я: Ajoyib! Va skript, ehtimol, hali ham parametrlarni o'rnatishi kerak bo'ladi. U ularni qabul qiladimi?
  • Qo'rg'oshin: Qaerga ketsa, ketaversin!
  • Я: Jarayon o'zgarishi mumkin va orqaga qarab muvofiqlik yo'qoladi. Semantik versiyani boshqarishning bir turi kerak bo'ladi.
  • Qo'rg'oshin: Ajoyib fikr!
  • Я: Asboblarni foydalanuvchi interfeysi ichida qo'lda o'zgartirish mumkin. Buni tekshirish va tuzatish usuli kerak.

…3 yildan keyin:

  • Qo'rg'oshin: Va bizda terraform bor.

Hikoyaning axloqi: hatto siz bo'lsangiz ham hamma narsada Amazonda bosh egiladi, siz hali ham AWS'dan bo'lmagan narsadan foydalanmoqdasiz va bu xizmatlar ushbu holatni sinxronlashtirish uchun konfiguratsiya tilidan foydalanadigan holatga ega.

CloudFormation lambda va git modullari terraform

lambda - bu CloudFormation-ning maxsus mantiqiy muammoga yechimidir. Lambda bilan mumkin makroslarni yaratish yoki foydalanuvchi resursi. Ushbu yondashuv Terraformning git modullarining semantik versiyalarida mavjud bo'lmagan qo'shimcha murakkabliklarni taqdim etadi. Men uchun eng dolzarb muammo bu barcha foydalanuvchi lambdalari uchun ruxsatlarni boshqarish edi (va bu o'nlab AWS hisoblari). Yana bir muhim muammo "nima birinchi bo'lib keldi, tovuqmi yoki tuxummi?" muammosi: bu lambda kodi bilan bog'liq edi. Ushbu funktsiyaning o'zi infratuzilma va koddir va uning o'zi monitoring va yangilanishlarga muhtoj. Tabutdagi oxirgi tirnoq lambda kodini o'zgartirishni semantik yangilashda qiyinchilik edi; shuningdek, biz to'g'ridan-to'g'ri buyruqsiz stek harakatlari yugurishlar orasida o'zgarmasligiga ishonch hosil qilishimiz kerak edi.

Esimda, bir marta klassik yuk balanslagichi bilan Elastic Beanstalk muhiti uchun kanareykalarni joylashtirishni yaratmoqchi edim. Eng oson narsa ishlab chiqarish muhiti yonida EB uchun ikkinchi o'rnatishni amalga oshirish bo'lib, uni bir qadam oldinga olib boradi: avtomatik o'lchamdagi kanareykalarni joylashtirish guruhini ishlab chiqarish muhitiga joylashtirish LB bilan birlashtirish. Va Terraform foydalangandan beri Xulosa sifatida ASG beantalk, buning uchun Terraform-da 4 ta qo'shimcha kod satri kerak bo'ladi. CloudFormation-da shunga o'xshash yechim bor-yo'qligini so'raganimda, ular meni 4 qatorli Terraform kodlari qila oladigan narsa uchun joylashtirish quvuri va hamma narsaga ega bo'lgan butun git omboriga ishora qilishdi.

Driftni yaxshiroq aniqlaydi

Haqiqat kutganlarga mos kelishiga ishonch hosil qiling.

Driftni aniqlash kod xususiyati sifatida juda kuchli operatsiyalardir, chunki u haqiqat kutganlarga mos kelishini ta'minlashga yordam beradi. U CloudFormation va Terraform bilan ham mavjud. Ammo ishlab chiqarish to'plami o'sishi bilan CloudFormation-da driftni qidirish tobora ko'proq noto'g'ri aniqlashlarni keltirib chiqardi.

Terraform yordamida siz driftni aniqlash uchun ancha ilg'or hayot aylanish ilgaklariga egasiz. Masalan, siz buyruqni kiritasiz o'zgarishlarni hisobga olmang to'g'ridan-to'g'ri ECS topshiriq ta'rifida, agar siz butun ECS joylashtirishingizdagi o'zgarishlarni e'tiborsiz qoldirmasdan, muayyan vazifa ta'rifiga kiritilgan o'zgarishlarni e'tiborsiz qoldirmoqchi bo'lsangiz.

CDK va CloudFormation kelajagi

CloudFormation-ni katta, o'zaro infratuzilma miqyoslarida boshqarish qiyin. Ushbu qiyinchiliklarning ko'pchiligi tan olinadi va vosita shunga o'xshash narsalarga muhtoj aws-cdk, kodda bulutli infratuzilmani aniqlash va uni AWS CloudFormation orqali ishga tushirish uchun asos. Kelajakda aws-cdk uchun nima bo'lishini ko'rish qiziqarli bo'ladi, lekin Terraformning boshqa kuchli tomonlari bilan raqobatlash qiyin bo'ladi; CloudFormation-ni yangilash uchun global o'zgarishlar talab qilinadi.

Shunday qilib, Terraform umidsizlikka tushmaydi

Bu "matn sifatida" emas, balki "infratuzilma kod sifatida".

Terraform haqidagi birinchi taassurotim juda yomon edi. Men shunchaki yondashuvni tushunmadim deb o'ylayman. Deyarli barcha muhandislar uni ixtiyoriy ravishda kerakli infratuzilmaga aylantirilishi kerak bo'lgan matn formati sifatida qabul qilishadi. BUNDAY QILISH KERAK EMAS.

Yaxshi dasturiy ta'minot ishlab chiqishning haqiqatlari Terraformga ham tegishli.

Men Terraformda yaxshi kod yaratish uchun qabul qilingan ko'plab amaliyotlarni ko'rdim. Yaxshi dasturchi bo'lish uchun ko'p yillar o'qigansiz. Terraform bilan ishlayotganingiz uchun bu tajribadan voz kechmang. Yaxshi dasturiy ta'minotni ishlab chiqishning haqiqatlari Terraformga tegishli.

Qanday qilib kodni hujjatlashtirib bo'lmaydi?

Men hech qanday hujjatsiz katta Terraform steklarini ko'rdim. Qanday qilib sahifalarda kod yozish mumkin - mutlaqo hech qanday hujjatsiz? O'zingizni tushuntiradigan hujjatlarni qo'shing kodi Terraform ("kod" so'ziga urg'u), nima uchun bu bo'lim juda muhim va siz nima qilasiz.

Bir paytlar bitta katta main() funksiyasi bo'lgan xizmatlarni qanday o'rnatishimiz mumkin?

Men bitta modul sifatida taqdim etilgan juda murakkab Terraform steklarini ko'rdim. Nega biz dasturiy ta'minotni shu tarzda joylashtirmaymiz? Nima uchun biz katta funktsiyalarni kichikroqlarga ajratamiz? Xuddi shu javoblar Terraform uchun ham amal qiladi. Agar sizning modulingiz juda katta bo'lsa, uni kichikroq modullarga bo'lishingiz kerak.

Sizning kompaniyangiz kutubxonalardan foydalanmaydimi?

Men muhandislar Terraform yordamida yangi loyihani yaratib, ahmoqona tarzda boshqa loyihalardan katta qismlarni o‘zlariga nusxa ko‘chirganlarini va keyin u ishlay boshlagunga qadar ular bilan aralashib ketganini ko‘rdim. Sizning kompaniyangizda "jangovar" kod bilan shunday ishlaysizmi? Biz shunchaki kutubxonalardan foydalanmaymiz. Ha, Hamma narsa kutubxona bo'lishi shart emas, lekin printsipial jihatdan umumiy kutubxonalarsiz qayerdamiz?!

PEP8 yoki gofmt dan foydalanmayapsizmi?

Ko'pgina tillarda standart, qabul qilingan formatlash sxemasi mavjud. Pythonda bu PEP8. Go'da - gofmt. Terraformning o'ziga xos xususiyati bor: terraform fmt. Sog'ligingiz uchun zavqlaning!

JavaScript-ni bilmasdan React-dan foydalanasizmi?

Terraform modullari siz yaratgan murakkab infratuzilmaning bir qismini soddalashtirishi mumkin, ammo bu siz u bilan umuman shug'ullana olmaysiz degani emas. Resurslarni tushunmasdan Terraformdan to'g'ri foydalanmoqchimisiz? Siz mahkumsiz: vaqt o'tadi va siz hech qachon Terraformni o'zlashtirolmaysiz.

Singletonlar yoki qaramlik in'ektsiyasi bilan kodlashyapsizmi?

Bog'liqlik in'ektsiyasi dasturiy ta'minotni ishlab chiqish uchun tan olingan eng yaxshi amaliyot bo'lib, singletonlarga qaraganda afzalroqdir. Bu Terraformda qanday foydali? Men masofaviy holatga bog'liq bo'lgan Terraform modullarini ko'rdim. Masofaviy holatni oladigan modullarni yozish o'rniga, parametrlarni qabul qiluvchi modulni yozing. Va keyin ushbu parametrlarni modulga o'tkazing.

Kutubxonalaringiz o'nta narsani yaxshi qiladimi yoki bitta narsani yaxshi qiladimi?

Eng yaxshi ishlaydigan kutubxonalar o'zlari juda yaxshi bajaradigan bitta vazifaga e'tibor qaratadigan kutubxonalardir. Bir vaqtning o'zida hamma narsani qilishga harakat qiladigan katta Terraform modullarini yozish o'rniga, ularning bitta ishni yaxshi bajaradigan qismlarini yarating. Va keyin kerak bo'lganda ularni birlashtiring.

Qanday qilib orqaga mos kelmasdan kutubxonalarga o'zgartirishlar kiritasiz?

Oddiy kutubxona kabi umumiy Terraform moduli qandaydir tarzda foydalanuvchilarga orqaga qarab mos kelmasdan o'zgarishlarni etkazishi kerak. Kutubxonalarda bunday o‘zgarishlar sodir bo‘lganda, bu zerikarli va Terraform modullarida orqaga mos kelmaydigan o‘zgarishlar ham xuddi shunday bezovta qiladi. Terraform modullaridan foydalanishda git teglari va semverdan foydalanish tavsiya etiladi.

Sizning ishlab chiqarish xizmatingiz noutbukda yoki ma'lumot markazida ishlayaptimi?

Hashicorp kabi vositalarga ega terraform bulut terraformingizni ishga tushirish uchun. Ushbu markazlashtirilgan xizmatlar hududiy o'zgarishlarni boshqarish, tekshirish va tasdiqlashni osonlashtiradi.

Testlarni yozmaysizmi?

Muhandislar kodni sinab ko'rish kerakligini tan olishadi, lekin ular Terraform bilan ishlashda ko'pincha sinovni unutishadi. Infratuzilma uchun bu xoin daqiqalar bilan to'la. Mening maslahatim - CI/CD paytida sinovdan o'tkazish uchun to'g'ri joylashtirilishi mumkin bo'lgan modullar yordamida steklarni "sinov qilish" yoki "misol yaratish".

Terraform va mikroservislar

Mikroservis kompaniyalarining hayoti va o'limi tezligi, innovatsiyalari va yangi mikroservis ishchi bloklarining buzilishiga bog'liq.

Mikroservis arxitekturalari bilan bog'liq bo'lgan va yo'q qilib bo'lmaydigan eng keng tarqalgan salbiy jihat kod bilan emas, balki ish bilan bog'liq. Agar siz Terraformni mikroservislar arxitekturasining faqat infratuzilma tomonini avtomatlashtirish usuli deb hisoblasangiz, tizimning haqiqiy afzalliklaridan mahrum bo‘lasiz. Endi allaqachon hamma narsa kodga o'xshaydi.

Manba: www.habr.com

a Izoh qo'shish