Terraform-тан CloudFormation-қа ауысты - және өкіндім

Инфрақұрылымды қайталанатын мәтін пішіміндегі код ретінде көрсету тышқандармен араласуды қажет етпейтін жүйелер үшін қарапайым ең жақсы тәжірибе болып табылады. Бұл тәжірибенің атауы бар - Код ретінде инфрақұрылым, және әзірге оны жүзеге асырудың екі танымал құралы бар, әсіресе AWS-те: Terraform и CloudFormation.

Terraform-тан CloudFormation-қа ауысты - және өкіндім
Terraform және CloudFormation тәжірибесін салыстыру

Келгенге дейін Twitch (aka Amazon Jr.) Мен жұмыс істедім бір стартапта және үш жыл бойы Terraform пайдаланды. Жаңа жерде мен Terraform-ты бар күшіммен қолдандым, содан кейін компания Amazon-ның бәріне, соның ішінде CloudFormation-ға көшуді итермеледі. Мен екеуіне арналған ең жақсы тәжірибелерді мұқият әзірледім және екі құралды да өте күрделі, ұйымдық жұмыс процестерінде қолдандым. Кейінірек, Terraform-дан CloudFormation-қа көшудің салдарын мұқият таразылап болғаннан кейін, мен Terraform ұйым үшін ең жақсы таңдау екеніне көзім жетті.

Терраформа қорқынышты

Бета бағдарламалық жасақтамасы

Terraform әлі 1.0 нұсқасын шығарған жоқ, бұл оны пайдаланбаудың жақсы себебі. Мен оны алғаш рет өзім қолданып көргеннен бері көп өзгерді, бірақ сол кезде terraform apply жиі бірнеше жаңартулардан кейін немесе бірнеше жыл пайдаланудан кейін бұзылады. Мен «қазір бәрі басқаша» дер едім, бірақ... бәрі осылай айтатын сияқты, солай емес пе? Алдыңғы нұсқалармен үйлеспейтін өзгерістер бар, бірақ олар сәйкес болса да, тіпті ресурс қоймаларының синтаксисі мен абстракциялары бізге қажет нәрсе сияқты. Құрал шынымен жақсарған сияқты, бірақ... :-0

Екінші жағынан, AWS кері үйлесімділікті сақтай отырып, жақсы жұмыс жасады. Бұл олардың қызметтері ұйымда жиі мұқият тексеріліп, содан кейін ғана атауы өзгертіліп жарияланатындықтан болуы мүмкін. Демек, «олар көп тырысты» - бұл түсініксіз. AWS сияқты әртүрлі және күрделі жүйе үшін API интерфейстерімен кері үйлесімділікті сақтау өте қиын. Кеңінен қолданылатын жалпыға ортақ API интерфейстерін қолдауға тура келген кез келген адам мұны көптеген жылдар бойы жасау қаншалықты қиын екенін түсінуі керек. Бірақ менің жадымда CloudFormation әрекеті жылдар бойы өзгерген жоқ.

Аяқпен танысыңыз... бұл оқ

Менің білуімше, ресурсты жойыңыз аутсайдер CF стекінен CloudFormation стегі мүмкін емес. Терраформмен де солай. Ол бар ресурстарды стекке импорттауға мүмкіндік береді. Функцияны таңқаларлық деп айтуға болады, бірақ үлкен күшпен үлкен жауапкершілік келеді. Сізге тек стекке ресурс қосу керек және стекпен жұмыс істеп жатқанда бұл ресурсты жою немесе өзгерту мүмкін емес. Бір күні бұл кері әсер етті. Бір күні Twitch-те біреу кездейсоқ басқа біреудің AWS қауіпсіздік тобын өздерінің Terraform стекіне ешқандай бұзақылықсыз импорттады. Мен бірнеше командаларды енгіздім және... қауіпсіздік тобы (кіріс трафигімен бірге) жоғалып кетті.

Терраформ тамаша

Толық емес күйлерден қалпына келтіру

