Niespełna tydzień temu na blogu pojawił się teoretyczny post poświęcony wprowadzeniu do AWS Lambda. Czas pójść za ciosem i zgodnie z konwencją pokazać praktyczne zastosowanie funkcji Lambda. W tym wpisie skonfigurujemy i uruchomimy sobie funkcje Lambda. Aby pokazać szerszy kontekst i możliwości Serverless na platformie AWS skorzystamy też i innych usług dostawcy. Myślę, że przypadek, który pokażemy sobie w ramach tego ćwiczenia będzie znacznie ciekawszy niż klasyczny Hello World.  Wpis ten ze względu na swoją długość zostanie podzielony na dwie części. Na końcu tego wpisu znajdziesz odesłanie do jego kontynuacji. 

Co zbudujemy sobie w ramach tego artykułu ?

Myślę, że po przejściu tej instrukcji krok po kroku, będziesz mógł śmiało powiedzieć, że zbudowałeś swoją pierwszą usługę Serverless. Postaram się pokazać Ci tutaj jak w prosty sposób zbudować serwis, która spokojnie mogłaby posłużyć do zbierania danych kontaktowych na Twojej stronie. Schemat tego co zostanie zbudowane w oparciu o chmurę AWS wygląda następująco. 

AWS Lambda Serverless schemat

Mówiąc w skrócie aplikacja będzie obsługiwać wysyłkę formularza kontaktowego. Za obsługę będzie oczywiście odpowiadać funkcja AWS Lambda, która będzie wystawiona poprzez endpoint HTTP za pomocą usługi API Gateway. Dane z tego formularza funkcja zapisze w bazie DynamoDB oraz dodatkowo wyślę notyfikację mailową na nasz adres korzystając z usługi AWS SNS. Formularz kontaktowy będzie możliwy do umieszczenia w wiaderku S3. Prosty funkcjonalność, którą można zaadaptować w wielu miejscach, np. przy budowaniu własnego systemu do obsługi newslettera. 

Konfiguracja AWS DynamoDB

Nim przejdziemy gwoździa programu jakim jest AWS Lambda, musimy najpierw skonfigurować inne usługi używane w naszym systemie. Na pierwszy ogień idzie DynamoDB.

DynamoDB – jest to jedna z flagowych usług w portfolia AWS z kategorii przechowywania danych. DynamoDB jest bazą danych typu NoSQL uruchamianą w modelu Serverless. Jest ona w pełni zarządzana przez dostawcę. Nie musimy martwić się o backupy czy dostępność. Nie musimy deklarować nawet jak dużej przestrzeni dyskowej potrzebujemy na dane. Jeśli chodzi o model rozliczeniowy to mamy możliwość wybrania jednej z dwóch opcji. 

  • Provisioned – model w którą musimy zadeklarować szacowany ruchu, który baza ma obsłużyć, przez co dostawca wie w jaki sposób ma wyskalować naszą bazę. 
  • On-demand – model bardziej Serverlesowy. W tym wypadku chargowani jesteśmy za ilość zapytań, która baza realnie obsłużyła. 

Pierwszym krokiem przed uruchomieniem jakiejkolwiek usługi będzie wybranie regionu, w którym będziemy budować naszą infrastrukturę. Ja zdecydowałem się tutaj na Irlandię (eu-west-1). Pamiętaj aby zawsze upewnić się czy w odpowiednim regionie uruchamiasz swoje usługi. Polecam Ci skorzystanie z eu-west-1, gdyż w dalszej konfiguracji będziemy się często odwoływać do wybranego przez nas regionu. Odnajdujemy następnie w wyszukiwarce usług DynamoDB i na ekranie tej usługi klikamy Create Table. 

W oknie konfiguracyjnym podajemy nazwę naszej tabeli contacts oraz deklarujemy, że kluczem głównym będzie pole/kolumna email. Jak widzisz na załączonym obrazku, ja odznaczyłem opcję Use default settings aby wybrać opcję rozliczeniową On-demand. Jeśli jednak Ty korzystasz z Free Tier możesz spokojnie pozostawić ten checkbox zaznaczony. AWS w takim przypadku utworzy tabele z domyślną konfiguracją z modelem Provisioned, jednak z ramach Free Tier nie poniesiesz kosztów związanych z DynamoDB. Resztę opcji zostawiamy w domyślnej formie i zatwierdzamy utworzenie przyciskiem Create. Po kilku chwilach nasza tabela powinna być już gotowa do pracy. Na ten moment zostawiamy ją jednak w spokoju.

Konfiguracja AWS SNS

