Strona Główna / Blog

Koniec z Zależnościami! Jak AWS Lambda Layers Ułatwi Ci Życie

Przemek Malak

Przemek Malak

AWS Architect (Development) w Chmurowisku. Ponad 18 lat w branży IT. Architekt rozwiązań chmurowych i mobilnych oraz Programista (przez duże P). Entuzjasta rozwiązań Serverless, posiadacz kilku certyfikacji AWS (Architect, Developer, SysOps).

Przełomowa usługa w chmurze? Było ich już kilka. Z pewnością zalicza się do nich udostępniona światu w listopadzie 2014 roku AWS Lambda, która raz na zawsze zmieniła oblicze chmury. Z jej pomocą możemy uruchamiać kod naszych aplikacji bez „zabawy” w zarządzanie infrastrukturą pod spodem.

Problem z tworzeniem AWS Lambdy

Samo tworzenie Lambdy jest dosyć proste. Budujemy nasz kod, dodajemy wszystkie niezbędne zależności, pakujemy to w zip-a i wrzucamy bezpośrednio lub poprzez S3 do usługi.

Kluczowe w poprzednim zdaniu jest sformułowanie wszystkie niezbędne zależności. Tak, do tej pory, aby stworzyć usługę AWS Lambda, zawsze konieczne było dodanie wszystkich zależności. Nawet jeżeli zmienialiśmy w naszym kodzie jedną linijkę, musieliśmy jeszcze raz wrzucać całą, często wielomegabajtową paczkę.

Teraz to się zmieniło. Z pomocą przychodzi nam zaprezentowana nakonferencji re:Invent 2018 funkcjonalność AWS Lambda Layers.

Dodatkowe możliwości dzięki AWS Lambda Layers

Dzięki AWS Lambda Layers możemy tak skonfigurować funkcję Lambda, aby korzystała z dodatkowego kodu, którego nie ma w samej paczce z funkcją. W takiej warstwie, w formie pliku .zip, umieszczamy czy to dodatkowe biblioteki, czy też nasz kod, który możemy współdzielić później w różnych Lambdach.

Funkcja Lambda może korzystać maksymalnie z pięciu dodatkowych warstw (layers). Każda z nich może mieć wiele wersji.

Mamy możliwość używania własnych warstw, korzystania z warstw udostępnionychprzez innych użytkowników (dzięki resource-based policies) oraz wykorzystania tych, które przygotował dla nas AWS.

Jak dodać własną funkcję AWS Lambda Layer?

Zacznijmy od pierwszego przypadku. Pokażę, jak dodawać własne AWS Lambda Layers na przykładzie Pythona. Jest to dość proste. 

Załóżmy, że chcemy po prostu udostępnić jakiś moduł z funkcją. Niech to będzie banalna funkcja dodająca dwie liczby:

def sum(a, b):
    return a + b

  1. Zapisujemy ją w pliku, np. sum.py i umieszczamy w jakimś katalogu python (WAŻNE: funkcja musi być zapisana właśnie w takim katalogu).
  2. Następnie kompresujemy cały katalog, np. do pliku python.zip.
  3. W konsoli AWS wybieramy sekcję Layers i wciskamy [Create Layer]:
  1. Ukazuje nam się interfejs, w którym możemy nazwać naszą warstwę (1), dodać do niej jakiś opis (2) oraz dodać nasz plik zip z zawartością (3).
  2. Możemy także wybrać środowiska uruchomieniowe, z którymi nasz Layer może współpracować (4) oraz podać URL do ewentualnej licencji.
  1. Po kliknięciu przycisku [Create] nasza funkcja powinna się utworzyć. Powinniśmy także ujrzeć konfigurację pierwszej wersji:

Teraz właściwie wszystko jest już gotowe, abyśmy mogli skorzystać z naszej warstwy.

Jak skorzystać z AWS Lambda Layer?

Mamy już naszą AWS Lambda Layer. Aby z niej skorzystać, oczywiście musimy utworzyć najpierw funkcję Lambda.

W lekko zmienionej konsoli AWS możemy zarządzać między innymi tym, jakie warstwy są podpięte pod naszą funkcję Lambda:

Jeżeli klikniemy w Layers, pojawi się możliwość ich dodania:

Klikamy w [Add a layer] i z listy wybieramy warstwę, którą chcemy dodać:

Ja wybrałem swój layer Adder w wersji pierwszej. Po kliknięciu w przycisk [Add] i zapisaniu zmian w samej Lambdzie mamy praktycznie wszystko gotowe. Możemy zacząć kodować.

Korzystanie z modułów warstwy

W Pythonie korzystanie z modułów dołączonych w warstwach jest bardzo proste.

Importujemy po prostu naszą funkcję:

from sum import sum

i możemy zacząć z niej korzystać.

Przykładowe wywołanie funkcji Lambda z kodem:

from sum import sum
def lambda_handler(event, context):
   print(sum(9,6))

skorzysta z funkcji z modułu i zwróci wynik:

Function Logs:
START RequestId: caf001a5-fbbc-11e8-a20c-25d4404fa079 Version: $LATEST
15
END RequestId: caf001a5-fbbc-11e8-a20c-25d4404fa079

Co z zależnościami?

AWS Lambda Layers to również znakomity sposób na wykorzystanie zewnętrznych bibliotek. Wystarczy przygotować sobie pakiet z potrzebnymi modułami, udostępnić go jako warstwę i możemy zapomnieć o każdorazowym dołączaniu do funkcji Lambda wszelkich zależności.

Jak to zrobić?

Załóżmy, że chcemy skorzystać z naszych Lambdach z pakietu Requests.

  1. Tworzymy katalog python.

mkdir python

  1. Wchodzimy do niego i tworzymy środowisko wirtualne:

cd python
python3 -m venv lambda_layer_environment
source lambda_layer_environment/bin/activate

  1. Instalujemy zapytania:

pip install requests

  1. Teraz musimy doinstalować wszystkie pakiety, od których są zależne nasze zapytania. Najpierw zapisujemy wszystkie zależności do pliku requirements.txt, a następnie doinstalowujemy je:

pip freeze > requirements.txt
pip install -r requirements.txt -t .

  1. Pozostaje nam tylko wyłączyć nasze wirtualne środowisko, a następnie je usunąć:

deactivate
rm -r lambda_layer_environment

W naszym katalogu python powinniśmy mieć teraz wszystkie niezbędne pliki:

  1. Na koniec pakujemy cały katalog do pliku zip i tworzymy z jego pomocą nową warstwę. Po dodaniu jej do Lambdy możemy już bez problemu korzystać z modułu Requests, bez konieczności dodawania go do pakietu.

def lambda_handler(event, context):
    req = requests.get('https://chmurowisko.pl')
    print(req.text[0:100])
    if (req.status_code == 200):
        return'Success'
    else:
        return 'Error'

Jak działa AWS Lambda Layers?

Dokumentacja AWS Lambda Layers mówi, że nasze pakiety trafiają do katalogu /opt. I rzeczywiście. Uruchomiłem w funkcji Lambda poniższy kod:

def lambda_handler2(event, context):
     modules = os.popen("find /*-type d | grep'/opt/'").read().split("\n")
     return {
         'modules': modules
   }

a w wynikach pokazały się między innymi nasze moduły:

Podsumowanie

AWS wykonał kawał dobrej roboty, wprowadzając Layers. Nowa funkcjonalność znacznie ułatwi kodowanie i deployment. Od teraz programistom będzie o wiele łatwiej unikać zbędnego powtarzania kodu (zgodnie z regułą Don’t Repeat Yourself).

Developerzy w chmurze zdają się podzielać mój entuzjazm. Już teraz powstają pierwsze warstwy jako open source, a pewnie niebawem pojawi się ich jeszcze więcej. Zachęcam Was do skorzystania z istniejących warstw, tworzenia własnych  i dzielenia się nimi ze światem za pomocą resource-based policies.

Dajcie znać, jak Wam się podoba nowa funkcjonalność od AWS!

Dołącz do listy mailingowej!

Dołącz do naszego newslettera

Staramy się wysyłać tylko wartościowe informacje, np. co miesiąc dostaniesz spis najważniejszych nowości z chmur Azure, AWS i GCP, z krótkimi opisami i linkami.