Кейде CloudFormation бір күйден екіншісіне толығымен ауыса алмайды. Сонымен бірге ол бұрынғыға қайта оралуға тырысады. Бұл әрқашан орындала бермейтіні өкінішті. Кейінірек болған жағдайды түзету өте қорқынышты болуы мүмкін - сіз CloudFormation оның бұзылғанына қуанатынын білмейсіз - тіпті оны түзету үшін де. Бұрынғы күйге оралу мүмкін бе, жоқ па, ол шынымен қалай анықтау керектігін білмейді және әдепкі бойынша ғажайыпты күту үшін сағаттар бойы ілулі тұрады.

Terraform, керісінше, сәтсіз өтулерден әлдеқайда әдемі қалпына келтіруге бейім және жетілдірілген жөндеу құралдарын ұсынады.

Құжат күйіндегі өзгерістер анық

«Жарайды, жүк теңестіруші, сіз өзгеріп жатырсыз. Бірақ қалай?»

—қобалжыған инженер, «қабылдау» түймесін басуға дайын.

Кейде маған CloudFormation стекіндегі жүктеме теңестіргішімен порт нөмірін қосу немесе қауіпсіздік тобын өзгерту сияқты кейбір манипуляциялар жасау керек болады. ClouFormation өзгерістерді нашар көрсетеді. Мен, түйреуіштер мен инелерде, қажетті ештеңені өшірмегенімді және қажетсіз ештеңе қоспағанымды тексеру үшін yaml файлын он рет екі рет тексеремін.

Терраформ бұл жағынан әлдеқайда ашық. Кейде ол тіпті тым мөлдір (оқыңыз: қызықсыз). Бақытымызға орай, соңғы нұсқада өзгерістердің жақсартылған дисплейі бар, осылайша сіз дәл қазір не өзгеріп жатқанын көре аласыз.

Икемділік

Бағдарламалық құралды артқа қарай жазыңыз.

Ашығын айтқанда, ұзақ мерзімді бағдарламалық қамтамасыз етудің ең маңызды сипаттамасы - өзгерістерге бейімделу қабілеті. Кез келген бағдарламалық құралды артқа қарай жазыңыз. Көбінесе мен «қарапайым» қызметті пайдалану арқылы қателіктер жібердім, содан кейін бәрін бір CloudFormation немесе Terraform стекіне жинай бастадым. Және, әрине, бірнеше айдан кейін мен бәрін дұрыс түсінбегенім анықталды, ал қызмет қарапайым емес! Енді маған қандай да бір түрде үлкен стекті кішкене құрамдас бөліктерге бөлу керек. CloudFormation бағдарламасымен жұмыс істегенде, мұны алдымен бар стекті қайта жасау арқылы ғана жасауға болады, мен мұны дерекқорлармен істемеймін. Терраформ, керісінше, стекті бөлшектеуге және оны түсінікті кішірек бөліктерге бөлуге мүмкіндік берді.

Git ішіндегі модульдер

Terraform кодын бірнеше стектерде ортақ пайдалану CloudFormation кодын ортақ пайдаланудан әлдеқайда оңай. Terraform көмегімен кодты git репозиторийіне қоюға және оған семантикалық нұсқаны басқару арқылы қол жеткізуге болады. Осы репозиторийге рұқсаты бар кез келген адам ортақ кодты қайта пайдалана алады. CloudFormation эквиваленті - S3, бірақ оның бірдей артықшылықтары жоқ және S3 пайдасына git-тен бас тартуға ешқандай себеп жоқ.

Ұйым өсті және ортақ стектерді бөлісу мүмкіндігі маңызды деңгейге жетті. Terraform мұның бәрін оңай және табиғи етеді, ал CloudFormation сізге осындай жұмысты бастамас бұрын шеңберлерден өтуге мәжбүр етеді.

Операциялар код ретінде

«Сценарий жасайық және жарайды».

— Terraform велосипедін ойлап тапқанға дейін 3 жыл бұрын инженер.

Бағдарламалық жасақтаманы әзірлеуге келетін болсақ, Go немесе Java бағдарламасы жай ғана код емес.

Terraform-тан CloudFormation-қа ауысты - және өкіндім
Код ретінде код

Оның жұмыс істейтін инфрақұрылымы да бар.

Terraform-тан CloudFormation-қа ауысты - және өкіндім
Код ретінде инфрақұрылым

Бірақ ол қайдан? Оны қалай бақылауға болады? Сіздің кодыңыз қайда тұрады? Әзірлеушілерге кіру рұқсаты қажет пе?

