AWS Lambda tiên phong không gian serverless. Nhiều developer tin serverless là tương lai phát triển. Nó mang lại mô hình pay-per-use thực sự, giải phóng bạn khỏi việc maintain và scale hạ tầng backend. Nhưng cũng đi kèm thách thức. Một trong đó là tính stateless. Bạn cần lưu state ở external data store. Rất tiếc, hầu hết data store phổ biến đều connection-based. Như đã giải thích trong bài viết này, quản lý connections có thể đau đầu trong serverless. Đó là lý do chúng tôi phát triển high-performance REST API trên Upstash Redis. Bài viết này sẽ implement một stateful API cơ bản (page counter) trên AWS Lambda và Upstash Redis dùng REST API.
Xem demo trực tiếp: https://3jyz1n07o8.execute-api.us-east-1.amazonaws.com/count
Xem mã nguồn: GitHub
Thiết lập Project
Chúng ta dùng Serverless Framework để deploy ứng dụng.
git:(master) ✗ serverless
Serverless: No project detected. Do you want to create a new one? Yes
Serverless: What do you want to make? AWS Node.js
Serverless: What do you want to call this project? aws-lambda-redis-rest
Project successfully created in 'aws-lambda-redis-rest' folder.
Mã nguồn
Cài đặt fetch qua npm install node-fetch. Tạo database từ Upstash Console. Click nút REST API, copy URL và token. Cập nhật handler.js:
const fetch = require("node-fetch");
module.exports.hello = async (event) => {
const url = "https://us1-last-panther-33620.upstash.io/incr/counter?_token=AACQgMzYyNGM0OGMtZWQ3MC00OTRlLWFmOGEtODc3ZWQxYWQyZGJjZjgyOTlkM2JhNWIxE3OTJlNmE2NGVjNGM=";
let data = await fetch(url);
let result = await data.text();
return {
statusCode: 200,
body: result
};
};
Thêm API endpoint vào serverless.yml:
service: aws-lambda-redis-rest
frameworkVersion: '2'
provider:
name: aws
runtime: nodejs12.x
lambdaHashingVersion: 20201221
functions:
hello:
handler: handler.hello
events:
- httpApi:
path: /count
method: get
Chạy và Deploy
Chạy local:
serverless invoke local -f hello
Deploy:
serverless deploy
Lệnh sẽ output URL để kiểm tra trên browser.
Lưu ý quan trọng
- Để hiệu suất tốt nhất, database và AWS Lambda function nên cùng region.
- Nhờ REST API, không cần quản lý database connections và không cần Redis client.
- Không chia sẻ API token công khai. Nếu rò rỉ, có thể revoke bằng cách reset password database.
- Muốn chạy nhiều command trong một function, dùng Pipeline API cho hiệu suất tốt nhất.