การเขียนและทดสอบโค้ด Lambda

Serverless Applications with AWS Lambda

Claudio Canales

Senior DevOps Engineer

ทำไมการทดสอบและการ log จึงสำคัญ

  • Event จริงมีรูปแบบหลากหลายและซับซ้อน
  • การทดสอบช่วยดักจับข้อผิดพลาดก่อนผู้ใช้พบ
  • Log คือ "กล่องดำ" สำหรับการดีบัก

การทดสอบเปรียบเหมือนการซ้อมหนีไฟ

Serverless Applications with AWS Lambda

flow ที่ต้องจำให้ได้

ชุดเครื่องมือหลักของ flow

  • Event เข้า -> handler ทำงาน -> ส่ง response ออก
  • ใช้ log และ test event ช่วยดีบัก

flow การเรียกใช้ Lambda

Serverless Applications with AWS Lambda

Log ถูกเก็บไว้ที่ไหน: CloudWatch Logs

  • Lambda บันทึกผลลัพธ์จาก print() และข้อผิดพลาดไว้ที่นี่โดยอัตโนมัติ
  • CloudWatch Logs คือที่เก็บ log ของบริการ AWS
  • Log group มีรูปแบบ /aws/lambda/<function-name>

Handler ส่ง log ไปยัง CloudWatch Logs

Serverless Applications with AWS Lambda

Handler contract

  • event คือ input payload
  • context ให้ข้อมูล metadata ขณะรันไทม์
  • ค่าที่ return จะกลายเป็น response ของฟังก์ชัน

Handler contract: event + context -> response

Serverless Applications with 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

Serverless Applications with AWS Lambda

การ parse input อย่างปลอดภัย

  • ใช้ event.get() สำหรับฟิลด์ที่ไม่บังคับ
  • ตรวจสอบ input ที่จำเป็นตั้งแต่ต้น
  • ส่ง error ที่ชัดเจนเมื่อฟิลด์หายไป

parse อย่างปลอดภัยและ validate ตั้งแต่ต้น

Serverless Applications with AWS Lambda

ตัวอย่าง: การ validate input ที่จำเป็น

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

สาขา validation: 400 vs 200

Serverless Applications with AWS Lambda

Edge case ที่ควรทดสอบ

  • ฟิลด์หายไป (JSON ว่างเปล่า)
  • ประเภทข้อมูลผิด (name เป็นตัวเลข)
  • ฟิลด์เกิน หรือ payload ขนาดใหญ่

ตัวอย่าง payload สำหรับ edge case

Serverless Applications with AWS Lambda

การส่ง response ที่คาดเดาได้

  • รักษารูปแบบ response ให้สม่ำเสมอ
  • ใช้ statusCode สำหรับสำเร็จหรือ error
  • เข้ารหัส response body เป็น JSON

Response envelope: statusCode + JSON body

Serverless Applications with AWS Lambda

ตัวอย่าง: การส่ง JSON กลับ

import json

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

json.dumps: แปลง dict เป็น JSON text

Serverless Applications with AWS Lambda

การ log และการ trace

  • Log ฟิลด์สำคัญ (ใช้ JSON เมื่อจำเป็น)
  • ใส่ context.aws_request_id เพื่อ trace
  • หลีกเลี่ยงการ log ข้อมูลลับหรือข้อมูลส่วนตัว
  • โดยค่าเริ่มต้น Lambda จะส่ง log ไปยัง CloudWatch Logs

แนวปฏิบัติที่ดีสำหรับการ log

Serverless Applications with AWS Lambda

ตัวอย่าง: structured logging

import json

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

บรรทัด JSON สำหรับ structured logging

Serverless Applications with AWS Lambda

การทดสอบด้วย console event

  • สร้าง test event แบบตั้งชื่อ
  • ทดสอบ happy path และ edge case
  • ตรวจสอบ response และ log หลังแต่ละครั้ง

Test event บน console

Serverless Applications with AWS Lambda

debug loop อย่างง่าย

  • แก้ไขโค้ดเล็กน้อย
  • Deploy แล้วรัน test event
  • อ่าน response และ CloudWatch Logs

วงจร debug loop

Serverless Applications with AWS Lambda

มาฝึกกันเถอะ!

Serverless Applications with AWS Lambda

Preparing Video For Download...