Wstęp do Amazon Lambda

Informacje podstawowe

  1. 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)
  2. Co to jest AWS Lambda
  3. Dokumentacja do AWS Lambda
  4. Wszystkie operacje proszę przeprowadzać w jednym regionie AWS (najlepiej eu-west-1).
  5. Ź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.

  1. Logujemy się do konsoli AWS, wybieramy usługę ”Lambda”.
  2. Tworzymy funkcję, w blueprintach wyszukujemy słowo kluczow “hello-world”, wybieramy wersję korzystającą z nodejs.
  3. Podajemy:
    • nazwę funkcji: “zad1”
    • pozostawiamy “create new role”
    • role name: “functionrole”
    • policy templates pozostawiamy puste
  4. 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?
  5. Proszę skorzystać z opcji “test”, zaczynając od skonfigurowania “test eventu”, który zostanie przekazany do funkcji.
  6. Logi są dostępne w zakładce “Monitoring”->”View logs in CloudWatch”
  7. 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.
  8. 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

  1. 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.
  2. Wyświetlamy szczegóły funkcji, dodajemy trigger “API Gateway”, wybieramy opcje “create new api” i security ustawiamy na “open”.
  3. Nastepnie wybieramy “Add”, aby trigger został utworzony należy zapisać funkcję.
  4. 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

  1. Panel “triggers” pozwala na skonfigurowanie wydarzeń, które wywołają funkcję.
  2. 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).
  3. Ś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.
  4. 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.
  1. Proszę stworzyć funkcję typu “Hello world!” oraz odpowiednia usługę REST. Wywołanie proszę zademonstrować za pomocą zewnętrznej aplikacji (np. curl).
  2. 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łu child_process. Prosze wygenerowac obciazenie, tak aby widac bylo skalowanie infrastruktury.
  3. 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*
  4. (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.


Maciej Pawlik, m.pawlik at cyfronet.pl
Bartosz Baliś, balis at agh.edu.pl
Maciej Malawski, malawski at agh.edu.pl
Katarzyna Rycerz, kzajac at agh.edu.pl