Terraform-тан CloudFormation-қа ауысты - және өкіндім
Операциялар код ретінде

Бағдарламалық жасақтаманы әзірлеуші ​​болу тек код жазуды білдірмейді.

AWS жалғыз емес: сіз басқа провайдерлерді пайдаланасыз. SignalFx, PagerDuty немесе Github. Мүмкін сізде CI/CD үшін ішкі Jenkins сервері немесе бақылауға арналған ішкі Grafana бақылау тақтасы болуы мүмкін. Infra as Code әртүрлі себептермен таңдалады және олардың әрқайсысы бағдарламалық жасақтамаға қатысты барлық нәрсе үшін бірдей маңызды.

Мен Twitch-те жұмыс істеген кезде Amazon аралас ендірілген және AWS жүйелеріндегі қызметтерді жылдамдаттық. Біз операциялық шығындарды арттыра отырып, көптеген микросервистерді тоқтаттық және қолдадық. Талқылаулар келесідей болды:

  • Я: Қарғыс атқыр, бұл бір микросервисті үдетуге арналған көптеген қимылдар. Мен AWS тіркелгісін жасау үшін осы қоқысты пайдалануым керек (біз 2 тіркелгіге кірдік микросервис), содан кейін бұл ескертулерді орнатуға арналған, бұл код репозиторийі үшін, мынау электрондық пошта тізімі үшін, содан кейін мынау...
  • Қорғасын: Сценарий жасайық және жарайды.
  • Я: Жарайды, бірақ сценарийдің өзі өзгереді. Бізге осы кірістірілген Amazon гизмостарының барлығының жаңартылғанын тексеру жолы қажет болады.
  • Қорғасын: Жақсы. Ал біз бұл үшін сценарий жазамыз.
  • Я: Тамаша! Сценарий әлі де параметрлерді орнату қажет болуы мүмкін. Ол оларды қабылдай ма?
  • Қорғасын: Баратын жеріне апарсын!
  • Я: Процесс өзгеруі мүмкін және кері үйлесімділік жоғалады. Семантикалық нұсқаны басқарудың қандай да бір түрі қажет болады.
  • Қорғасын: Керемет идея!
  • Я: Құралдарды пайдаланушы интерфейсі ішінде қолмен өзгертуге болады. Бізге мұны тексеру және түзету жолы керек.

…3 жылдан кейін:

  • Қорғасын: Бізде терраформа бар.

Әңгіменің моральдық мәні: сіз болса да Амазонканың бәрінде бас иеді, сіз әлі де AWS емес нәрсені пайдаланып жатырсыз және бұл қызметтерде сол күйді синхрондауда сақтау үшін конфигурация тілін пайдаланатын күй бар.

CloudFormation lambda және git модульдері terraform

lambda — CloudFormation қолданбасының пайдаланушы логикалық мәселесіне арналған шешімі. Ламбдамен сіз жасай аласыз макростар жасау немесе пайдаланушы ресурсы. Бұл тәсіл Terraform git модульдерінің семантикалық нұсқасында жоқ қосымша күрделіліктерді енгізеді. Мен үшін ең өзекті мәселе барлық осы пайдаланушы ламбдаларына рұқсаттарды басқару болды (және бұл ондаған AWS тіркелгілері). Тағы бір маңызды мәселе «бірінші болып не болды, тауық немесе жұмыртқа?» мәселесі болды: бұл ламбда кодына қатысты. Бұл функцияның өзі инфрақұрылым және код және оның өзі мониторинг пен жаңартуларды қажет етеді. Табыттағы соңғы шеге лямбда кодының өзгерістерін семантикалық жаңартудағы қиындық болды; біз сондай-ақ тікелей пәрменсіз стек әрекеттерінің орындалу арасында өзгермейтініне көз жеткізуіміз керек еді.

Бір кездері мен классикалық жүктеме теңестіргішімен Elastic Beanstalk ортасы үшін канареялық орналастыруды жасағым келгені есімде. Ең оңай орындалатын нәрсе өндіріс ортасының жанында EB үшін екінші орналастыруды жасау, оны бір қадам алға жылжыту: автоматты масштабталатын канарларды орналастыру тобын өндіріс ортасына LB орналастырумен біріктіру. Ал Terraform пайдаланатындықтан Қорытынды ретінде ASG beantalk, бұл үшін Terraform ішінде 4 қосымша код жолын қажет етеді. Мен CloudFormation-те салыстырмалы шешім бар ма деп сұрағанымда, олар мені Terraform кодының нашар 4 жолы жасай алатын нәрсе үшін орналастыру құбыры бар тұтас гит репозиторийіне және барлығына нұсқады.

