AWS Lambda wspiera kilka środowisk uruchomieniowych. W obecnej chwili (grudzień 2021) jest ich aż 6. Ponadto istnieje możliwość implementacji swojego własnego środowiska uruchomieniowego. Jednym ze wspieranych środowisk jest Python w wersjach: 2.7, 3.6, 3.7, 3.8 i 3.9. Według raportu Datadog, Python jest najpopularniejszym językiem za pomocą którego użytkownicy implementują funkcje Lambda.
Z tego artykułu dowiesz się:
- jakich narzędzi używać w efektywnej pracy z AWS Lambda w połączeniu z Pythonem,
- w jaki sposób tworzyć oraz wdrażać funkcje Lambda zaimplementowane za pomocą Pythona,
- jak weryfikować działanie funkcji.
Narzędzia przydatne w pracy z AWS Lambda
AWS CLI
Podstawowym narzędziem w pracy z AWS jest AWS CLI. Instrukcję instalacji można znaleźć w oficjalnej dokumentacji. Po instalacji należy je skonfigurować, żeby umożliwić pracę z kontem AWS.
AWS SAM CLI
Kolejnym przydatnym narzędziem jest AWS SAM CLI. Służy do lokalnego uruchamiania funkcji oraz wdrażania ich do chmury. Kompletną instrukcję, w jaki sposób je zainstalować, znajdziesz tutaj.
PyCharm
PyCharm firmy JetBrains oferuje zintegrowane środowisko programistyczne skupione na Pythonie. Posiada bardzo przydatne wtyczki do pracy z AWS, takie jak AWS Toolkit, dzięki któremu będziesz w stanie z łatwością uruchamiać oraz debugować funkcje Lambda lokalnie.
Struktura projektu Pythona
AWS SAM CLI oferuje gotowe szablony, które możemy wykorzystać w tworzeniu aplikacji za pomocą Pythona. Struktura tak przygotowanego projektu może być niejasna. W niektórych przypadkach jest w pewien sposób niepełna, a czasem zbyt skomplikowana. Przedstawię, jak w prosty sposób można stworzyć początkową strukturę projektu. To oczywiście tylko propozycja i ułożenie można modyfikować według swoich wymagań. W najprostszym przypadku, organizacja katalogów może wyglądać w taki sposób:
root-directory
│ Makefile
│ template.yaml
└───calculate_student_grade
calculator.py
lambda_handler.py
requirements.txt
__init__.py
Plik Makefile
może służyć jako miejsce składowania przydatnych instrukcji podczas budowania czy wdrażania aplikacji. Możemy tam zamieścić na przykład skrypty, które umówimy później. Plik template.yaml
zawiera opis funkcji za pomocą CloudFormation, jego treść poznasz w następnym rozdziale. Warto stworzyć osobny folder na kod aplikacyjny, żeby oddzielić go od rzeczy związanych z infrastrukturą i skryptami użytkowymi. W naszym przypadku jest to folder calculate_student_grade
, który wziął nazwę od nazwy funkcji, którą chcemy przygotować. Kluczowym jest plik lambdy_handler.py
, który zawiera definicję handlera funkcji Lambda:
from calculator import calculate
def handle(event, context):
return produce_result(event['lectureGrade'], event['exerciseGrade'], event['workshopGrade'])
def produce_result(lecture_grade, exercise_grade, workshop_grade):
final_grade, has_passed = calculate(lecture_grade, exercise_grade, workshop_grade)
return {
'finalGrade': final_grade,
'hasPassed': has_passed
}
Poprawny handler powinien być funkcją, która przyjmuje dwa parametry: event
oraz context
. event
to nic innego jak obiekt reprezentujący payload przekazany do funkcji Lambda. context
to obiekt zawierający metody oraz właściwości, które zawierają informacje na temat wywołania funkcji oraz środowiska uruchomieniowego. Więcej informacji na ten temat możesz znaleźć tutaj.
Wdrażanie funkcji
Funkcję Lambda najłatwiej wdrożyć za pomocą AWS SAM oraz CloudFormation. W tym celu musisz zdefiniować plik opisujący funkcję pod kątem infrastrukturalnym. Żeby to osiągnąć, należy stworzyć plik YAML w katalogu projektu. Wewnątrz pliku trzeba zdefiniować wszystkie potrzebne właściwości funkcji:
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: Calculate student grade
Resources:
CalculateStudentGrade:
Type: AWS::Serverless::Function
Properties:
FunctionName: calculate-sudent-grade
CodeUri: calculate_student_grade/
Handler: lambda_handler.handle
Runtime: python3.8
Timeout: 5
MemorySize: 128
Zawartość jest dość czytelna i myślę, że większość właściwości nie wymaga komentarza. Pełną dokumentację tego zasobu znajdziesz tutaj. CodeUri
wskazuje na lokalizację kodu, który ma się wykonać w funkcji Lambda. Z kolei Handler
to (przedzielone kropką) kolejno: nazwa modułu oraz nazwa funkcji, która pełni punkt wejścia do funkcji Lambda.
Posiadając plik opisujący funkcję Lambda, przystąp do wdrożenia. Bardzo pomocne będzie wcześniej wspomniane narzędzie AWS SAM CLI. Zakładając, że wcześniej zostało skonfigurowane konto, na które chcesz wdrożyć funkcję, a także zostały zainstalowane wspomniane wcześniej narzędzia, wystarczy uruchomić następujące komendy:
sam build
Powyższe polecenie przygotowuje paczkę, która następnie będzie wdrożona w naszym koncie AWS. Odpowiednio przygotowany kod i szablon CloudFormation możesz znaleźć w folderze .aws-sam
. Po odpowiednim przygotowaniu naszego projektu, możesz wdrożyć funkcję za pomocą komendy:
sam deploy --template-file ./.aws-sam/build/template.yaml \
--stack-name aws-lambda-python \
--s3-bucket <your-s3-bucket> \
--s3-prefix aws-lambda-python/ \
--region eu-west-1 \
--capabilities CAPABILITY_IAM \
--no-fail-on-empty-changeset
Pierwsza komenda przygotowuje kod do wdrożenia, a druga – faktycznie je realizuje. W treści komendy należy zmienić parametr --s3-bucket
na nazwę wcześniej stworzonego bucketa, który będzie służył do przechowywania artefaktów wdrożenia. Przy pierwszym wywołaniu skryptu powinniśmy zobaczyć rezultat publikowania projektu oraz pełny proces wdrażania funkcji:

