Lambda มันก็แค่ฟังก์ชัน? ลองใช้ AWS Lambda สร้าง API ง่ายๆ เลยดิ!
Lambda มันก็แค่ฟังก์ชัน? ลองใช้ AWS Lambda สร้าง API ง่ายๆ เลยดิ!
ช่วงนี้ใครๆ ก็พูดถึง Serverless กันเยอะแยะเต็มไปหมด หนึ่งในนั้นที่ฮิตสุดๆ ก็คงหนีไม่พ้น AWS Lambda นี่แหละ
มันคืออะไรอ่ะ? อธิบายง่ายๆ เลยนะ มันก็คือบริการที่ให้เราเอาโค้ดฟังก์ชันของเราเนี่ย ไปโยนไว้บนคลาวด์ แล้ว AWS เค้าก็จัดการรันให้เอง ไม่ต้องไปห่วงเรื่องเซิร์ฟเวอร์ ต้องคอยอัปเดต ต้องคอยแก้แพตช์อะไรให้ปวดหัว เอาเวลาไปเขียนโค้ดดีกว่า
ทำไมถึงใช้มัน?
- ไม่ต้องดูแลเซิร์ฟเวอร์: อันนี้โคตรดี ไม่ต้องเสียเวลาเซ็ตอัพ Ubuntu, ลง Nginx, ติดตั้ง Python/Node.js, config อะไรเลย
- จ่ายตามการใช้งานจริง: รันเมื่อไหร่จ่ายเมื่อนั้น ไม่ได้รันก็ไม่เสียตังค์ ประหยัดชิบเป๋ง
- สเกลได้เอง: ถ้ามีคนเรียกเยอะๆ มันก็สเกลเพิ่มเครื่องให้เองอัตโนมัติ เราไม่ต้องทำอะไรเลย
มาลองทำ API ง่ายๆ ด้วย Lambda กัน
วันนี้จะลองทำ API ง่ายๆ ที่แค่ส่ง JSON กลับไปนะ จะใช้ Python เพราะมันโค้ดง่ายดี
ขั้นตอนแรก: สร้าง Lambda Function
ปกติก็เข้า AWS Console ไปเลย กดสร้าง Function แล้วเลือก Python Runtime version ที่ชอบ
โค้ด lambda_function.py จะหน้าตาประมาณนี้:
import json
def lambda_handler(event, context):
"""
AWS Lambda handler function.
Handles incoming requests and returns a JSON response.
"""
print(f"Received event: {json.dumps(event, indent=2)}") # Debug: ดูว่า Event ที่ส่งมามีอะไรบ้าง
# สมมติว่านี่คือข้อมูลที่เราอยากส่งกลับ
data = {
"message": "Hello from Lambda!",
"version": "1.0.0",
"timestamp": "2024-07-30T10:00:00Z"
}
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*' # CORS header, สำคัญมากสำหรับ API
},
'body': json.dumps(data)
}
อธิบายโค้ดนิดนึง: lambda_handler คือฟังก์ชันหลักที่ Lambda จะเรียกใช้ event คือข้อมูลที่ส่งเข้ามา (เช่น ถ้ามาจาก API Gateway ก็จะมี path, query params, body อะไรพวกนี้) ส่วน context คือข้อมูลเกี่ยวกับ runtime ของ Lambda เอง
statusCode: อันนี้สำคัญมาก ถ้าเป็น API ก็ต้องบอกสถานะ HTTP เช่น 200 (OK), 400 (Bad Request), 500 (Server Error) headers: ถ้าทำ API มักจะต้องมี Content-Type เป็น application/json แล้วก็ Access-Control-Allow-Origin ถ้าจะให้ frontend จากโดเมนอื่นเรียกได้ ไม่งั้นติด CORS บานเลยนะจะบอกให้! body: อันนี้คือเนื้อหาที่เราจะส่งกลับไป ต้อง json.dumps ก่อนเสมอถ้าเป็น JSON นะ
ขั้นตอนสอง: ผูกกับ API Gateway
พอเรามี Lambda Function ละ ทีนี้จะเรียกมันยังไงจากข้างนอก? ก็ต้องใช้บริการอีกตัวของ AWS ที่ชื่อ API Gateway
เราสามารถสร้าง API Gateway ใหม่ แล้วผูกกับ Lambda Function ที่เราสร้างไว้ได้เลย กำหนด Path กำหนด Method (GET, POST) อะไรให้เรียบร้อย พอตั้งค่าเสร็จมันก็จะมี URL มาให้เราเรียกใช้
เช่น: https://xxxxxx.execute-api.ap-southeast-1.amazonaws.com/prod/hello
ลอง curl เรียกดู:
curl -X GET https://xxxxxx.execute-api.ap-southeast-1.amazonaws.com/prod/hello
ผลลัพธ์ที่ได้:
{
"message": "Hello from Lambda!",
"version": "1.0.0",
"timestamp": "2024-07-30T10:00:00Z"
}
เยี่ยม! ได้ละ
ปัญหาที่เคยเจอจริงๆ นะ!
- Cold Start: อันนี้เจอประจำ คือถ้า Lambda Function เรามันไม่ได้ถูกเรียกนานๆ พอมีคนเรียกครั้งแรก มันจะใช้เวลาโหลดนานกว่าปกติหน่อย แบบ 5-10 วินาทีก็มี ถ้าเป็น API ที่ต้องการความเร็วสูง อาจจะต้องคิดเยอะๆ
- Package Size: ถ้าเราใช้ไลบรารีเยอะๆ เช่น pandas, numpy เนี่ย ขนาดไฟล์ซิปของ Lambda มันจะใหญ่มาก ทำให้ deploy ช้า แล้วก็อาจจะเจอปัญหาเรื่องพื้นที่จำกัดได้ อันนี้ต้องระวังนิดนึง
Permissions (IAM): อันนี้เป็นอะไรที่งงบ่อยมากตอนเริ่มใหม่ๆ คือ Lambda มันต้องมี Role ที่มีสิทธิ์ไปทำนู่นทำนี่ได้ เช่น ถ้าจะไปอ่านจาก S3 หรือเขียนลง DynamoDB ก็ต้องมีสิทธิ์พวกนั้น บางทีรันแล้วเจอ AccessDenied เนี่ยแหละ ตัวดีเลย!ตัวอย่าง error โง่ๆ ที่เคยเจอ:
{
"errorMessage": "An error occurred (AccessDenied) when calling the GetObject operation: Access Denied",
"errorType": "ClientError",
"stackTrace": [
" File \"/var/task/lambda_function.py\", line 10, in lambda_handler",
" s3.get_object(Bucket='my-bucket', Key='my-file.txt')",
" File \"/var/runtime/botocore/client.py\", line 400, in _api_call",
" return self._make_api_call(operation_name, kwargs)"
]
}
ถ้าเจอแบบนี้คือ Lambda ไม่มีสิทธิ์ไปอ่านไฟล์ใน S3 bucket my-bucket ง่ายๆ เลยคือลืมไปเพิ่ม Permission ให้ Role ของ Lambda นั่นแหละ
ความคิดเห็นส่วนตัว:
Lambda เป็นเครื่องมือที่โคตร powerful สำหรับงานที่ไม่ซับซ้อนมาก เช่น API เล็กๆ, webhook, หรือพวก background job ที่ไม่ต้องรันตลอดเวลา แต่ถ้าจะทำระบบใหญ่ๆ แบบ Microservices ทั้งหมด อาจจะต้องคิดดีๆ เพราะมันมี Learning Curve ของมันนะเรื่อง Serverless เนี่ย แล้วก็มีเรื่อง Cost Optimization ที่ต้องศึกษาเพิ่มอีกหน่อย แต่โดยรวมแล้วถือว่าดีมาก ลองเอาไปใช้ดูสิ ไม่ได้ยากอย่างที่คิดหรอก!