Wstęp do Amazon Lambda
Informacje podstawowe
- Do wykonania zadań z tego laboratorium konieczne jest:
- konto AWS
- znajomość JavaScriptu (ES6)/Pythona.
- znajomość usługi S3
- podstawowa wiedza na temat mechanizmu AWS “Identity and Access Management” (szczególnie Role i Policy)
- Co to jest AWS Lambda
- Dokumentacja do AWS Lambda
- Wszystkie operacje proszę przeprowadzać w jednym regionie AWS (najlepiej eu-west-1).
- Źródła dla zaawansowanych funkcji należy tworzyć lokalnie, pakować i wysyłać na AWS zgodnie z instrukcją deployment-package.
Praca z funkcjami
Podstawowa metoda pracy nad AWS Lambda to GUI webowe, dostępne w konsoli AWS. Po opanowaniu podstaw można korzystać z AWS CLI dla Lambdy, lub narzędzi do automatyzacji pracy z funkcjami (np. framework Serverless lub Terraform). Do wykonania zadań z tego laboratorium wystarczy GUI Webowe.
Dwa najpopularniejsze scenariusze korzystania z funkcji, to tworzenie serwisów RESTowych i reagowanie na zdarzenia w innych usługach AWS. Oba scenariusze zostaną zrealizowane w ramach zadań do tego laboratorium.
Pierwsza funkcja
Pierwsza funkcja powstanie na podstawie gotowego blueprintu. Funkcja posłuży do zaznajomienia się z interfejsem i testów. Kolejne przykłady (i zadania) będą tworzone na podstawie blueprintu.
- Logujemy się do konsoli AWS, wybieramy usługę ”Lambda”.
- Tworzymy funkcję, w blueprintach wyszukujemy słowo kluczow “hello-world”, wybieramy wersję korzystającą z nodejs.
- Podajemy:
- nazwę funkcji: “zad1”
- pozostawiamy “create new role”
- role name: “functionrole”
- policy templates pozostawiamy puste
- Proszę przeanalizować gotowy kod funkcji, w szczególności parametry przyjmowane przez funkcję. Parametry odzwierciedlają “event”, który wywołuje funkcję. Ważne jest też co funkcja zwraca, co jest logowane?
- Proszę skorzystać z opcji “test”, zaczynając od skonfigurowania “test eventu”, który zostanie przekazany do funkcji.
- Logi są dostępne w zakładce “Monitoring”->”View logs in CloudWatch”
- Warto zwrócić uwagę na dostępne parametry funkcji, takie jak np. ograniczenie pamięci, ograniczenie czasu wykonania, możliwość edycji kodu i dostępne środowiska wykonania.
- Oprócz funkcji funkcji zostały utworzone odpowiednie role i policy, przynależące do funkcji. Obie rzeczy można zweryfikować w konsoli usługi IAM.
Połączenie AWS Lambda z RESTowym API
- Tworzymy nową funkcję, postępujemy podobnie jak w poprzednim punkcie, wybierając ten sam wzorzec, odpowiednio nazwę
funkcji “zad2”, należy utworzyć nową rolę z nazwą “functionrole2”.
- AWS Lambda oferuje gotowy blueprint “microservice-http-endpoint”, który jest dość skomplikowany i integruje się z DynamoDB, co wykracza poza nasz zakres materiału. Dla uproszczenia stworzymy swój autorski serwis.
- Wyświetlamy szczegóły funkcji, dodajemy trigger “API Gateway”, wybieramy opcje “create new api” i security ustawiamy na “open”.
- Nastepnie wybieramy “Add”, aby trigger został utworzony należy zapisać funkcję.
- Analizujemy nowy trigger funkcji i testujemy udając się pod adres widoczny we właściwościach triggera “API Gateway”.
Integracja z innymi usługami, np. S3
- Panel “triggers” pozwala na skonfigurowanie wydarzeń, które wywołają funkcję.
- Aby funkcja mogła operować na danych w innych usługach rola (IAM), z którą działa, powinna zostać wzbogacona o odpowiednie uprawnienia (np. w przypadku S3 będzie to policy AmazonS3FullAccess).
- Środowiska uruchomieniowe zawierają już biblioteki konieczne do korzystania z usług AWS, dlatego można zrobić np.:
var aws = require('aws-sdk'); var S3 = new aws.S3();
bez uploadowania bibliotek. - Funkcja z lambdy wygląda analogicznie jak poprzednio, ale argument event odpowiada eventowi z danej usługi. Np. dla S3 w ten sposób można określić jaki bucket i plik są źródłem eventu:
var srcBucket = event.Records[0].s3.bucket.name;
var srcKey = event.Records[0].s3.object.key;
Zadania
Uwaga, przy tworzeniu nowej funkcji najlepiej stworzyć nową rolę, inaczej mogą wystąpić problemy z logowaniem.- Proszę stworzyć funkcję typu “Hello world!” oraz odpowiednia usługę REST. Wywołanie proszę zademonstrować za pomocą zewnętrznej aplikacji (np. curl).
- Czy funkcja uruchamia się tylko na jednym serwerze? Proszę sprawdzić co się stanie w przypadku wielu jednoczesnych
requestów. Funkcja może np. wywoływać komendę
hostname
przy pomocy modułuchild_process
. Prosze wygenerowac obciazenie, tak aby widac bylo skalowanie infrastruktury. - Proszę stworzyć funkcję reagującą na powstanie nowego pliku (tekstowego) w buckecie S3. Funkcja powinna do każdego
nowego pliku stworzyć plik w (innym) buckecie wyjściowym, plik powinien zawierać oryginalny tekst i dopisek “ uploaded at
". *Podpowiedź: funkcje getObject i putObject dostępne w aws-sdk dla S3* - (Dodatkowe) Proszę wykonać poprzedni punkt, ale zamiast dopisywać tekst proszę zmniejszać uploadowane obrazki do
rozmiaru np. max 64x64px. Biblioteka do operacji na obrazkach to np. gm, aby funkcja mogła korzystać z biblioteki
należy uwzględnić katalog
node_modules
przy uploadowaniu źródeł w pliku .zip.