Testowanie działania rozwiązania
Weryfikacja działania w chmurze
Po wdrożeniu funkcji warto zweryfikować jej działanie. Możesz zrobić to, wywołując ją między innymi bezpośrednio z portalu AWS lub z linii poleceń. W celu wywołania funkcji z portalu należy znaleźć ją na liście funkcji i wywołać z poprawnym zapytaniem. Przykładowe zapytanie wykorzystane do wywołania funkcji może wyglądać następująco:
{
"lectureGrade": 3,
"exerciseGrade": 4,
"workshopGrade": 4.5
}

Można również wywołać funkcję z wiersza poleceń za pomocą komendy:
aws lambda invoke \
--function-name calculate-student-grade \
--payload file://payload.json \
response.json
Plik payload.json
powinien zawierać wcześniej wspomniane zapytanie, natomiast plik response.json
będzie zawierać odpowiedź po wywołaniu funkcji. Po wykonaniu komendy w wierszu poleceń powinna pojawić się informacja o poprawnym wywołaniu funkcji. Z kolei plik response.json
powinien zawierać tę samą odpowiedź, co w portalu.
Lokalne uruchamianie funkcji
W celu przetestowania działania funkcji niekoniecznie trzeba wdrażać ją na środowisko. Dzięki AWS SAM CLI możesz uruchomić funkcję lokalnie. Żeby to zrobić, wystarczy wywołać odpowiednią komendę:
sam local invoke -e payload.json CalculateStudentGrade
Po wykonaniu komendy zostanie przygotowany kontener, który obsługuje nasze zapytanie. Otrzymujemy pełny log wywołania, razem z odpowiedzią z funkcji.

Możemy nie tylko uruchamiać lokalnie naszą funkcję, ale również ją debugować. Bardzo przydatne do tego celu jest zintegrowane środowisko programistyczne PyCharm z pluginem AWS Toolkit. Z tymi narzędziami proces debugowania wygląda następująco:
Wszystkie przykłady gotowe do samodzielnego przetestowania znajdziesz w moim repozytorium.
Zobacz w jaki sposób pracować z AWS Lambda z wykorzystaniem innych środowisk i języków programowania: