• Akademia
  • Blog
  • O Serverless
  • O stronie

Pierwsza funkcja Lambda


Pierwsza funkcja Lambda

Doszli┼Ťmy do wspania┼éego momentu kiedy mo┼╝emy u┼╝y─ç naszych narz─Ödzi i stworzy─ç projekt, a w nim pierwsz─ů funkcj─Ö lambda. Ja u┼╝ywam do pracy Ubuntu (w VirtualBox) oraz VS Code (tutaj mo┼╝esz przeczyta─ç dlaczego). Ty mo┼╝esz u┼╝ywa─ç dowolnego systemu operacyjnego, komendy b─Öd─ů praktycznie identyczne.

To zaczynamy!

Ten artyku┼é jest cz─Ö┼Ťci─ů wi─Ökszego cyklu: Kurs Serverless

Na ca┼éy cykl sk┼éadaj─ů si─Ö nast─Öpuj─ůce artyku┼éy. Je┼Ťli jeste┼Ť tutaj pierwszy raz, to dobrze b─Ödzie zacz─ů─ç od pocz─ůtku ­čśä
  1. Jak zainstalowa─ç Serverless Framework?
  2. Jak skonfigurowa─ç AWS CLI?
  3. Pierwsza funkcja Lambda
  4. Jak stworzy─ç us┼éug─Ö sieciow─ů (webserwis) za pomoc─ů AWS Lambda?
  5. "Śledź Paczkę" - wideokurs serverless

Tworzymy nowy projekt

B─Ödziemy pracowa─ç za pomoc─ů komend w linii polece┼ä, zatem otw├│rz terminal w swoim systemie. Przygotujmy sobie folder na dysku, proponuje slspl - jak ÔÇťslsÔÇŁ = serverless i ÔÇťplÔÇŁ = Polska. :-)

1
2
mkdir slspl
cd slspl

A teraz stw├│rzmy sw├│j pierwszy projekt.

1
serverless create --template aws-nodejs -p pierwsza-lambda

Co da nast─Öpuj─ůc efekt:

1
2
3
4
5
6
7
8
9
10
11
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "/home/pawel/slspl/pierwsza-lambda"
_______ __
| _ .-----.----.--.--.-----.----| .-----.-----.-----.
| |___| -__| _| | | -__| _| | -__|__ --|__ --|
|____ |_____|__| \___/|_____|__| |__|_____|_____|_____|
| | | The Serverless Application Framework
| | serverless.com, v1.36.0
-------'

Serverless: Successfully generated boilerplate for template: "aws-nodejs"

Serverless Framework stworzył dla nas w katalogu ~/slspl/pierwsza-lambda dwa pliki:

  • serverless.yml - plik konfiguracyjny, w kt├│rym zdefiniujemy nasz─ů lambd─Ö, a w przysz┼éo┼Ťci zasoby (us┼éugi AWSÔÇÖowe) dla ca┼éej aplikacji.
  • handler.js - plik ┼║r├│d┼éowy w JavaScript. Tutaj znajduje si─Ö kod, kt├│ry zostanie umieszczony w Lambdzie zdefiniowanej w pliku powy┼╝ej.

Mamy konfiguracj─Ö dla JavaScript poniewa┼╝ z takiego szablonu skorzystali┼Ťmy pisz─ůc --template "aws-nodejs". Jest oczywi┼Ťcie mn├│stwo innych opcji:

1
2
3
4
5
6
7
8
9
10
11
12
13
serverless create --help 

Available templates:
"aws-clojure-gradle", "aws-clojurescript-gradle", "aws-nodejs", "aws-nodejs-typescript",
"aws-alexa-typescript", "aws-nodejs-ecma-script", "aws-python", "aws-python3",
"aws-groovy-gradle", "aws-java-maven", "aws-java-gradle", "aws-kotlin-jvm-maven",
"aws-kotlin-jvm-gradle", "aws-kotlin-nodejs-gradle", "aws-scala-sbt", "aws-csharp",
"aws-fsharp", "aws-go", "aws-go-dep", "aws-go-mod", "aws-ruby", "azure-nodejs",
"cloudflare-workers", "cloudflare-workers-enterprise", "fn-nodejs", "fn-go",
"google-nodejs", "kubeless-python", "kubeless-nodejs", "openwhisk-java-maven",
"openwhisk-nodejs", "openwhisk-php", "openwhisk-python", "openwhisk-ruby",
"openwhisk-swift", "spotinst-nodejs", "spotinst-python", "spotinst-ruby",
"spotinst-java8", "plugin" and "hello-world"

