Определете коя рамка за инфраструктура като код (IaC) е най-добра за вас въз основа на скорошния ми опит и с двете.

Целият код в тази статия може да бъде намерен тук, заедно с правилната настройка за внедряване на приложението в AWS.

Ако сте в същата ситуация, в която бях аз един месец, и се опитвате да изберете правилната IaC рамка за нов проект (или може би мислите за смяна на рамки в съществуващ проект), тогава се надявам, че мога да помогна да хвърля малко светлина върху две популярни на текущия пазар. Няма да обяснявам в подробности какво представляват Serverless Framework или Pulumi или как работят, тъй като вече има много ресурси онлайн за това. Вместо това ще ви преведа през пътуването, което имах с двата инструмента, разработването на приложения без сървър и откриването на това, което работи най-добре за мен.

TLDR

Ако разработвате безсървърни приложения, внедрени в AWS, със силен фокус върху безсървърни функции, които използват предимно Typescript, тогава:

  • Използвайте Serverless Framework с конфигурацията (serverless.ts), написана на Typescript
  • Използвайте безсървърния пакет плъгин, за да рационализирате опаковането на вашите функции

Ако управлявате най-вече облачна инфраструктура и екосистеми и искате да го направите по-лесно (казвам по-лесно, защото въпреки че Pulumi има собствен API, все пак ще трябва да пишете специфични за доставчика конфигурации, които няма да могат да се прехвърлят на друг облачен доставчик) за да смените облачните доставчици в бъдеще, след това:

  • Използвайте Pulumi

Продължавайте с приключението

И двете рамки поддържат всички основни облачни доставчици, въпреки че всички проекти, които направих, бяха внедрени в AWS. Освен това създавах най-вече приложения без сървър с интензивно използване на функции без сървър, за разлика от управлението само на инфраструктура. Това означава, че пишех много код на приложение и след това използвах IaC рамките, за да разположа този код към функции без сървър, които след това взаимодействаха с други облачни ресурси. Повечето приложения използваха Typescript като основен език.

Използвам Serverless Framework от няколко години. Опитах и ​​трите му варианта, т.е. писане на конфигурацията с Yaml, JavaScript или Typescript. Първоначално започнах с разновидността на Yaml по подразбиране, но бързо открих, че това значително ограничава способността ми да пиша повторно използваем код. Няма начин да напишете обща функция или блок от код и да ги използвате повторно във вашата конфигурация. За неща като дефиниране на множество функции без сървър или IAM роли, които често са много сходни, не беше добре да пренаписвате един и същ код отново и отново или да трябва да променяте 10 повторения на едно и също нещо, когато се опитвате да промените конфигурация. Преминаването към използване на JavaScript и Typescript направи това много по-добро. И това определено трябва да е съвет.

Ако използвате Serverless Framework или обмисляте да го използвате, използвайте JavaScript или Typescript за конфигурацията.

Ще отидете от това:

До това:

Това ще ви постави на много по-добър път за успех в поддържането на приложението ви годно за поддръжка.

Serverless Framework има доста добра интеграция с AWS CloudFormation. Ако се опитвате да внедрите други ресурси, различни от тези, които се управляват автоматично (AWS Lambda, IAM роли за изпълнение, AWS Api Gateway и т.н.), това може да се направи в секциятаРесурси на вашата конфигурация. В този раздел вие предимнопишете шаблон за CloudFormation. Казвам предимно, тъй като вероятно ще искате да свържете ресурсите, създадени там, с вашите функции по някакъв начин, дори и само за да дадете на вашите IAM роли за изпълнение на Lambda достъп до тези ресурси. И тук безсървърната рамка започва да става все по-сложна. Докато добавяте все повече и повече ресурси на CloudFormation, взаимозависимостите между тези ресурси и вашите функции без сървър бързо се материализират в спагети код. Ще бъде трудно да се разбере какво зависи от какво.

Тъй като започнах нов проект за изграждане на ново приложение, това ме накара да проуча алтернативи на Serverless Framework. Тук открих Пулуми. Основните неща, които ме привлякоха, бяха фактът, че Pulumi е проектиран да може да управлява цялото облачно приложение и не се фокусира само върху функции без сървър. Освен това той поддържа Typescript и има хубава функция, наречена магически функции, която позволява да вградите кода на вашите функции директно във вашата IaC конфигурация.

Това прави доста лесно да се напише функция, която се задейства, да речем, от качване в S3 контейнер или REST API. Той също така изяснява зависимостите (за разлика от това, което трябва да правите с рамката без сървър).

Има и няколко Crosswalks, които по същество са помощни класове, които рационализират някои обичайни случаи на употреба, като „разгръщане на функции без сървър в REST API“ (като това, което се вижда по-горе). Голяма част от ресурсното скеле се извършва от класовете на пешеходните пътеки, вместо от вас.

С всичко това се усещаше, че можете да имате един холистичен изглед на вашето приложение без сървър, като пишете код на приложение заедно с инфраструктурен код. Ето защо реших да го пробвам.

Бързо напред няколко седмици в моя нов проект и сега осъзнавам, че горното не е нищо друго освен празна мечта. Магическите функции са много ограничени. Всъщност те наистина работят добре само ако не използвате външни библиотеки. И ако трябва да бъда напълно честен, това се случва много рядко. Заедно с това, Pulumi няма нищо, което да помогне с опаковането на вашето приложение. Ако трябва да напишете много функции без сървър, всяка от които има различни зависимости, вие сте почти сами. Транспилиране на Typescript към JavaScript, зависимости на кода за разклащане на дървета, минимизиране на вашия код, TSC, Babel, Webpack, включете! Ще трябва да разберете всичко това, за да оптимизирате пакетите, които качвате в AWS, и също така да останете на върха, тъй като екосистемата (аааа... JavaScript) се променя всеки ден.

След като прекарвах няколко часа на всеки няколко дни в моето решение за безсървърно опаковане, не можех да не си спомня колко лесно беше с Serverless Framework, съчетано с „плъгина за безсървърен пакет“. Всичко беше направено за мен и не трябваше да знам нищо за инструментите по-горе.

На всичкото отгоре пешеходните пътеки изглеждаха малко като закъсняла мисъл. Те са само частично документирани. Има някои примери, но ако вашият случай на употреба изпадне от тях, няма друга документация.

Неуспешното конфигуриране на Webpack го направи вместо мен. Прекарах твърде много часове без очаквания резултат и реших да преобразувам целия си IaC в Serverless Framework. Никога не погледнах назад.

В крайна сметка изпробвах Pulumi за няколко пълни седмици и разбрах, че Serverless Framework има много по-добра поддръжка за функции без сървър, поне с AWS.

Pulumi изглежда като страхотна рамка, ако управлявате големи облачни инфраструктури, където имате стотици ресурси и функциите без сървър не са центърът на инфраструктурата, но ако сте като мен и проектирате предимно приложения, които използват силно функции без сървър, аз би препоръчал Serverless Framework.

След като се върнах, експериментирах и с нов начин за структуриране на моето приложение, за да подобря болките, които имах с рамката без сървър. Очаквайте още една статия (вече е публикувана, намерете я тук!), която навлиза в подробности за това как направих зависимостите между ресурсите по-ясни и по същество проектирах това, което исках от Pulumi в Serverless Framework.

Чувствайте се свободни да разширите собствения си опит с някоя от рамките в коментарите! Винаги търся различни гледни точки!