Ú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:

service: two-serverless-framework
 
provider:
 name: aws
 runtime: nodejs12.x
 region: eu-central-1
 
functions:
 hello:
   handler: handler.hello
serverless.yml

Dále nám Serverless Framework také vytvoří soubor handler.js:

'use strict';
 
module.exports.hello = async event => {
 return {
   statusCode: 200,
   body: JSON.stringify(
     {
       message: 'Go Serverless v1.0! Your function executed successfully!',
       input: event,
     },
     null,
     2
   ),
 };
};
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í:

  1. Zastaralý - pomocí callbacku
  2. 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říkazu serverless 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:

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.

With ❤️ made in Brno.