Kolejny krok to konfiguracja AWS SNS. Usługa ta będzie nas notyfikować mailowo o nowo wypełnionych i przesłanych formularzach kontaktowych. 

AWS Simple Notification Service (SNS) – jest to usługa służąca do messagingu. Tworzymy topic, na który inne usługi mają możliwość wysyłać wiadomości. Z drugiej strony inne usługi, bądź użytkownicy są w stanie odbierać te wiadomości subskrybując się na wybrany topic

W naszym przypadku Lambda będzie wysyłać informacje o nowym formularzu na utworzony topic, a my jako odbiorca końcowy zasubskrybujemy się na na ten topic aby dostawać powiadomienia email. Wyszukujemy więc w konsoli AWS usługę SNS, a następnie rozwijając menu boczne przechodzimy do zakładki Topic

AWS SNS tworzenie topicu

Wypełniamy jedynie pole Name i Display name, a resztę pozostawiamy z ustawieniami domyślnymi. Klikamy Create

SNS tworzenie subskrypcji

Następnie przechodzimy do zakładki Subscriptions i dodajmy nasz adres mailowy jako subskrybenta na nowo powstały Topic. Jego numer ARN powinien być dostępny polu rozwijanym. Jako Protocol wybieramy Email, gdyż właśnie w tym kanale chcemy otrzymywać notyfikacje. Po dodaniu naszego adresu email dostaniemy na naszą skrzynkę wiadomość od AWS z linkiem do potwierdzenia naszej subskrypcji. 

AWS SNS konfiguracja

Nasza konfiguracja SNS powinna wyglądać tak jak na powyższym obrazku. Mamy Topic, a na nim potwierdzoną subskrypcje z naszym adresem email. Wartym do zanotowania jest numer ARN (Amazon Resource Names), będzie on nam później potrzebny przy tworzeniu funkcji Lambda. ARN jest w świecie AWS unikalnym w całej infrastrukturze identyfikatorem zasobu. 

Konfiguracja IAM Role dla funkcji Lambda

Aby nasza funkcja Lambda mogła wykorzystywać inne serwis musi mieć nadany do nich dostęp. W środowisku AWS dostęp między usługami konfigurujemy poprzez przypisywanie Roli IAM (Identity and Access Management). W tym przypadku nasz Lambda potrzebuje roli, która umożliwi jej dwie rzeczy, zapis danych do DynamoDB oraz zapis wiadomości do Topica. 

Aby utworzyć IAM Role odszukujemy usługę Identity and Access Management. Na jej stronie wybieramy zakładkę Roles i odpalamy wizarda, który przeprowadzi nas przez cały proces. 


tworzenie IAM Role 1

Zaznaczamy, że będzie to Rola, która będziemy przypisywać do funkcji Lambda i przechodzimy dalej. 

tworzenie IAM Role 2

Tutaj bardzo ważny ekran. W tym miejscu musimy zdefiniować jakie dostęp będzie miała rola. Rola to tak naprawdę zbiór polis, które uprawniają do wykonywania akcja na innych zasobach. AWS posiada kilka predefiniowanych polis, z których możemy skorzystać. Tutaj szczególnie ważna zasada. Zalecanym jest aby nadawać jak najbardziej ograniczone uprawnienia naszym zasobom. Jeśli funkcja jedynie zapisuje dane do tabeli, to nie powinna mieć żadnych inny uprawnień, takich jak edycja tabeli czy nawet jej odczyt. Dla naszej Lambdy możemy tutaj pójść na skróty i odszukać predefiniowane polisy. Są to AmazonDynamoDBFullAccess, AmazonSNSFullAccess. Zaznacz je i przejdź dalej. Jeśli jednak chcesz to zrobić zgodnie ze sztuką polecam samemu stworzyć polisę, która będzie miała tylko niezbędne uprawnienia. Aby Ci to uprościć przygotowałem wzór takiej polisy. Wystarczy, że podmienisz numery ARN dla SNS i Dynamo zgodne z Twoimi. 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Policy1",
            "Effect": "Allow",
            "Action": [
                "sns:Publish",
                "dynamodb:PutItem"
            ],
            "Resource": [
                "arn:aws:sns:eu-west-1:67XXXXX01:contact-topic",
                "arn:aws:dynamodb:eu-west-1:67XXXX01:table/contacts"
            ]
        }
    ]
}
 
tworzenie IAM Role 3

Ostatnim krokiem jest nadanie nazwy roli oraz podsumowanie pokazujące uprawnienia, które skonfigurowaliśmy. Zapamiętaj nazwę jaką nadałeś swojej roli i zatwierdź jej utworzenie.

tworzenie IAM Role 4

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.

 

Close Menu