Lab06 - 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). 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 odpowiednio nazwę funkcji “zad2”,
należy utworzyć nową rolę z nazwą “functionrole2” (inaczej wystąpią problemy z logowaniem).
- 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.
- Przechodzimy do usługi “API Gateway”, tam wybieramy “Get Started”, następnie “New API”, nadajemy mu nazwę i wybieramy “Create API”.
- Tworzymy nowy “Resource”, czyli wybieramy “Create Method” z menu “Actions”. Endpoint powinien obsługiwać metodę GET, odpowiadać funkcji lambda i integrować się z nią (zaznaczamy checkbox “Use Lambda Proxy integration”). Wybieramy nasz domyślny region (najczęściej jest to eu-west-1) i podajemy nazwę funkcji.
- Analizujemy schemat i testujemy!
- Niestety pojawił się błąd, wskazówką jest kod błędu czyli HTTP 500. W tym przypadku oznacza to, że funkcja nie rozmawia odpowiednio z serwisem udostępnianym przez API. Należy wrócić do kodu funkcji zad2 (proszę też sprawdzić co pojawiło się w zakładce “trggers” funkcji) i wprowadzić odpowiednie zmiany w kodzie:
'use strict';
console.log('Loading function');
exports.handler = (event, context, callback) => {
callback(null, {
statusCode: '200',
body: 'Hello world!',
headers: {
'Content-Type': 'text/plain'
}
})
};- Zapisujemy przez ctrl+s, plik można też uploadować przez opcję z menu.
- Warto zwrócić uwagę, że endpoint nie jest publicznie dostępny, aby to zmienić trzeba przeprowadzić “Deployment”.
Integracja z innymi usługami, np. S3
- Zakładka “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 wstąpią problemy z logowaniem.- Proszę stworzyć funkcję typu “Hello world!”
- Proszę stworzyć usługę REST odpowiadającą “Ahoj przygodo!”. 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ę
hostnameprzy pomocy modułuchild_process. - 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_modulesprzy uploadowaniu źródeł w pliku .zip.
- Maciej Pawlik, m.pawlik at cyfronet.pl
- Maciej Malawski, malawski at agh.edu.pl
- Katarzyna Rycerz, kzajac at agh.edu.pl