Pisanie i testowanie kodu Lambda

Serverless Applications with AWS Lambda

Claudio Canales

Senior DevOps Engineer

Dlaczego testy i logi są ważne

  • Prawdziwe zdarzenia bywają nieprzewidywalne i różnorodne.
  • Testy wykrywają błędy, zanim zrobi to użytkownik.
  • Logi to twoja „czarna skrzynka" podczas debugowania.

Testowanie to próbna ewakuacja

Serverless Applications with AWS Lambda

Jeden przepływ do zapamiętania

Podstawowe narzędzia przepływu

  • Zdarzenie wchodzi -> handler działa -> odpowiedź wychodzi.
  • Do debugowania używaj logów i testowych zdarzeń.

Przepływ wywołania Lambda

Serverless Applications with AWS Lambda

Gdzie trafiają logi: CloudWatch Logs

  • Lambda domyślnie zapisuje tam wyniki print() i błędy.
  • CloudWatch Logs to magazyn logów AWS dla usług.
  • Grupy logów wyglądają tak: /aws/lambda/<function-name>.

Handler zapisuje logi do CloudWatch Logs

Serverless Applications with AWS Lambda

Kontrakt handlera

  • event to dane wejściowe (payload).
  • context udostępnia metadane środowiska uruchomieniowego.
  • Wartość zwracana staje się odpowiedzią funkcji.

Kontrakt handlera: event + context -> odpowiedź

Serverless Applications with AWS Lambda

Omówienie: event i context

def lambda_handler(event, context):
    request_id = context.aws_request_id
    time_left = context.get_remaining_time_in_millis()
    return {"statusCode": 200}

Adnotacje do event i context

Serverless Applications with AWS Lambda

Bezpieczne parsowanie danych wejściowych

  • Do opcjonalnych pól używaj event.get().
  • Weryfikuj wymagane dane wejściowe jak najwcześniej.
  • Zwracaj czytelne błędy przy brakujących polach.

Bezpieczne parsowanie i wczesna walidacja

Serverless Applications with AWS Lambda

Omówienie: walidacja wymaganych danych

def lambda_handler(event, context):
    if not event.get("name"):
        return {"statusCode": 400, "body": "Missing: name"}
    return {"statusCode": 200, "body": f"Hello, {event.get('name')}!"}

Gałąź walidacji: 400 vs 200

Serverless Applications with AWS Lambda

Przypadki brzegowe do przetestowania

  • Brakujące pola (pusty JSON).
  • Zły typ danych (name jako liczba).
  • Dodatkowe pola lub duże payloady.

Przykłady brzegowych przypadków payloadu

Serverless Applications with AWS Lambda

Przewidywalna odpowiedź funkcji

  • Zachowaj spójną strukturę odpowiedzi.
  • Używaj statusCode dla sukcesów i błędów.
  • Koduj ciało odpowiedzi jako JSON.

Koperta odpowiedzi: statusCode + ciało JSON

Serverless Applications with AWS Lambda

Omówienie: zwracanie JSON

import json

def lambda_handler(event, context):
    body = {"message": "ok"}
    return {"statusCode": 200, "body": json.dumps(body)}

json.dumps: słownik na tekst JSON

Serverless Applications with AWS Lambda

Logowanie i śledzenie

  • Loguj kluczowe pola (w razie potrzeby jako JSON).
  • Dodawaj context.aws_request_id do śledzenia.
  • Nie loguj haseł ani danych osobowych.
  • Domyślnie logi Lambda trafiają do CloudWatch Logs.

Dobre praktyki logowania

Serverless Applications with AWS Lambda

Omówienie: ustrukturyzowane logowanie

import json

def lambda_handler(event, context):
    print(json.dumps({"request_id": context.aws_request_id, "event": event}))
    return {"statusCode": 200}

Ustrukturyzowany log jako wiersz JSON

Serverless Applications with AWS Lambda

Testowanie za pomocą zdarzeń w konsoli

  • Twórz nazwane zdarzenia testowe.
  • Testuj ścieżkę główną i przypadki brzegowe.
  • Po każdym uruchomieniu sprawdzaj odpowiedź i logi.

Zdarzenia testowe w konsoli

Serverless Applications with AWS Lambda

Prosta pętla debugowania

  • Wprowadź niewielką zmianę w kodzie.
  • Wdróż, a następnie uruchom zdarzenie testowe.
  • Przejrzyj odpowiedź i logi w CloudWatch Logs.

Cykl pętli debugowania

Serverless Applications with AWS Lambda

Czas na praktykę!

Serverless Applications with AWS Lambda

Preparing Video For Download...