Ол дрейфті жақсырақ анықтайды

Шындық күтуге сәйкес келетініне көз жеткізіңіз.

Дрейфті анықтау кодтық мүмкіндік ретінде өте қуатты операциялар болып табылады, себебі ол шындықтың күтуге сәйкес келуін қамтамасыз етуге көмектеседі. Ол CloudFormation және Terraform екеуінде де қол жетімді. Бірақ өндіріс стекі өскен сайын CloudFormation жүйесінде дрейфті іздеу жалған анықтауларды көбейтті.

Terraform көмегімен сізде дрейфті анықтауға арналған әлдеқайда жетілдірілген өмірлік цикл ілмектері бар. Мысалы, сіз пәрменді енгізесіз өзгерістерді_елемеу Бүкіл ECS қолдануындағы өзгерістерді елемеусіз нақты тапсырма анықтамасына өзгертулерді елемеу керек болса, тікелей ECS тапсырмасы анықтамасында.

CDK және CloudFormation болашағы

CloudFormation-ті үлкен, кросс-инфрақұрылымдық масштабта басқару қиын. Осы қиындықтардың көпшілігі мойындалады және құралға ұқсас нәрселер қажет aws-cdk, кодтағы бұлттық инфрақұрылымды анықтауға және оны AWS CloudFormation арқылы іске қосуға арналған құрылым. aws-cdk үшін болашақ не болатынын көру қызықты болады, бірақ Terraform-тың басқа күшті жақтарымен бәсекелесу қиынға соғады; CloudFormation жүйесін жаңарту үшін жаһандық өзгерістер қажет болады.

Терраформ көңілін қалдырмауы үшін

Бұл «мәтін ретінде» емес, «код ретіндегі инфрақұрылым».

Менің Terraform туралы алғашқы әсерім өте нашар болды. Мен бұл тәсілді түсінбедім деп ойлаймын. Барлық дерлік инженерлер оны қалаған инфрақұрылымға түрлендіруді қажет ететін мәтін пішімі ретінде еріксіз қабылдайды. БҰЛАЙ ЖАСАМАҢЫЗ.

Жақсы бағдарламалық жасақтаманы әзірлеудің шындықтары Terraform-ға да қатысты.

Мен Terraform-да еленбейтін жақсы кодты жасау үшін қабылданған көптеген тәжірибелерді көрдім. Сіз жақсы бағдарламашы болу үшін жылдар бойы оқыдыңыз. Терраформмен жұмыс істеп жатқаныңыз үшін бұл тәжірибеден бас тартпаңыз. Жақсы бағдарламалық жасақтаманы әзірлеудің шындықтары Terraform-ға қатысты.

Кодты қалай құжаттауға болмайды?

Мен ешқандай құжаттамасыз үлкен Terraform стектерін көрдім. Ешбір құжатсыз беттерге кодты қалай жазуға болады? Сізді түсіндіретін құжаттаманы қосыңыз код Terraform («код» сөзіне баса назар аудару), бұл бөлім неге соншалықты маңызды және сіз не істейсіз.

Бір кездері үлкен негізгі() функциясы болған қызметтерді қалай орналастыруға болады?

Мен бір модуль ретінде ұсынылған өте күрделі Terraform стектерін көрдім. Неліктен біз бағдарламалық жасақтаманы осылай қолданбаймыз? Неліктен үлкен функцияларды кішірек функцияларға бөлеміз? Терраформға бірдей жауаптар қолданылады. Модуль тым үлкен болса, оны кішірек модульдерге бөлу керек.

Сіздің компанияңыз кітапханаларды пайдаланбайды ма?

Мен Terraform көмегімен жаңа жобаны құрастырған инженерлердің басқа жобалардың үлкен бөліктерін өздерінің жеке жобаларына ақымақтықпен көшіріп, содан кейін ол жұмыс істей бастағанша олармен қалай айналысқанын көрдім. Сіз өзіңіздің компанияңызда «жауынгерлік» кодпен осылай жұмыс істейсіз бе? Біз тек кітапханаларды пайдаланбаймыз. Иә, бәрі кітапхана болуы шарт емес, бірақ жалпы кітапханаларсыз біз қайдамыз?!

