AWS API Gateway i dane.
Proces poznawania AWS trwa. Ostatnio zrobiliśmy proste, przykładowe API Gateway. Dziś coś trochę bardziej skomplikowanego. Utworzymy API Gateway, w którym przetworzymy przesłane dane i prześlemy je do funkcji Lambda, odbierzemy od niej rezultat i wyślemy wynik użytkownikowi naszego API.
Założenia
- Tworzymy metodę POST
- Jako payload przesyłamy obiekt JSON:
{ "person" : { "name" : "Przemek", "age" : 45 } }
- API do funkcja lambda prześle obiekt w postaci:
{ "name" : "Przemek", "age" : 45 }
- Funkcja Lambda zwróci nam obiekt w postaci:
{ "statusCode": 200, "headers": { "Content-Type": "application/json" }, "body": { "age" : 90, "name" : "PRZEMEK" } }
- API zwróci obiekt:
{ "data": { "age": 90, "name": "PRZEMEK" } }
- oraz doda do nagłówków HTTP pole o nazwie LambdaStatus z wartościa zwróconą przez funkcję w postaci statusCode.
Lambda
Zaczynamy od nowej Lambdy. Dziś utworzymy sobie funkcję w Pythonie.
Jako kod wpisujemy. Zwrócimy sobie wiek pomnożony razy 2 i lekko przekształcone imię.
def lambda_handler(event, context): return { "statusCode": 200, "headers": { "Content-Type": "application/json"}, "body":{'age' : event.get('age') * 2, 'name' : event.get('name').upper()} }
Przydzielamy funkcji rolę i możemy już przetestować działanie funkcji.
Konfigurujemy test wpisując dane, które prześlemy z naszego API
I powinniśmy otrzymać poprawny wynikJeżeli wszystko jest w porządku wracamy do tworzenia API.
API Gateway
Proces tworzenia API opisałem w poprzednim wpisie. Nasze nowe API podłączymy jednak do funkcji Lambda. W moim przypadku podstawowa konfiguracja API wygląda tak
Po utworzeniu naszej metody API przywita nas ekran konfiguracji, w którym spędzimy trochę czasu.
Request
Na początku zajmiemy się odczytaniem danych otrzymanych od klienta i ich zamianą na postać, którą chcemy przesłać do naszej Lambdy. Wchodzimy w Integration Request i zabieramy się za mapowanie danych.
Zmieniamy sposób przesyłania danych z API na When there are no templates defined (recommended), ustawiamy Content-Type na application/json i zaczynamy mapować dane.
Szablonów mapujące dane pisze się za pomocą Apache Velocity Languade. Do stworzenia prostego przekształcenia danych nie jest konieczne dokładne poznanie całości dokumentacji. Poniższy przykład powinien wystarczyć na początek.
Mamy nasze dane:
{ "person" : { "name" : "Przemek", "age" : 45 } }
które chcemy przekształcić na
{ "name" : "Przemek", "age" : 45 }
AWS udostępnia zmienną $input, która umożliwia nam sięgnięcie do danych zawartych w requeście. Metoda json() zwraca nam dane jako JSON. Wykorzystując dostęp do body naszego requesta ($) tworzymy szablon. Wartość dla age mamy dodatkowo zawartą w obiekcie person. Pobierzemy ją następująco $input.json('$.person.age')
. Analogicznie dla name i ostatecznie dostajemy następujący szablon:
{ "age" : $input.json('$.person.age'), "name" : $input.json('$.person.name') }
Zapisujemy naszą konfigurację dla requesta
i powinniśmy być teraz w stanie przetestować API z użyciem Lambdy. Wchodzimy do testowania metody, wypełniamy nasze Request Body
{ "person" : { "name" : "Zażółć gęślą jaźń", "age" : 13 } }
klikamy w test i powinniśmy otrzymać odpowiedź z naszego API
Response
Jak widać nasze API zwraca dokładnie to co dostało z Lambdy. My założyliśmy sobie jednak, że zwracamy z API dane w postaci
{ "data": { "age": 90, "name": "PRZEMEK" } }
oraz dodamy jeden nagłówek HTTP do naszej odpowiedzi.
Zanim zaczniemy konfigurować dane do naszego nagłówka, musimy go dodać. Przechodzimy do konfiguracji Method Response, i dodajemy nasz nagłówek
W kolejnym kroku wpiszemy sobie do tego nagłówka wartość zwróconą z funkcji w polu statusCode. Przechodzimy do zakładki Integration Response i wybieramy możliwość mapowania nagłówków. Powinniśmy zobaczyć nasz nagłówek.
Z odpowiedzi naszej funkcji możemy pobrać jakąkolwiek wartość nagłówka lub body odpowiedzi. Nas interesuje zawartość statusCode. Aby ją pobrać użyjemy wyrażenia integration.response.body.statusCode. Poza zapisaniu zmian i ponownym wywołaniu testu naszego API powinniśmy w nagłówkach zwracanych przez nasz metodę post zobaczyć nasz status
Została ostatnia sprawa. Musimy odesłać do naszego klienta dane w postaci
{ "data": { "age": 90, "name": "PRZEMEK" } }
Tym razem zajmiemy się mapowaniem danych do naszego body. Przechodzimy do Body Mapping Templates, jeżeli nie mamy żadnego szablonu to dodajemy jeden, ponownie wpisując typ application/json
i wpisujemy jako szablon
{ "data" : $input.json('$.body') }
Zapisujemy, testujemy i mam naszą zakładaną odpowiedź
Podsumowanie 🙂
W trakcie pisania tego artykułu co chwilę przychodziły mi do głowy pomysły na wykorzystanie usługi API Gateway. Chciałem nawet zmieniać całość i pokazać jakiś „porządny” przykład. Możliwości są chyba ograniczone tylko naszą wyobraźnią. I wiedzą.