Úvod
Ze začátku v roce 2016, když jsem si v hrál s Lambdami na svých projektech, tak jsem měl napsaný script v Nodejs, který se staral o “deployment”. Byl to jednoduchý kus kódu, který ZIPoval zdrojový kód a pomoci AWS SDK vytvářel resp. mazal jednotlivé lambda funkce.
Za nějakou dobu, koncem roku 2017, když už jsem pracoval v Purple Technology a rozhodli jsme se jít do Serverlessu, tak jsme zkoumali jaký je k dispozici Serverless tooling a vyšel nám z toho jako nejlepší kandidát Serverless Framework, který už tou dobou byl celkem propracovaný a byly do něj k dispozici různé pluginy - jako např. “serverless-step-functions”, který pro nás byl tehdy zásadní.
Jak jsem zmiňoval již v předchozím díle, používáme u nás v Purple Technology na Serverless pouze AWS cloud, takže i v tomto díle budu primárně ukazovat Sreverless Framework pro AWS.
Představení Serverless Frameworku
Serverless Framework je CLI nástroj, který zajišťuje deployment infrastruktury potřebné k běhu vaší serverlessové aplikace. Instaluje se pomocí NPM a konfiguruje pomocí “serverless.yml” souboru. Podporuje cca 10 cloudových providerů jako je např. AWS, Azure, GCP a má už celkem rozsáhlý pluginový ekosystém, díky kterému si ho můžete přizpůsobit svým potřebám.
V případě AWS využívá Serverless Framework pro správu infrastruktury IaC službu AWS CloudFormation. Serverless Framework si pro potřebné zdroje vygeneruje CloudFormation šablonu sám, nicméně pokud si budete chtít nakonfigurovat i další vlastní zdroje jako např. DynamoDB tabulky, tak díky jeho otevřenosti můžete.
Instalace a nastavení prostředí
Serverless Framework
$ npm install -g serverless
AWS CLI
Instalace AWS CLI není sice nutná, ale zjednoduší vám počáteční nastavení.
Dokumentaci jak nainstalovat AWS CLI najdete zde: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html
Nastavení AWS CLI
$ aws configure
V tomto kroku bude nejdůležitější vyplnit AWS Access Key ID
a AWS Secret Access Key
.
Na druhou stranu hodnoty jako např. Default region name
či Default output format
můžete nechat buď prázdné nebo použít jejich výchozí hodnotu.
AWS CLI v tomto kroku vytváří soubory ~/.aws/credentials
a ~/.aws/config
, ze kterých implicitně bere přístupové údaje jak AWS CLI, tak všechna AWS SDK.
Dokumentaci jak získat přístupové údaje k AWS API najdete zde: https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys
Vytvoření projektu podle šablony
$ serverless create --template aws-nodejs
Serverless framework nabízí možnost vytvoření nového projektu pomocí šablon. V našem případě budeme hledat šablony s prefixem aws-
.
Po vygenerování obsahuje serverless.yml
soubor spoustu vysvětlujících komentářů. Po jejich smazání a pročištění vypadá takto:
Dále nám Serverless Framework také vytvoří soubor handler.js
:
Nejdůležitější spojení mezi serverless.yml
a handler.js
soubory je handler: handler.hello
a module.exports.hello
. U Nodejs Lambda funkce se vždy udává cesta k souboru a místo přípony název exportované funkce. Takže v tomto případě je cesta k souboru handler
a název exportované funkce hello
, takže do serverless.yml
vložíme handler.hello
. Pokud by například handler
soubor byl ve složce src/
, tak by hodnota v serverless.yml
byla src/handler.hello
.
Nodejs runtime podporuje dva způsoby vracení odpovědí:
- Zastaralý - pomocí callbacku
- Klasický - pomocí Promise
Více zde: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html
Vygenerovaná funkce “hello” je předpřipravená pro použití společně s HTTP eventem. Nicméně ten si ukážeme až v dalším dílu o Amazon API Gateway.
Tip: seznam AWS regionů: https://docs.aws.amazon.com/general/latest/gr/rande.html
Nasazení
$ serverless deploy
Po dokončení nasazení můžeme ve výstupu vidět, že funkce hello
je vytvořena a její název v AWS je two-serverless-framework-dev-hello
. Takže pokud se podíváme do AWS konzole a zadáme tento název do vyhledávání, tak získáme naši Lambda funkci.
Tip: pokud si budeme chtit zobrazit tyto informace pro již nasazenou aplikaci, můžeme tak učinit posmocí příkazuserverless info
případně pro více informacíserverless info -v
Smazání
$ serverless remove
Smazání deploymentu se většinou skládá ze smazání obsahu S3 bucketu, který obsahuje zazipované zdrojové kódy lambda funkcí, a následného se smazání i CloudFormation stacku.
AWS CloudFormation
Jak jsem již zmínil v úvodu, Serverless Framework pro AWS používá službu AWS Cloud Formation, což znamená, že Serverless Framework proces nasazování a mazání pouze spustí a konkrétní nasazovací proces už provádí AWS CloudFormation samo.
To znamená, že pokud při deployi nebo mazání stacku, kdy Serverless Framework vypisuje jen tečky jako např. Serverless: Checking Stack removal progress...........
, zavřete terminál, tak se nic neděje, protože process v CloudFormation už byl odstartován a jediné co Serverless Framework v tu dobu dělá je to, že se dokola dotazuje na AWS API, jestli už je hotovo, aby věděl, kdy může skončit.
CloudFormation je komplexní a mocný nástroj, takže o něm vám toho více řeknu v separátním članku.
Pluginy
Serverless Framework podporuje možnost rozšíření jeho základní funkcionality pomocí pluginů. Bohužel k tomu není v podstatě žádná konvenční dokumentace, takže psaní pluginu je z velké části vlastně zkoumání útrob Serverless Frameworku. My v Purple Technology jsme si už taky pár pluginů napsali pro interní použití, takže třeba i o tom v budoucnu napíšeme článek.
Pluginy, které používáme u nás v Purple Technology:
- serverless-prune-plugin - abychom nenaráželi na “Function and layer storage” limit
- serverless-step-functions - abychom mohli deployovat State Machiny
- serverless-plugin-aws-alerts - abychom mohli monitorovat pomocí AWS Chatbot chyby v jednotlivých funkcích
- serverless-webpack - abychom pro Lambdy mohli používat TypeScript místo Javascriptu
- serverless-finch - aby se nahrál statický frontend do S3 bucketu při deployi
- serverless-s3-remover - aby se smazaly všechny soubory z frontendoveho S3 bucketu před smazáním CloudFormation stacku
- @purple/serverless-git-branch-stage-plugin - abychom mohli nasadit verzi aplikace pro libovolnou git branch
Závěr
V dalších dílech této série najdete několik příkladů použití Serverless Frameworku v kombinaci s různými AWS službami jako např. API Gateway, DynamoDB, AppSync, S3 atp.
V případě jakýchkoliv otázek mě neváhejte kontaktovat na Twitteru @FilipPyrek.
With ❤️ made in Brno.