AWS Lambda: ไม่ต้องสน Server, แค่เขียนโค้ด!
สวัสดีครับ! วันนี้จะมาเล่าเรื่อง AWS Lambda ให้ฟังแบบคนทำงานจริง ไม่ต้องเป๊ะมากนะ แต่รับรองได้ไอเดียไปใช้แน่นอน
ไอ้เจ้า Lambda เนี่ย มันคือบริการ Serverless ของ AWS หรือพูดง่ายๆ คือคุณเขียนโค้ดเสร็จแล้วโยนขึ้นไปได้เลย ไม่ต้องไปสนว่ามันจะไปรันบนเซิร์ฟเวอร์ตัวไหน ต้องตั้งค่า RAM, CPU เท่าไหร่ คือตัดเรื่องปวดหัวพวกนี้ทิ้งไปเลยไง ก็แค่เขียนโค้ดให้มันทำงานที่ต้องการ แล้ว AWS จะจัดการให้หมด โคตรสบาย.
ทำไมต้องใช้ Lambda วะ?
บอกตรงๆ นะ สำหรับงานบางอย่าง Lambda นี่คือสวรรค์เลย ถ้าคุณมีโค้ดสั้นๆ ที่อยากให้มันรันตอบสนองกับเหตุการณ์บางอย่าง เช่น:
- มีรูปใหม่มาอัพโหลดใน S3 แล้วอยากให้ Lambda ไป Resize รูปนั้นเลย
- มีข้อมูลใหม่เข้ามาใน DynamoDB แล้วอยากให้ Lambda ไปประมวลผลต่อ
- อยากสร้าง API ง่ายๆ แบบไม่ต้องมาตั้งเซิร์ฟเวอร์เอง
ข้อดีคือมันถูกมาก เพราะจ่ายตามที่ใช้จริง คือถ้าโค้ดไม่รัน ก็ไม่เสียตังค์ เจ๋งปะ?
มาเขียนโค้ด Lambda ง่ายๆ กัน
สมมติว่าเราอยากสร้างฟังก์ชันที่รับชื่อเข้ามา แล้วทักทายกลับไปนะ ง่ายๆ เลย ผมชอบใช้ Python เพราะมันเขียนแป๊บเดียวก็ได้เรื่องละ
import json
def lambda_handler(event, context):
"""
A simple Lambda function that says hello.
"""
name = "Guest"
# ลองเช็คดูว่ามี 'name' ส่งมาใน event มั้ย
if 'queryStringParameters' in event and event['queryStringParameters'] and 'name' in event['queryStringParameters']:
name = event['queryStringParameters']['name']
elif 'body' in event and event['body']:
try:
body_data = json.loads(event['body'])
if 'name' in body_data:
name = body_data['name']
except json.JSONDecodeError:
# ถ้า parsing JSON ไม่ได้ ก็ใช้ค่า default ไป
pass
message = f"Hello, {name}! This is a serverless function."
print(f"Processing request for {name}") # อันนี้ไว้ดูใน CloudWatch Logs
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json'
},
'body': json.dumps({'message': message})
}
# --- วิธีลองรันโค้ดนี้ในเครื่องคุณ (ไม่เกี่ยวกับ Lambda โดยตรง) ---
# ถ้าอยากลองเองในเครื่อง ก็สร้าง event object แบบที่ Lambda ส่งมาให้
if __name__ == "__main__":
# Simulate an API Gateway GET request
test_event_get = {
"queryStringParameters": {
"name": "Alice"
}
}
response_get = lambda_handler(test_event_get, None)
print("\n--- GET Request Simulation ---")
print(response_get)
# Simulate an API Gateway POST request with JSON body
test_event_post = {
"body": "{\"name\": \"Bob\"}",
"headers": {"Content-Type": "application/json"}
}
response_post = lambda_handler(test_event_post, None)
print("\n--- POST Request Simulation ---")
print(response_post)
# Simulate a default request (no name provided)
test_event_default = {}
response_default = lambda_handler(test_event_default, None)
print("\n--- Default Request Simulation ---")
print(response_default)
โค้ดแค่นี้แหละ lambda_handler คือฟังก์ชันหลักที่ Lambda จะเรียกใช้ มันจะรับ event (ข้อมูลที่เข้ามา เช่น จาก API Gateway, S3) กับ context (ข้อมูลเกี่ยวกับ Lambda runtime) มาให้เรา.
โค้ดนี้จะไปรันบน AWS ได้ไง?
จริงๆ มันมีหลายวิธีมาก ตั้งแต่กดอัพโหลดไฟล์ .zip ตรงๆ บนคอนโซล AWS ไปจนถึงใช้ Serverless Framework หรือ AWS SAM ในการจัดการ deployment ที่ซับซ้อนกว่านี้ แต่หลักๆ ก็คือคุณต้องเอาไฟล์ lambda_function.py (หรือชื่ออะไรก็ได้ที่คุณตั้ง) เนี่ยแหละ อัพโหลดขึ้นไป แล้วก็คอนฟิก trigger ว่าจะให้มันรันเมื่อไหร่ เช่น มีคนเรียก API Gateway URL นี้ หรือมีไฟล์ใหม่มาใน S3 bucket
ปัญหาที่เคยเจอมากับตัว (Gotchas!)
บอกเลยว่า Lambda ไม่ได้วิเศษเสมอไปนะ มันมีข้อควรระวังอยู่เหมือนกัน ที่ผมเจอบ่อยๆ คือ:
- Timeout พรวด!: บางทีโค้ดมันประมวลผลนานกว่าที่กำหนดไว้ใน Lambda configuration (Default มัน 3 วินาทีเองนะ) แล้วก็พังไปเลย ขึ้น
Task timed out after X secondsอันนี้ต้องไปเพิ่มTimeoutในคอนโซลของ Lambda ให้มันนานขึ้นหน่อย ถ้างานเรามันใช้เวลานานจริงๆ - Cold Start: อันนี้ไม่ใช่ error แต่มันคือเรื่องที่คุณต้องรู้ เวลา Lambda ฟังก์ชันของคุณไม่ได้ถูกเรียกนานๆ แล้วมีคนเรียกครั้งแรก มันจะใช้เวลาบูตอินสแตนซ์ขึ้นมาใหม่ ซึ่งจะช้ากว่าปกติหน่อย (ประมาณ 100ms - 1-2 วินาที แล้วแต่ภาษาและขนาดโค้ด) ถ้างานที่ต้องการความเร็วแบบทันทีทันใด อาจจะต้องคิดเผื่อเรื่องนี้ด้วย
Dependencies หาย!: เคยไหม? โค้ดรันปกติในเครื่อง pip install ครบหมด แต่พออัพขึ้น Lambda ดันขึ้น No module named 'requests' หรืออะไรประมาณนี้แหละ? อันนี้เจอโคตรบ่อย เพราะเวลาคุณอัพโค้ดขึ้น Lambda ถ้ามันมีไลบรารีข้างนอก (Third-party libraries) คุณต้อง zip ไฟล์ไลบรารีพวกนั้นไปด้วยนะ ไม่งั้น Lambda มันไม่เจอหรอก วิธีคือสร้าง package แล้ว zip มันดีๆตัวอย่าง (สำหรับ Linux/macOS):
mkdir package
pip install requests -t package/
cd package
zip -r9 ../my_lambda_function.zip .
cd ..
zip -g my_lambda_function.zip lambda_function.py
# แล้วเอา my_lambda_function.zip นี่แหละไปอัพโหลด
สรุปความเห็นส่วนตัว
สำหรับผมนะ Lambda มันดีจริงแหละ ถ้างานไม่ได้ซับซ้อนมาก หรือเป็นพวก event-driven คือมีอะไรมาทริกเกอร์ให้มันทำงานเองอะ เจ๋งเลย แล้วก็เหมาะกับพวก MVP (Minimum Viable Product) ที่อยากให้มันขึ้นไปรันได้เร็วๆ ด้วย แต่ถ้าเป็นแอปพลิเคชันใหญ่ๆ มีหลายส่วนเชื่อมกัน มี state ที่ต้องจำเยอะๆ หรือเป็น microservices ที่มี dependency ซับซ้อน บางที manage ด้วย Lambda เพียวๆ ก็ปวดหัวเหมือนกันนะ ไม่ใช่ว่า serverless จะแก้ได้ทุกปัญหานะ บอกเลย!
แต่ถ้าคุณอยากลองเริ่มต้นกับ Serverless ลองเล่น Lambda นี่แหละ มันเปิดโลกให้คุณเยอะเลยจริงๆ ลองดูนะ!