Jak wida─ç, framework obs┼éuguje r├│┼╝ne chmury publiczne oraz r├│┼╝ne j─Özyki. Ja korzystam z JavaScript z wielu powod├│w, o kt├│rych napisa┼éem w publikacji 12 Rzeczy o Serverless, Kt├│re Musisz Wiedzie─ç Przed Rozpocz─Öciem Projektu W Chmurze AWS. Je┼Ťli jeste┼Ť ich ciekaw to odsy┼éam Ci─Ö do niej, punkt numer 7.

Przyjrzyjmy si─Ö wygenerowanym plikom. Pozwoli┼éem sobie usun─ů─ç komentarze z pliku przy pomocy grep -o '^[^#]*' serverless.yml (uwaga: to pewnie nie zadzia┼éa pod Windowsem) aby zwi─Ökszy─ç jego czytelno┼Ť─ç.

serverless.yml

[serverless.yml]
1
2
3
4
5
6
7
service: pierwsza-lambda 
provider:
name: aws
runtime: nodejs8.10
functions:
hello:
handler: handler.hello

Na te siedem linijek kodu przypadaj─ů 3 sekcje:

  • service - nazwa naszego projektu / us┼éugi - mikroserwisu
  • provider - definiuje naszego dostawc─Ö chmury oraz j─Özyk w jakim b─Ödziemy pisa─ç funkcje.
  • functions - tutaj definiujemy swoje funkcje, w tym wypadku hello to nazwa logiczna (w konfiguracji) naszej funkcji, a handler definiuje nazw─Ö pliku (z pomini─Öciem rozszerzenia) i metody kt├│ra b─Ödzie wywo┼éana przez AWS gdy nasza Lambda zostanie wywo┼éana.

handler.js
W tym pliku znajduje się kod źródłowy naszej funkcji.

[handler.js]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'use strict';

module.exports.hello = async (event, context) => {
return {
statusCode: 200,
body: JSON.stringify({
message: 'Go Serverless v1.0! Your function executed successfully!',
input: event,
}),
};

// Use this code if you don't use the http event with the LAMBDA-PROXY integration
// return { message: 'Go Serverless v1.0! Your function executed successfully!', event };
};

Nale┼╝y wspomnie─ç o tym, co si─Ö dzieje w linijce numer 3.

Po pierwsze, module.exports.hello odpowiada temu hello z linijki 7 w pliku serverless.yml. module.exports to jest natywne rozwi─ůzanie JavaScript, natomiast hello to w tym wypadku nazwa funkcji JavaScript, kt├│r─ů uruchomi AWS gdy wywo┼éamy funkcj─Ö Lambda.

Po drugie, s┼éowo async oznacza, ┼╝e funkcja jest asynchroniczna. To zn├│w natywne rzeczy JavaScript, kt├│re na razie nie s─ů wa┼╝ne dla nas.

Po trzecie, po async mamy w nawiasie dwa parametry: event oraz context. S─ů to standardowe parametry interfejsu Lambdy. Przyk┼éadowo w event mo┼╝emy otrzyma─ç warto┼Ťci parametr├│w z jakimi zosta┼éa wywo┼éana Lambda.

Funkcja jest trywialna, zwraca obiekt w kt├│rym znajduj─ů si─Ö dwie warto┼Ťci:

  • statusCode - kt├│ry informuje odbiorc─Ö o tym czy funkcja wykona┼éa si─Ö poprawnie, s─ů to standardowe kody odpowiedzi HTTP
  • body - w kt├│rym b─Ödziemy mieli wiadomo┼Ť─ç message oraz ca┼éy obiekt event w postacie JSONa. Zwracanie body to konwencja, zmienna mo┼╝e si─Ö nazywa─ç zupe┼énie inaczej i zawiera─ç co nam si─Ö podoba, oczywi┼Ťcie w ramach limit├│w Lambdy.

Deployment funkcji do chmury

Teraz mo┼╝emy przyst─ůpi─ç do dzia┼éania. Aha, jeszcze jedna uwaga je┼Ťli nie chcesz pisa─ç d┼éugiej komendy serverless mo┼╝esz si─Ö pos┼éu┼╝y─ç aliasem sls. Uruchom komend─Ö sls deploy, co da efekt jak poni┼╝ej:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
.....
Serverless: Stack create finished...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (387 B)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
...............
Serverless: Stack update finished...
Service Information
service: pierwsza-lambda
stage: dev
region: us-east-1
stack: pierwsza-lambda-dev
api keys:
None
endpoints:
None
functions:
hello: pierwsza-lambda-dev-hello
layers:
None

