Viết Hàm Serverless Đầu Tiên Với AWS Lambda và API Gateway
Danh Mục Bài Viết
- 1. Serverless là gì? Tại sao Lambda + API Gateway là bộ đôi hoàn hảo?
- 2. Khi nào nên dùng Lambda + API Gateway?
- 3. Hướng dẫn từng bước: Viết và deploy Lambda Function đầu tiên
- 4. Những sai lầm người mới hay mắc (và cách tránh)
- 5. FAQ — Câu hỏi thường gặp
- 6. Lời kết: Server không biến mất, nhưng bạn không cần quan tâm nữa
Hồi mới bắt đầu làm backend, mình từng thuê một con EC2 t2.micro chỉ để chạy một cái API trả về "Hello World" — và trả tiền đều đặn mỗi tháng dù server gần như trắng traffic. Đến khi biết đến AWS Lambda, mình mới giật mình: thứ mình cần là viết function, không phải quản lý server. Nếu bạn đang ở vị trí tương tự, bài này dành cho bạn.
Serverless là gì? Tại sao Lambda + API Gateway là bộ đôi hoàn hảo?
"Serverless" không có nghĩa là không có server — mà là bạn không phải quan tâm đến server. AWS lo phần đó. Bạn chỉ cần viết code xử lý logic, còn việc cấp phát tài nguyên, scale up/down, patching OS... tất cả đã có AWS đảm nhiệm.
AWS Lambda là dịch vụ compute chạy code theo từng sự kiện (event-driven). Mỗi khi có trigger (HTTP request, file upload lên S3, message từ SQS...), Lambda khởi chạy function của bạn, xử lý xong rồi tắt. Bạn chỉ trả tiền cho đúng thời gian function chạy, tính theo millisecond.
API Gateway là "cánh cửa" nhận HTTP request từ internet và chuyển vào Lambda. Kết hợp lại: bạn có một REST API hoàn chỉnh mà không cần một con server nào chạy ngầm. Free tier của Lambda cực kỳ hào phóng: 1 triệu request miễn phí/tháng và 400,000 GB-seconds compute time — đủ để bạn học và thực hành thoải mái.
Khi nào nên dùng Lambda + API Gateway?
Không phải mọi bài toán đều phù hợp với Serverless. Nhưng với những use case sau, đây gần như là lựa chọn tối ưu:
- API nhỏ với traffic không đều: Một API webhook nhận notification từ payment gateway — traffic gần như bằng 0 trừ khi có giao dịch. EC2 chạy 24/7 cho việc này là lãng phí hoàn toàn.
- Xử lý background job theo sự kiện: User upload ảnh lên S3 → Lambda tự động resize → lưu về S3. Không cần worker server chờ việc.
- Scheduled task (cron job): Dùng EventBridge trigger Lambda mỗi ngày lúc 7h sáng để gửi email digest. Chi phí gần bằng 0.
Hướng dẫn từng bước: Viết và deploy Lambda Function đầu tiên
Dưới đây là luồng hoàn chỉnh: tạo Lambda function, viết code handler, gắn API Gateway, test live. Tất cả qua AWS Console — không cần cài CLI gì thêm lúc mới bắt đầu.
Bước 1: Tạo Lambda Function
Vào AWS Console → Lambda → Create function. Chọn "Author from scratch". Đặt tên function, ví dụ my-first-lambda. Runtime: chọn Python 3.12 hoặc Node.js 20.x tùy sở thích. Architecture: x86_64. Execution role: "Create a new role with basic Lambda permissions" — AWS sẽ tự tạo IAM role cho phép Lambda ghi log vào CloudWatch.
Bước 2: Viết handler function
Sau khi tạo xong, AWS sẽ mở Code editor với file lambda_function.py mặc định. Thay toàn bộ nội dung bằng:
import json
def lambda_handler(event, context):
# event chứa toàn bộ thông tin request từ API Gateway
name = "World"
# Lấy query string parameter nếu có
if event.get("queryStringParameters"):
name = event["queryStringParameters"].get("name", "World")
# Lấy body nếu là POST request
if event.get("body"):
body = json.loads(event["body"])
name = body.get("name", name)
return {
"statusCode": 200,
"headers": {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*"
},
"body": json.dumps({
"message": f"Hello, {name}!",
"source": "AWS Lambda"
}, ensure_ascii=False)
}
Bấm Deploy để lưu code. Lưu ý quan trọng: Lambda handler phải return dict với statusCode và body — đây là format API Gateway proxy integration yêu cầu.
Bước 3: Test function ngay trong Console
Bấm Test → Create new test event. Chọn template "apigateway-aws-proxy". Đổi queryStringParameters thành:
{
"name": "ChienDung"
}
Bấm Test. Nếu thấy statusCode: 200 và message "Hello, ChienDung!" trong Response — bạn đã có Lambda function chạy ngon.
Bước 4: Gắn API Gateway
Vào tab Configuration → Triggers → Add trigger. Chọn API Gateway. Chọn "Create a new API", type HTTP API (rẻ hơn REST API, đủ dùng cho hầu hết use case). Security: "Open" (cho mục đích học — production thì dùng API key hoặc Cognito). Bấm Add.
AWS sẽ tạo API Gateway và trả về một endpoint URL dạng: https://xxxxxxxx.execute-api.ap-southeast-1.amazonaws.com/default/my-first-lambda
Bước 5: Test live API
Mở terminal hoặc dùng curl:
curl "https://YOUR_API_URL/default/my-first-lambda?name=World"
Kết quả trả về:
{"message": "Hello, World!", "source": "AWS Lambda"}
Mẹo "xương máu": Lambda có cold start — lần đầu gọi sau thời gian idle sẽ chậm hơn 200-500ms do AWS cần khởi tạo container. Nếu API của bạn nhạy cảm về latency, bật Provisioned Concurrency để giữ container luôn warm. Với hàm Python đơn giản, cold start thường dưới 300ms — chấp nhận được cho hầu hết use case.
Những sai lầm người mới hay mắc (và cách tránh)
Sau khi làm việc với Lambda một thời gian, mình thấy có 3 lỗi cơ bản xuất hiện lặp đi lặp lại:
1. Quên set timeout phù hợp: Mặc định Lambda timeout là 3 giây. Nếu function gọi database hay external API, 3 giây là quá ngắn. Vào Configuration → General configuration → chỉnh Timeout lên 15-30s tùy use case. Maximum là 15 phút.
2. Để business logic trong handler thay vì tách module: Handler nên mỏng — nhận event, validate, gọi service function, trả kết quả. Code xử lý logic nặng nên ở module riêng để dễ test local trước khi deploy.
3. Không xem CloudWatch Logs khi debug: Mọi print() trong Lambda đều xuất hiện trong CloudWatch Logs. Đây là công cụ debug số 1. Vào CloudWatch → Log groups → tìm /aws/lambda/my-first-lambda → xem từng invocation.
FAQ — Câu hỏi thường gặp
Q: Lambda có phù hợp để chạy ứng dụng web lớn không?A: Không lý tưởng cho web app có nhiều shared state hoặc long-running connection (WebSocket trực tiếp, session server-side). Lambda tốt nhất cho stateless workload. App lớn thường kết hợp: Lambda cho API endpoints + ElastiCache cho session + RDS cho data persistence.
Q: Chi phí thực tế là bao nhiêu?A: Với 1 triệu request/tháng, mỗi function chạy 200ms, memory 128MB: chi phí khoảng $0.40/tháng. So với EC2 t3.micro (~$7.5/tháng), Lambda rẻ hơn nhiều ở mức traffic vừa. Nhưng khi traffic lên cực cao và liên tục, EC2/Container có thể rẻ hơn.
Q: Tôi có thể dùng package bên ngoài (như requests, pandas) không?A: Có. Cách đơn giản nhất: tạo deployment package — zip code +
pip install requests -t .rồi upload. Hoặc dùng Lambda Layers để share dependencies giữa nhiều function. AWS cũng có sẵn một số layer phổ biến như pandas, numpy.
Lời kết: Server không biến mất, nhưng bạn không cần quan tâm nữa
Lambda và API Gateway không phải silver bullet — vẫn có use case mà container hay EC2 phù hợp hơn. Nhưng cho phần lớn API, background job, và automation script mà bạn đang viết hàng ngày, Serverless cho phép bạn tập trung vào code thay vì ops. Một khi đã quen với luồng Lambda → API Gateway → test → deploy, bạn sẽ thấy khó quay lại cách cũ. Bước tiếp theo? Thử kết nối Lambda với DynamoDB để có một CRUD API hoàn chỉnh — kiến trúc chuẩn của hàng ngàn startup đang chạy production trên AWS.
