AWS Lambda เป็นผู้นำในพื้นที่ Serverless นักพัฒนาหลายคนเชื่อว่า Serverless คืออนาคตของการพัฒนา มันให้โมเดล Pay-per-use ที่แท้จริง หลุดพ้นจากการบำรุงรักษาและการขยายสเกลโครงสร้างพื้นฐานแบ็กเอนด์ แต่ก็มาพร้อมกับความท้าทาย หนึ่งในนั้นคือความ Stateless (ไม่มีสถานะ) คุณต้องเก็บ State ไว้ใน External Data Store น่าเสียดายที่ฐานข้อมูลยอดนิยมส่วนใหญ่เป็น Connection-based ตามที่เราอธิบายใน โพสต์นี้ การจัดการ Connections อาจกลายเป็นเรื่องปวดหัวใน Serverless นั่นคือเหตุผลที่เราพัฒนา REST API ประสิทธิภาพสูง บน Upstash Redis ในบล็อกนี้ผมจะนำ Stateful API แบบพื้นฐาน (Page Counter) ไปใช้บน AWS Lambda และ Upstash Redis ผ่าน REST API
ดู Live Demo: https://3jyz1n07o8.execute-api.us-east-1.amazonaws.com/count
ดูโค้ด: GitHub Repository
การตั้งค่าโปรเจกต์
เราจะใช้ Serverless Framework เพื่อ Deploy แอปพลิเคชัน
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.
โค้ด
ติดตั้ง fetch ผ่าน npm install node-fetch จากนั้นสร้างฐานข้อมูลจาก Upstash Console คลิกปุ่ม REST API และคัดลอก URL และ Token อัปเดต 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
};
};
เพิ่ม API Endpoint ใน 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
รันและ Deploy
คุณสามารถรันฟังก์ชันในเครื่องได้:
serverless invoke local -f hello
Deploy ด้วยคำสั่ง:
serverless deploy
คำสั่งจะแสดง URL ที่คุณสามารถตรวจสอบในเบราว์เซอร์ได้
หมายเหตุ
- เพื่อประสิทธิภาพที่ดีที่สุด ฐานข้อมูลและ AWS Lambda Function ควรอยู่ในภูมิภาคเดียวกัน
- ขอบคุณ REST API เราไม่ต้องจัดการ Database Connections และไม่ต้องใช้ Redis Client ใดๆ
- อย่าแชร์ API Token สาธารณะ หากรั่วโดยไม่ได้ตั้งใจ คุณสามารถเพิกถอนได้โดยการรีเซ็ตรหัสผ่านของฐานข้อมูล
- หากต้องการรันหลายคำสั่งในฟังก์ชันเดียว ให้ใช้ Pipeline API เพื่อประสิทธิภาพที่ดีที่สุด