Viết và kiểm thử mã Lambda

Ứng dụng Serverless với AWS Lambda

Claudio Canales

Senior DevOps Engineer

Vì sao kiểm thử và ghi log quan trọng

  • Event thực tế lộn xộn và đa dạng.
  • Kiểm thử bắt lỗi trước người dùng.
  • Nhật ký là "hộp đen" để gỡ lỗi.

Kiểm thử như diễn tập chữa cháy

Ứng dụng Serverless với AWS Lambda

Một luồng cần nhớ

Bộ công cụ luồng cốt lõi

  • Event vào -> handler chạy -> phản hồi ra.
  • Dùng log + sự kiện kiểm thử để gỡ lỗi.

Luồng gọi Lambda

Ứng dụng Serverless với AWS Lambda

Log đi đâu: CloudWatch Logs

  • Lambda ghi print() và lỗi vào đó theo mặc định.
  • CloudWatch Logs là nơi lưu log cho dịch vụ AWS.
  • Nhóm log có dạng /aws/lambda/<function-name>.

Handler ghi log vào CloudWatch Logs

Ứng dụng Serverless với AWS Lambda

Hợp đồng của handler

  • event là payload đầu vào.
  • context cung cấp metadata thời gian chạy.
  • Giá trị trả về là phản hồi của hàm.

Hợp đồng handler: event + context -> response

Ứng dụng Serverless với AWS Lambda

Walkthrough: event và context

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

Chú thích event và context

Ứng dụng Serverless với AWS Lambda

Phân tích đầu vào an toàn

  • Ưu tiên event.get() cho trường tùy chọn.
  • Xác thực đầu vào bắt buộc sớm.
  • Trả lỗi rõ ràng khi thiếu trường.

Phân tích an toàn và xác thực sớm

Ứng dụng Serverless với AWS Lambda

Walkthrough: xác thực đầu vào bắt buộc

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

Nhánh xác thực: 400 vs 200

Ứng dụng Serverless với AWS Lambda

Các biên cần kiểm thử

  • Thiếu trường (JSON rỗng).
  • Sai kiểu (name là số).
  • Trường thừa hoặc payload lớn.

Ví dụ payload biên

Ứng dụng Serverless với AWS Lambda

Trả về phản hồi dự đoán được

  • Giữ cấu trúc phản hồi nhất quán.
  • Dùng statusCode cho thành công/lỗi.
  • Mã hóa JSON cho body phản hồi.

Vỏ phản hồi: statusCode + JSON body

Ứng dụng Serverless với AWS Lambda

Walkthrough: trả về JSON

import json

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

json.dumps: dict thành văn bản JSON

Ứng dụng Serverless với AWS Lambda

Ghi log và truy vết

  • Ghi log các trường chính (dùng JSON khi cần).
  • Bao gồm context.aws_request_id để truy vết.
  • Tránh ghi bí mật hoặc dữ liệu cá nhân.
  • Mặc định, log Lambda nằm trong CloudWatch Logs.

Thực hành tốt về logging

Ứng dụng Serverless với AWS Lambda

Walkthrough: log có cấu trúc

import json

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

Dòng log có cấu trúc JSON

Ứng dụng Serverless với AWS Lambda

Kiểm thử với sự kiện trên console

  • Tạo event kiểm thử có tên.
  • Kiểm thử luồng chuẩn và các biên.
  • Xem phản hồi + log sau mỗi lần chạy.

Sự kiện kiểm thử trên Console

Ứng dụng Serverless với AWS Lambda

Vòng lặp debug đơn giản

  • Sửa mã nhỏ.
  • Triển khai, rồi chạy sự kiện kiểm thử.
  • Đọc phản hồi + CloudWatch Logs.

Chu trình vòng lặp debug

Ứng dụng Serverless với AWS Lambda

Let's practice!

Ứng dụng Serverless với AWS Lambda

Preparing Video For Download...