Lambda 코드 작성 및 테스트

AWS Lambda로 구축하는 서버리스 애플리케이션

Claudio Canales

Senior DevOps Engineer

테스트와 로깅이 중요한 이유

  • 실제 이벤트는 복잡하고 형태도 다양합니다.
  • 테스트는 사용자보다 먼저 오류를 잡아냅니다.
  • 로그는 디버깅을 위한 "블랙박스"입니다.

테스트는 화재 대피 훈련과 같습니다

AWS Lambda로 구축하는 서버리스 애플리케이션

기억해야 할 하나의 흐름

핵심 흐름 도구

  • 이벤트 입력 -> 핸들러 실행 -> 응답 반환.
  • 로그와 테스트 이벤트로 디버깅합니다.

Lambda 호출 흐름

AWS Lambda로 구축하는 서버리스 애플리케이션

로그가 저장되는 곳: CloudWatch Logs

  • print() 출력과 오류는 기본적으로 여기에 기록됩니다.
  • CloudWatch Logs는 AWS의 서비스 로그 저장소입니다.
  • 로그 그룹 형식은 /aws/lambda/<function-name>입니다.

핸들러가 CloudWatch Logs에 기록하는 흐름

AWS Lambda로 구축하는 서버리스 애플리케이션

핸들러 계약

  • event는 입력 페이로드입니다.
  • context는 런타임 메타데이터를 제공합니다.
  • 반환값은 함수 응답이 됩니다.

핸들러 계약: event + context -> 응답

AWS Lambda로 구축하는 서버리스 애플리케이션

실습: event와 context

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

event와 context 설명

AWS Lambda로 구축하는 서버리스 애플리케이션

안전한 입력 파싱

  • 선택 필드에는 event.get()을 사용하세요.
  • 필수 입력값은 초반에 검증하세요.
  • 누락된 필드에 대해 명확한 오류를 반환하세요.

안전한 파싱과 조기 검증

AWS Lambda로 구축하는 서버리스 애플리케이션

실습: 필수 입력값 검증

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')}!"}

검증 분기: 400 vs 200

AWS Lambda로 구축하는 서버리스 애플리케이션

테스트해야 할 엣지 케이스

  • 누락된 필드 (빈 JSON).
  • 잘못된 타입 (name이 숫자인 경우).
  • 추가 필드 또는 큰 페이로드.

엣지 케이스 페이로드 예시

AWS Lambda로 구축하는 서버리스 애플리케이션

예측 가능한 응답 반환

  • 응답 형식을 일관되게 유지하세요.
  • 성공과 오류 모두 statusCode를 사용하세요.
  • 응답 본문을 JSON으로 인코딩하세요.

응답 봉투: statusCode + JSON 본문

AWS Lambda로 구축하는 서버리스 애플리케이션

실습: JSON 반환

import json

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

json.dumps: 딕셔너리를 JSON 텍스트로 변환

AWS Lambda로 구축하는 서버리스 애플리케이션

로깅과 추적

  • 주요 필드를 로깅하세요 (필요 시 JSON 사용).
  • 추적을 위해 context.aws_request_id를 포함하세요.
  • 비밀 정보나 개인 데이터는 로깅하지 마세요.
  • Lambda 로그는 기본적으로 CloudWatch Logs에 저장됩니다.

로깅 모범 사례

AWS Lambda로 구축하는 서버리스 애플리케이션

실습: 구조화된 로깅

import json

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

구조화된 로깅 JSON 줄

AWS Lambda로 구축하는 서버리스 애플리케이션

콘솔 이벤트로 테스트하기

  • 이름이 있는 테스트 이벤트를 생성하세요.
  • 정상 경로와 엣지 케이스를 테스트하세요.
  • 실행 후 응답과 로그를 확인하세요.

콘솔 테스트 이벤트

AWS Lambda로 구축하는 서버리스 애플리케이션

간단한 디버그 루프

  • 코드를 소폭 변경합니다.
  • 배포 후 테스트 이벤트를 실행합니다.
  • 응답과 CloudWatch Logs를 확인합니다.

디버그 루프 사이클

AWS Lambda로 구축하는 서버리스 애플리케이션

연습해 봅시다!

AWS Lambda로 구축하는 서버리스 애플리케이션

Preparing Video For Download...