Wszystko to trwa┼éo minut─Ö i dwadzie┼Ťcia sekund. Spr├│bujesz to wyklika─ç w tym czasie? ­čśő

Ale tak na poważnie, co się wydarzyło?

Serverless Framework odpowiednio:

  1. Spakował nasz kod źródłowy (handler.js) do pliku zip.
  2. Na podstawie pliku serverless.yml wygenerowa┼é szablon CloudFormation - to jest j─Özyk opisu infrastruktury w chmurze AWS. Bardzo popularny i powszechnie u┼╝ywany, jednak du┼╝o bardziej skomplikowany ni┼╝ ÔÇťuproszczonaÔÇŁ wersja konfiguracji naszego frameworku Serverless.
  3. Korzystaj─ůc z naszych credentials kt├│re skonfigurowali┼Ťmy w poprzedniej lekcji, po┼é─ůczy┼é si─Ö do AWS i stworzy┼é dla nas zasoby (a dok┼éadniej uruchomi┼é, wygenerowany wcze┼Ťniej, szablon CloudFormation).
  4. Wysłał plik zip do wiaderka S3.
  5. Ustawi┼é kod ┼║r├│d┼éowy z pliku zip jako aktualn─ů wersj─Ö kodu naszej funkcji Lambda.
  6. Wy┼Ťwietli┼é informacj─Ö na temat naszego serwisu/us┼éugi (w obr─Öbie jednego serwisu mo┼╝emy mie─ç wi─Öcej funkcji Lambda).

Uruchomienie funkcji

Teraz pora przetestowa─ç, czy to wszystko dzia┼éa. Napisz prosz─Ö sls invoke --function hello. Parametr --function s┼éu┼╝y do okre┼Ťlenia, kt├│r─ů funkcj─Ö chcemy wywo┼éa─ç (invoke). Efektem tej komendy b─Ödzie nast─Öpuj─ůcy JSON:

1
2
3
4
{
"statusCode": 200,
"body": "{\"message\":\"Go Serverless v1.0! Your function executed successfully!\",\"input\":{}}"
}

Hurra ­čÄë Kod wywo┼éa┼é si─Ö gdzie┼Ť w chmurze Amazonu, a my widzimy tylko efekt!

Bez serwer├│w, bez zaprz─ůtania sobie g┼éowy infrastruktur─ů!

Warto┼Ť─ç pola body to tak zwany stringified JSON (JSONa w postaci stringa). Zwr├│─ç uwag─Ö, ┼╝e input jest pustym obiektem {}, poniewa┼╝ wywo┼éali┼Ťmy funkcj─Ö bez parametr├│w.

Spr├│bujmy poda─ç teraz jaki┼Ť parametr:

1
sls invoke -f hello -d '{"parameter": "Serverless Polska jest super"}'

Parametr -f to alias na --function, a -d to alias na --data - kt├│ry pozwala przes┼éa─ç jakie┼Ť dane do funkcji, w naszym wypadku zn├│w prost─ů par─Ö klucz: warto┼Ť─ç jako stringified JSON.

Tym razem, nasza Lambda zwr├│ci parametr wej┼Ťciowy i jego warto┼Ť─ç:

1
2
3
4
5
{
"statusCode": 200,
"body": "{\"message\":\"Go Serverless v1.0! Your function executed successfully!\",
\"input\":{\"parameter\":\"Serverless Polska jest super\"}}"
}

Na pewno jeste┼Ť oszo┼éomiony tym, ┼╝e to wszystko dzia┼éa. Spokojnie, tylko sobie ┼╝artuj─Ö ­čśő Przypuszczam jednak, ┼╝e jeste┼Ť zainteresowany gdzie dok┼éadnie ta Lambda si─Ö znajduje i jak to wszystko wygl─ůda od strony AWS.

Gdzie szuka─ç Lambdy?

Poniewa┼╝ obecna konfiguracja naszego serwisu jest dosy─ç uboga (7 linijek) i nie definiuje regionu to Serverless Framework pos┼éu┼╝y┼é si─Ö domy┼Ťlnym regionem, czyli N.Virginia (us-east-1).

Wejd┼║ prosz─Ö na stron─Ö https://console.aws.amazon.com/lambda/home?region=us-east-1#/functions i zobacz czy widzisz nasz─ů funkcj─Ö.
Lista funkcji
Serverless Framework narzuca pewn─ů konwencj─Ö nazewnicz─ů. Jest to <nazwa_serwisu>-<stage>-<nazwa_funkcji> (serwis i projekt rozumiem tutaj jako to┼╝same), dzi─Öki czemu bardzo ┼éatwo si─Ö po┼éapa─ç, gdy ma si─Ö du┼╝o funkcji ­čśÄ

