การกำหนดค่า Lambda functions

Serverless Applications with AWS Lambda

Claudio Canales

Senior DevOps Engineer

ทำไมการกำหนดค่าจึงสำคัญ

  • โค้ดเดียวกันอาจทำงานต่างกันมากหากตั้งค่าต่างกัน
  • การกำหนดค่าควบคุมประสิทธิภาพ ต้นทุน และความปลอดภัย
  • เป้าหมายคือพฤติกรรมที่คาดเดาได้ทั้งใน dev และ prod

โค้ดเดียวกัน การตั้งค่าต่างกัน

Serverless Applications with AWS Lambda

โค้ด vs การกำหนดค่า

Code package

  • Code package
  • Handler logic + dependencies
  • การเปลี่ยนแปลงต้องมีการ deploy

Function configuration

  • Function configuration
  • Memory, timeout, environment variables
  • Execution role + layers
Serverless Applications with AWS Lambda

พารามิเตอร์ที่ควบคุมได้

  • Runtime + handler: โค้ดที่ Lambda รัน
  • Memory + timeout: ประสิทธิภาพ ต้นทุน และความปลอดภัย
  • Environment variables: กำหนดค่าโดยไม่ต้อง hardcode
  • Execution role: สิทธิ์สำหรับ AWS APIs
  • Layers: dependencies ที่ใช้ร่วมกันระหว่างฟังก์ชัน

ปุ่มปรับค่าการกำหนดค่า Lambda

Serverless Applications with AWS Lambda

พื้นฐาน runtime และ handler

  • Runtime = สภาพแวดล้อมของภาษา (เช่น Python)
  • Handler = จุดเริ่มต้นที่ Lambda เรียกใช้
  • รูปแบบ handler: file.function
  • ตัวอย่าง: lambda_function.lambda_handler

การแบ่งส่วน handler string

Serverless Applications with AWS Lambda

Handler string: สิ่งที่อาจผิดพลาดได้

# lambda_function.py
def lambda_handler(event, context):
    return {"statusCode": 200}

Import จากนั้น handler call

Serverless Applications with AWS Lambda

Execution role (IAM)

  • IAM = Identity and Access Management (การจัดการสิทธิ์)
  • Execution role คือสิ่งที่ฟังก์ชันได้รับอนุญาตให้ทำ
  • ควบคุมว่าโค้ดจะเรียกใช้ AWS APIs ใดได้บ้าง

Execution role เปรียบเหมือนบัตรผ่าน

Serverless Applications with AWS Lambda

Lambda layer คืออะไร?

  • Layer คือไฟล์ ZIP ที่แนบกับฟังก์ชัน
  • Lambda จะทำให้ไฟล์ใน layer พร้อมใช้งานที่ /opt ตอน runtime
  • ใช้ layers สำหรับไลบรารีและ utilities ที่ใช้ร่วมกัน
  • อัปเดต layer ครั้งเดียว หลายฟังก์ชันนำไปใช้ซ้ำได้

Layer ที่ mount ไว้ที่ /opt

Serverless Applications with AWS Lambda

ตำแหน่งที่ layers ปรากฏตอน runtime

  • โค้ดของฟังก์ชัน mount ไว้ที่ /var/task
  • layers ที่แนบไว้ mount ไว้ที่ /opt
  • Lambda มีโฟลเดอร์ชั่วคราวที่ /tmp

โฟลเดอร์ runtime: /var/task, /opt, /tmp

Serverless Applications with AWS Lambda

Memory ส่งผลต่อ CPU ด้วย

  • Memory มากขึ้น -> CPU มากขึ้น
  • ช่วยลด runtime สำหรับงานที่ใช้ CPU สูง
  • ต้นทุนรวมขึ้นอยู่กับทั้ง duration และ memory

Memory ที่เพิ่มขึ้นส่งผลต่อ CPU

Serverless Applications with AWS Lambda

ปรับ memory โดยใช้การวัดผล

  • เริ่มต้นด้วยค่าเริ่มต้นที่เหมาะสม (เช่น 256 MB)
  • ทดสอบด้วย event จริง
  • เปรียบเทียบ duration และต้นทุนในแต่ละขนาด memory

วัด duration และต้นทุนตามขนาด memory

Serverless Applications with AWS Lambda

Timeout และการรันที่ปลอดภัย

  • Timeout หยุดการรันที่ค้างอยู่
  • ตรวจสอบเวลาที่เหลืออยู่ก่อนทำงานหนัก
  • ล้มเหลวเร็วและลองใหม่เมื่อเหมาะสม

Timeout เป็นเหมือนตัวจับเวลาความปลอดภัย

Serverless Applications with AWS Lambda

Walkthrough: ตรวจสอบเวลาที่เหลืออยู่

def lambda_handler(event, context):
    time_left = context.get_remaining_time_in_millis()
    if time_left < 500:
        raise TimeoutError("Not enough time left")
    return {"statusCode": 200}

การตรวจสอบเวลาที่เหลือใน context

Serverless Applications with AWS Lambda

Environment variables

  • แยกการกำหนดค่าออกจากโค้ด
  • แยกการตั้งค่า dev/test/prod
  • ใช้ Secrets Manager สำหรับค่าที่ละเอียดอ่อน

Environment variables กำหนดพฤติกรรม

Serverless Applications with AWS Lambda

Walkthrough: อ่าน environment variables

import os

STAGE = os.getenv("STAGE", "dev")
LOG_LEVEL = os.getenv(
    "LOG_LEVEL", "INFO"
)

ค่า default ทำให้การทดสอบในเครื่องปลอดภัยขึ้น

  • import os เพื่อเข้าถึง environment variables
  • os.getenv คืนค่าที่ตั้งไว้หรือค่า default
Serverless Applications with AWS Lambda

ข้อผิดพลาดที่พบบ่อยในการกำหนดค่า

  • การ hardcode ค่า stage ไว้ในโค้ด
  • Timeout ต่ำเกินไปหรือสิทธิ์ IAM ไม่ครบ
  • เก็บ secrets ใน environment variables แบบ plain text

ข้อผิดพลาดที่พบบ่อยและแนวทางปฏิบัติ

Serverless Applications with AWS Lambda

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

Serverless Applications with AWS Lambda

Preparing Video For Download...