Сіз PEP8 немесе gofmt қолданбайсыз ба?

Көптеген тілдерде стандартты, қабылданған пішімдеу схемасы бар. Python-да бұл PEP8. In Go - gofmt. Терраформның өзіне тән: terraform fmt. Денсаулығыңыз үшін рахат алыңыз!

Сіз JavaScript білмей React пайдаланасыз ба?

Terraform модульдері сіз жасаған күрделі инфрақұрылымның кейбір бөлігін жеңілдете алады, бірақ бұл сіз онымен мүлдем айналыса алмайсыз дегенді білдірмейді. Терраформды ресурстарды түсінбестен дұрыс пайдаланғыңыз келе ме? Сіз құрдымға кеттіңіз: уақыт өтеді және сіз ешқашан Терраформды меңгере алмайсыз.

Сіз синглтондармен немесе тәуелділік инъекциясымен кодтайсыз ба?

Тәуелділік инъекциясы бағдарламалық жасақтаманы әзірлеуге арналған танылған ең жақсы тәжірибе болып табылады және синглтондарға қарағанда жақсырақ. Бұл Terraform жүйесінде қаншалықты пайдалы? Мен қашықтағы күйге тәуелді Terraform модульдерін көрдім. Қашықтағы күйді шығаратын модульдерді жазудың орнына параметрлерді қабылдайтын модульді жазыңыз. Содан кейін бұл параметрлерді модульге жіберіңіз.

Сіздің кітапханаларыңыз он нәрсені жақсы істей ме, әлде бір істі жақсы ма?

Ең жақсы жұмыс істейтін кітапханалар - бұл өте жақсы орындайтын бір тапсырмаға назар аударатын кітапханалар. Барлығын бірден жасауға тырысатын үлкен Terraform модульдерін жазудың орнына олардың бір нәрсені жақсы орындайтын бөліктерін жасаңыз. Содан кейін оларды қажетінше біріктіріңіз.

Кері үйлесімділіксіз кітапханаларға қалай өзгертулер енгізуге болады?

Жалпы Terraform модулі, кәдімгі кітапхана сияқты, кері үйлесімділіксіз өзгертулерді пайдаланушыларға қандай да бір түрде хабарлауы керек. Бұл өзгерістер кітапханаларда болған кезде тітіркендіргіш және Terraform модульдерінде кері үйлесімді емес өзгертулер енгізілгенде де тітіркендіргіш. Terraform модульдерін пайдалану кезінде git тегтерін және semver-ді пайдалану ұсынылады.

Сіздің өндірістік қызметіңіз ноутбукта немесе деректер орталығында жұмыс істеп тұр ма?

Hashicorp сияқты құралдар бар терраформды бұлт терраформаңызды іске қосу үшін. Бұл орталықтандырылған қызметтер аумақтық өзгерістерді басқаруды, тексеруді және бекітуді жеңілдетеді.

Сіз тест жазбайсыз ба?

Инженерлер кодты сынау қажет екенін мойындайды, бірақ олар Terraform-пен жұмыс істегенде тестілеуді жиі ұмытады. Инфрақұрылым үшін бұл сәтсіз сәттерге толы. Менің кеңесім - CI/CD кезінде тестілеу үшін дұрыс орналастыруға болатын модульдерді пайдаланып стектерді «сынау» немесе «мысал жасау».

Терраформ және микросервис

Микросервис компанияларының өмірі мен өлімі жаңа микросервис жұмыс жинақтарының жылдамдығына, инновациясына және бұзылуына байланысты.

Микросервис архитектураларымен байланысты және жою мүмкін емес ең көп таралған жағымсыз аспект кодқа емес, жұмысқа қатысты. Егер сіз Terraform-ті микросервис архитектурасының тек инфрақұрылымдық жағын ғана автоматтандыру әдісі деп ойласаңыз, онда сіз жүйенің шынайы артықшылықтарын жоғалтасыз. Қазір болды бәрі код сияқты.

Ақпарат көзі: www.habr.com

пікір қалдыру