Klikaj─ůc na nazw─Ö funkcji mo┼╝emy zobaczy─ç jej szczeg├│┼éy.
Szczegóły funkcji

Zaznaczyłem kilka ważnych elementów:

  • Ka┼╝dy zas├│b w AWS ma swoje unikalne id (zamaza┼éem fragment z numerem mojego konta AWS)
  • Tak jak wspomina┼éem, framework u┼╝ywa CloudFormation. Funkcja jest cz─Ö┼Ťci─ů stworzonego stacka.
  • Po ┼Ťrodku wida─ç nazw─Ö funkcji oraz jej powi─ůzania, w chwili obecnej nie ma ┼╝adnego triggera ale za to integruje si─Ö z CloudWatch aby zapisywa─ç logi - jest to standardowe rozwi─ůzanie do obs┼éugi log├│w w AWS

Dalej zobaczysz kod funkcji, a poni┼╝ej od niego: ustawienia roli, pami─Öci i timeoutu.
Szczegóły funkcji
Powy┼╝sze ustawienia mo┼╝na (i nale┼╝y) zdefiniowa─ç w pliku serverless.yml ale o tym w kolejnych lekcjach ­čśŐ

Usuwanie funkcji i całej reszty

Serverless Framework stworzy┼é dla nas (za pomoc─ů CloudFormation) nast─Öpuj─ůce zasoby w chmurze:

  • funkcje Lambda
  • Role IAM
  • Grup─Ö log├│w w CloudWatch
  • Wiaderko S3 gdzie umie┼Ťci┼é plik zip z kodem ┼║r├│d┼éowym

To ca┼ékiem sporo jak na tak trywialn─ů rzecz. Dlaczego o tym pisz─Ö?

Poniewa┼╝ chc─Ö, aby┼Ť wiedzia┼é jak du┼╝o Serverless Framework robi za Ciebie. Uwierz mi, bardzo ┼éatwo jest ÔÇťza┼Ťmieci─çÔÇŁ swoje konto AWS r├│┼╝nymi zasobami, gdy tworzy si─Ö je r─Öcznie. Potem niezmiernie trudno jest ustali─ç, co z czym jest powi─ůzane i czy w og├│le jest jeszcze potrzebne? Dlatego genialn─ů rzecz─ů - i oczywi┼Ťcie dobr─ů praktyk─ů - jest usuwanie wszystkiego co si─Ö stworzy┼éo, a nie zamierza si─Ö wi─Öcej u┼╝ywa─ç. (Z regu┼éy zasoby serverless s─ů bardzo tanie gdy si─Ö ich nie u┼╝ywa, ale ju┼╝ w przypadku *ÔÇŁtradycyjnychÔÇŁ* zasob├│w, takich jak maszyny wirtualne, bazy danych, czy load balancery, koszty takiego zapomnianego zasobu mog─ů by─ç bardzo du┼╝e. Sam w zesz┼éym roku straci┼éem blisko 200 USD na zapomnianym przez 3 miesi─ůce kontenerze w AWS Fargate ­čś×).

Uruchom prosz─Ö w swoim terminalu komend─Ö sls remove.

1
2
3
4
5
6
Serverless: Getting all objects in S3 bucket...
Serverless: Removing objects in S3 bucket...
Serverless: Removing Stack...
Serverless: Checking Stack removal progress...
..........
Serverless: Stack removal finished...

W taki oto spos├│b mo┼╝emy ┼éatwo usun─ů─ç ca┼éy serwis i jego zasoby z konta AWS.

To wszystko w tej lekcji. Nast─Öpnym razem poka┼╝─Ö Ci jak wystawia─ç funkcj─Ö AWS Lambda na ┼Ťwiat i wywo┼éa─ç j─ů przez HTTP jak zwyk┼éy webserwis.

Dziękuję za uwagę. Miłego dnia!




Cze┼Ť─ç

Nazywam si─Ö Pawe┼é Zubkiewicz i ciesz─Ö si─Ö, ┼╝e tu jeste┼Ť!
Od ponad 14 lat profesjonalnie tworz─Ö oprogramowanie, a od 2016 roku pasjonuje si─Ö Serverless.
T─ů stron─Ö stworzy┼éem z my┼Ťl─ů o Tobie i o nas wszystkich, kt├│rzy uwa┼╝aj─ů, ┼╝e trend serverless trwale zmieni spos├│b tworzenia oprogramowania.
Wi─Öcej o tej stronie...

Kategorie

Pobierz bezpłatny PDF

Poradnik 12 Rzeczy o Serverless

Wybrane artykuły