ในบล็อกโพสต์นี้ คุณจะได้เรียนรู้วิธีรวม AWS Lambda และ Redis Enterprise Cloud ผ่านแอปพลิเคชันตัวอย่างฐานข้อมูลหนัง คุณจะค้นพบวิธีสร้างและปรับใช้ (deploy) Lambda functions 2 ตัว หนึ่งเป็น Node.js อีกหนึ่งเป็น Python Lambda functions ทั้งสองนี้ใช้โต้ตอบกับฐานข้อมูล Redis เพื่อ insert, update, delete และ query แอปพลิเคชันใช้ RediSearch API ที่ให้คุณลักษณะ query และ search ที่หลากหลาย Serverless ด้วย AWS Lambda เข้ากับแนวโน้มที่เพิ่มขึ้นของสถาปัตยกรรมไมโครเซอร์วิส เพราะช่วยให้นักพัฒนาลดขอบเขตของ "บริการ" ธุรกิจให้เป็นโปรเจกต์เล็กๆ ที่สามารถนำไปใช้ด้วยภาษาโปรแกรมที่ต้องการได้ เพื่อเรียนรู้เพิ่มเติม ดูวิดีโอด้านล่างและอ่านต่อสำหรับภาพรวม AWS Lambda แบบรวดเร็ว และลึกเข้าไปในการสร้างแอปพลิเคชันด้วย Redis Enterprise Cloud และ Lambda:
มาดู AWS Lambda แบบรวดเร็ว
หากคุณยังไม่คุ้นเคยกับ AWS Lambda—serverless compute runtime ของบริษัท หรือ Function-as-a-Service (FaaS)—นี่คือพื้นฐานที่คุณต้องรู้ (ผู้เชี่ยวชาญ Lambda ข้ามไปส่วนถัดไปได้) AWS Lambda อนุญาตให้แอปพลิเคชันรัน function ตามความต้องการ (on demand) ตอบสนองต่อ event เฉพาะเจาะจง ทำให้เป็นวิธีที่ดีในการสร้างแอปพลิเคชัน event-driven architecture (EDA) AWS Lambda functions ซึ่งจัดการเต็มรูปแบบโดย AWS สร้างได้ด้วยภาษาโปรแกรมหลากหลาย ส่วนที่ดีที่สุดคือ นักพัฒนาปกติไม่ต้องเข้าใจ application lifecycle ทั้งหมดก็ใช้ได้
AWS Lambda เรียกใช้ได้หลายวิธี: โดยตรงจาก AWS Console, ใช้ events จาก AWS Services อื่นๆ เช่น SNS, SQS, หรือ Kinesis หรือแม้แต่จาก AWS Console, CloudWatch, หรือ S3 events ในแอปพลิเคชันตัวอย่างฐานข้อมูลหนังของเรา Lambda functions จะถูก invoke ผ่าน HTTP REST endpoint โดยใช้ AWS API Gateway (คุณหาข้อมูลเพิ่มเติมเกี่ยวกับการ invoke AWS Lambda function ในเอกสารประกอบได้)
กระบวนการดำเนินการ HTTP ของ AWS Lambda
โดยเฉพาะเจาะจง คำขอผ่าน HTTP จะถูกส่งไปที่ AWS API Gateway management tool ซึ่ง parse body, header, และ parameters แล้ว trigger Lambda function ของเราด้วย payload นี้:
ในฐานะนักพัฒนา คุณแค่เขียนโค้ดเพื่อ expose REST endpoint และกำหนดค่า deployment ให้ expose มันภายใน AWS API Gateway (เราจะพูดถึงเพิ่มเติมในส่วนถัดไปที่ครอบคลุมแอปพลิเคชันตัวอย่างฐานข้อมูลหนังของเรา)
การจัดการ state และข้อมูลในแอปพลิเคชัน serverless
AWS Lambda เป็นสภาพแวดล้อม stateless ในแอปพลิเคชันหลายอย่าง คุณยังต้องการ share state ระหว่างบริการหรือการเรียกใช้ และ Redis ช่วยได้ สำหรับ state management แบบง่าย นักพัฒนา AWS มักใช้ ElastiCache แต่แอปพลิเคชันหลายอย่างต้องการมากกว่า state management พวกเขาต้องการ persistence, rich data, high performance และ query model Redis Enterprise Cloud ให้ fully managed service บน AWS (Google Cloud และ Microsoft Azure รองรับด้วย)
แอปพลิเคชันตัวอย่างฐานข้อมูลหนัง Redis
ตอนนี้เราพร้อมดูแอปพลิเคชันตัวอย่างฐานข้อมูลหนัง เพื่อดูขั้นตอนสำคัญในการสร้างแอปพลิเคชันด้วย Redis Enterprise Cloud และ AWS Lambda
แอปพลิเคชันใช้ชุดข้อมูลที่บันทึกไว้ใน RediSearch Getting Started tutorial ซึ่งประกอบด้วยแคตตาล็อกหนัง ทำจาก Redis Hashes ตามแผนภาพด้านล่าง frontend สร้างด้วย Vue.js ซึ่งเรียก REST endpoints เพื่อ:
- แสดงรายการ, เรียงลำดับ, และกรองหนัง
- แก้ไขหนัง และเพิ่ม/ลบความคิดเห็น
- ค้นหาหนังด้วย full-text search และ faceted search
ตามที่กล่าวไว้ข้างต้น แอปพลิเคชันใช้ AWS API Gateway, AWS Lambda, และ Redis Enterprise Cloud เป็น datastore นอกจากนี้ บริการ Python ใช้ AWS Key Management Service เพื่อเก็บและเข้ารหัสรหัสผ่านฐานข้อมูล Redis
ติดตั้งและรันแอปพลิเคชันสาธิต
เพื่อเริ่มต้น คุณจะต้องมีข้อกำหนดเบื้องต้นดังนี้:
- บัญชี AWS ตั้งค่า credentials, CLI installed แล้ว
- บัญชี Redis Enterprise Cloud และฐานข้อมูล เปิดใช้งานโมดูล RediSearch
- Git
- Node.js
- Python
- Redis command line interface (CLI)
เมื่อทุกอย่างพร้อมแล้ว มาดูขั้นตอนติดตั้งและรันแอปพลิเคชันตัวอย่าง
ขั้นตอน 1: ดูข้อมูลฐานข้อมูล Redis Enterprise Cloud
หากคุณยังไม่ได้สร้างฐานข้อมูลบน Redis Enterprise Cloud กรุณาทำตามคู่มือ Get Started with Redis Modules
เมื่อเชื่อมต่อ Redis Enterprise Cloud แล้ว คุณจะหาข้อมูลการเชื่อมต่อฐานข้อมูลใน web console อย่าลืมเพิ่มโมดูล "RediSearch 2" ลงในฐานข้อมูล
คุณจะต้องใช้ properties ต่อไปนี้เพื่อเชื่อมต่อ Lambda functions กับฐานข้อมูล Redis ของคุณ:
- REDIS_HOST: redis-18541.xxx.xxxx.xxx.cloud.redis.com
- REDIS_PORT: 18541
- REDIS_PASSWORD : <รหัสผ่านที่แสดงบนหน้าจอ>
ขั้นตอน 2: ดึงโปรเจกต์จาก GitHub
Clone repository ไปยัง local environment และย้ายไปไดเรกทอรีโปรเจกต์
> git clone https://github.com/redis-developer/aws-redis-cloud-demo.git > cd aws-redis-cloud-demo
โครงสร้างไดเรกทอรีโปรเจกต์แสดงด้านล่าง:
aws-redis-cloud-demo ├── README.md ├── front-end => Vue.js project │ ├── .env.development => to set the Lambda URLs in dev mode │ ├── .env.production => to set the Lambda URLs in production mode │ ├── ... │ └── vue.config.js │ └── ... ├── movie-comments-microservice => The Python, comments service │ ├── .chalice │ │ └── config.json => Lambda & Service configuration │ ├── app.py │ ├── chalicelib => Contains application code and lib │ │ └── …. │ ├── readme.md │ └── requirements.txt └── movies-list-microservice => The Node.js, movie service ├── import_movies.redis => Dataset file ├── ... ├── serverless.yml => Lambda & Service configuration ├── src │ └── ... └── ...
ขั้นตอน 3: นำเข้าชุดข้อมูล movie-database ลงในแอปพลิเคชัน
ไฟล์ aws-redis-cloud-demo/movies-list-microservice/import_movies.redis มีคำสั่ง Redis ทั้งหมดสำหรับ insert หนังลงฐานข้อมูล คำสั่งที่ใช้คือ:
- HSET สำหรับแต่ละหนัง
- FT.CREATE เพื่อสร้าง RediSearch index
เพื่อนำเข้าชุดข้อมูล ให้เปิด terminal และรันคำสั่งต่อไปนี้:
> export REDISCLI_AUTH=<YOUR_DB_PASSWORD> > redis-cli -h redis-18541.xxx.xxxx.xxx.cloud.redis.com \ -p 18541 < movies-list-microservice/import_movies.redis
ขั้นตอน 4: กำหนดค่าแอปพลิเคชันให้ใช้ instance Redis Enterprise Cloud ของคุณ
ก่อนทดสอบแอปพลิเคชัน คุณต้องกำหนดค่าบริการ Node.js และ Python ด้วย instance ฐานข้อมูล Redis Enterprise Cloud ของคุณ เปิดไฟล์เหล่านี้:
- ./movies-list-microservice/serverless.yml
- ./movie-comments-microservice/.chalice/config.json
จากนั้นตั้งค่า Redis host, port, และ password: (REDIS_HOST, REDIS_PORT, REDIS_PASSWORD)
ขั้นตอน 5: สร้างและรัน movie microservice (Node.js)
ทำตามขั้นตอนที่ระบุเพื่อสร้างและรันโปรเจกต์ (คุณหาข้อมูลทั้งหมดในไฟล์ Readme ของโปรเจกต์ได้)
- ติดตั้ง serverless framework
> npm install -g serverless
2. ไปที่ไดเรกทอรี movies-list-microservice
> cd movies-list-microservice
3. ติดตั้ง dependencies
> npm install
4. รัน Lambda function ใน local
> npm start
5. ทดสอบบริการโดยเปิด browser เรียก REST service: https://localhost:3000/api/movies/1
6. ปรับใช้ (deploy) บริการไป AWS โดยรันคำสั่งต่อไปนี้เพื่อ deploy function ไปสู่ AWS environment ของคุณ:
> serverless deploy ................................ Serverless: Stack update finished... Service Information service: movies-list-microservice stage: api region: us-east-1 stack: movies-list-microservice-api resources: 33 api keys: None endpoints: GET - https://<xxx>.execute-api.<reg>.amazonaws.com/api/movies/search GET - https://<xxx>.execute-api.<reg>.amazonaws.com/api/movies/group_by/{field} GET - https://<xxx>.execute-api.<reg>.amazonaws.com/api/movies/{id} POST - https://<xxx>.execute-api.<reg>.amazonaws.com/api/movies/{id} functions: listMovies: movies-list-microservice-api-listMovies searchMovies: movies-list-microservice-api-searchMovies getMovie: movies-list-microservice-api-getMovie saveMovie: movies-list-microservice-api-saveMovie layers: None
7. ทดสอบ API โดยเปิด browser ไปที่ https://<xxx>.execute-api.<reg>.amazonaws.com/api/movies/1
หมายเหตุ: หากได้ error ให้ตรวจสอบ functions log ใน AWS CloudWatch เพื่อดูว่เกิดอะไรขึ้น
ลึกลงไปดูโค้ด:
- ไฟล์ package.json มี dependencies ที่โปรเจกต์ Node.js นี้ใช้ โปรเจกต์นี้ค่อนข้างเรียบง่าย ใช้ dependencies ดังนี้:
- ไลบรารี redis และ redis-redisearch ใช้เชื่อมต่อ Redis และ expose คำสั่ง RediSearch
- ไลบรารี aws-lambda ใช้เรียก AWS Lambda functions ทั้งหมด เพื่อ deploy node application ไปยัง AWS environment ของคุณ
- ไฟล์ serverless.yml กำหนด serverless functions mapping HTTP actions ไปยัง JavaScript function ที่จะถูกเรียก (defined ใน handler.ts) และมี environment variables (ส่วนใหญ่คือ Redis connection string ในสาธิตนี้)
- ไฟล์ handler.ts คือ class ที่จับ event ที่มาจาก AWS Gateway และเรียก application library SearchService ซึ่งทำการเรียกฐานข้อมูล Redis ทั้งหมด
- ไฟล์ SearchService.ts มี methods ทั้งหมดสำหรับโต้ตอบกับฐานข้อมูล Redis และใช้ Redis และ RediSearch API: client.ft_search(), client.aggregate(), client.hmset() และอื่นๆ (คุณเรียนรู้เพิ่มเติมเกี่ยวกับคำสั่ง Redis และ RediSearch ได้ที่ Redis University และ Getting Started with RediSearch 2.0 tutorial บน GitHub
ขั้นตอน 6: สร้างและรัน comments microservice (Python)
นี่คือขั้นตอนสร้างและรันโปรเจกต์ (คุณหาข้อมูลทั้งหมดในไฟล์ Readme ของโปรเจกต์ได้)
- ย้ายไปโปรเจกต์ Python และสร้าง virtual environment:
> cd movie-comments-microservice > python3 -m venv chalice-env > source chalice-env/bin/activate
2. ติดตั้ง dependencies:
> pip install -r requirements.txt
3. ตั้งค่า AWS environment รันคำสั่งต่อไปนี้ และกำหนด ID และ Secret ของคุณ:
> aws configure AWS Access Key ID [None]: ****************ABCD AWS Secret Access Key [None]: ****************abCd Default region name [None]: us-west-2 Default output format [None]:
4. ปรับใช้บริการไป AWS โดยรันคำสั่งต่อไปนี้เพื่อ deploy function ไปสู่ AWS environment ของคุณ:
> chalice deploy Reusing existing deployment package. Updating policy for IAM role: movie-comments-microservice-dev Creating lambda function: movie-comments-microservice-dev Creating Rest API Resources deployed: - Lambda ARN: arn:aws:lambda:us-east-1:11111111111:function:movie-comments-microservice-dev - Rest API URL: https://XXXXXXX.execute-api.us-east-1.amazonaws.com/api/
ลึกลงไปดูโค้ด:
- ไฟล์ requirements.txt มี dependencies ที่โปรเจกต์ Python นี้ใช้ โปรเจกต์นี้ค่อนข้างเรียบง่าย ใช้ dependencies ดังนี้:
- Chalice คือ AWS framework สำหรับสร้าง serverless applications ใน Python
- redis และ redisearch เข้าถึง Redis และใช้ RediSearch API
- ไฟล์ config.json กำหนด serverless application และใช้กำหนด environment variables—ในแอปนี้คือข้อมูลการเชื่อมต่อฐานข้อมูล Redis
- ไฟล์ app.py คือ application entry point ที่กำหนด REST endpoints ทั้งหมดโดยใช้ routes ต่างๆ แอปพลิเคชัน import dependencies ต่างๆ โดยเฉพาะ CommentService ที่ใช้โต้ตอบกับ Redis เมื่อต้องการใช้หลายไฟล์ คุณต้องวางไฟล์ในโฟลเดอร์ chalicelib
- ไฟล์ comment_service.py มีการโต้ตอบกับ Redis ทั้งหมดสำหรับสร้าง query และลบความคิดเห็น จุดน่าสนใจสำหรับฟีเจอร์ความคิดเห็นคือ method search() ใช้ retrieve ความคิดเห็นสำหรับหนัง เรียงตามวันที่สร้าง โดยใช้ search_client.search() call
เพิ่มเติม คุณสามารถเก็บรหัสผ่านฐานข้อมูล Redis ไว้ใน AWS Key Management Service ขั้นตอนการกำหนดค่าอยู่ใน documentation ของโปรเจกต์
ขั้นตอน 7: รัน frontend application
- ไปที่ frontend directory และติดตั้ง dependencies:
> cd front-end > npm install
2. แก้ไขไฟล์ .env.development เพื่อตั้งค่า URL ของ movie และ comment services:
VUE_APP_MOVIES_SERVICE=https://<xxx>.execute-api.<reg>.amazonaws.com/api VUE_APP_COMMENTS_SERVICE=https://<xxx>..execute-api.<reg>.amazonaws.com/api
3. รันแอปพลิเคชัน:
> npm run serve
4. เปิด browser ไปที่ https://localhost:8084
ตอนนี้คุณสามารถนำทางในแอปพลิเคชัน อัปเดตและค้นหาหนัง และเพิ่ม/ลบความคิดเห็นได้
เพิ่มเติม คุณสามารถใช้ S3 และ CloudFront เพื่อ deploy แอป Vue ใน AWS environment ของคุณ และ serve สาธารณะให้ผู้ใช้ ขั้นตอนนี้อธิบายใน documentation ของโปรเจกต์
สรุป
การทำงานกับ AWS Lambda และ Redis Enterprise Cloud ทำให้การปรับใช้บริการของคุณง่ายขึ้น ด้วย Redis Enterprise Cloud พร้อม RediSearch คุณสามารถ query ข้อมูล Redis โดยใช้ค่า (values) ได้ง่าย ทำให้ใช้ Redis เป็นฐานข้อมูลหลักของบริการได้
Redis Enterprise Cloud เข้ากันได้กับ Redis ทำให้คุณย้ายการปรับใช้ Redis ที่มีอยู่ทั้ง OSS และ managed services ได้ง่าย แค่เปลี่ยนพารามิเตอร์การเชื่อมต่อ (เช่น database endpoints) มีหลายวิธีในการ live migration รวมถึง:
- Blue-green deployments
- Synchronizing Amazon ElastiCache และ Redis Enterprise Cloud โดยใช้ Active Passive Geo-Distribution
- ใช้ open source RIOT tool ของเราเพื่อย้ายข้อมูล
นอกจาก RediSearch แล้ว Redis Enterprise Cloud ยังให้คุณใช้โมเดลข้อมูลที่น่าสนใจอื่นๆ เช่น graph, JSON, time series, และ Bloom filters และมีคุณลักษณะฐานข้อมูลหลากหลายที่สำคัญสำหรับ production environments รวมถึง high availability, scalability, persistence, security, และ Active-Active geo-distribution
อยากเรียนรู้เพิ่มเติม? ดูหน้า AWS re:Invent ของเรา และอ่าน tutorials และ blog posts เหล่านี้:
- Get Started with Redis Modules on AWS
- 6 Key Features to Consider When Choosing a DBaaS Provider
- How Redis Enterprise Cloud Meets the Needs of Maturing Enterprise Customers on AWS