Serverless Framework with AWS Lambda


serverless api สิ่งแรกที่คิด มันไม่มี server ใช่มะ จริงๆแล้วมันก็เป็น server ตัวนึงนั้นแหละข้อแตกต่างก็คือมันไม่ได้ทำงานอยู่ตลอดเวลา เหมือนตัว server ในตอนแรกมันจะปิดเครื่องอยู่ พอมีคนสั่งให้มันทำบางอย่าง(trigger)ตัว server มันจะเปิดเครื่องขึ้นมาแล้วก็ทำงานนั้น พอเสร็จงานก็ปิดเครื่องไปแบบนี้
ต้องอธิบายก่อนว่าเดิมที server api ทั่วไปนั้นจะทำงานอยู่เสมอเพื่อรอรับ request จาก client แล้วประมวลผลบางอย่าง จากนั้นก็ตอบกลับ response ไปยัง client แต่สิ่งหนึ่งที่ควรรู้ก็คือ server มันยังคงทำงานเสมอต่อเนื่องถึงแม้จะไม่มี request อะไรมาก็ตาม
เนื้อหา
- เนื้อหา
- trigger คืออะไร
- ข้อดี
- ข้อเสีย
- สิ่งที่ต้องมีในการใช้ aws lambda
- มาลองเขียนกัน
- มีผู้ให้บริการเจ้าไหนบ้าง
- อ้างอิง
trigger คืออะไร
จะให้อธิบายง่ายๆก็คือ trigger เป็นเหมือนเหตุการณ์หรือการกระทำบางอย่างเพื่อสั่งให้ function ที่เราเขียนไว้ใน serverless ของเราทำงาน ตัวอย่างของ trigger เช่น http request, save images to S3, certain time in the day ขึ้นอยู่กับว่าเราใช้ serverless ของผู้ให้บริการเจ้าไหน
ข้อดี
ราคา
ถ้าเราใช้ server ปกติแล้วเราจะต้องเปิดมันอยู่ตลอดเวลา เพื่อรอรับ request จากฝั่ง client ไม่ว่ามันจะได้ทำงานหรือไม่ก็ตาม บางทีอาจจะไม่มีใครมาใช้ก็ได้ พอมันต้องเปิดอยู่ตลอดเวลาก็ต้องมีค่าใช้จ่ายใช่ไหมละ พอเปลี่ยนมาเป็น serverless มันจำทำงานเฉพาะต้องที่มีคนมาเรียกใช้เท่านั้นและไม่ได้เปิดอยู่ตลอดเวลาด้วย ทำให้ค่าใช้จ่ายถูกลง ก็คือจ่ายตามการใช้งานจริงๆ aws lambda มีให้ใช้ฟรีประมาณ 1 ล้าน request ต่อเดือน ชอบเลย มันดีมากไม่ต้องดูแลเอง
aws lambda อยู่บน cloud ไม่ต้องเช่า server เพื่อ run node เองเลย พอมันอยู่บน cloud ข้อดีอีกอย่างคือมันรับ request ได้เยอะมากๆอยู่แล้ว จะ 10 request หรือ 1,000,000 request ก็ไม่เป็นปัญหากับนักพัฒนาเลย เพราะ aws จะเป็นคนจัดการให้อัตโนมัติ
ข้อเสีย
cold starts
อย่างที่บอกไปแล้วว่า serverless ไม่ได้ทำงานอยู่ตลอดเวลา หมายความว่ามันต้องสร้าง function ใหม่ทุกครั้งที่มีการ trigger เข้ามา ทำให้การ response อาจใช้เวลานานกว่าเดิม แต่จุดนี้แก้ปัญหาได้ด้วย warm starts คือถ้า function ที่ถูกเรียกนั้น started อยู่แล้วก็ไม่ต้องสร้างใหม่ประมวลผลได้เลย ประมาณว่ายิ่งถูกเรียกใช้บ่อยก็จะไม่ช้านั้นแหละ
สิ่งที่ต้องมีในการใช้ aws lambda
- account aws ไปสมัครได้ที่ https://aws.amazon.com/ ต้องมีบัตรเครดิตหรือบัตรเดบิตที่สามารถชำระเงินได้ เขาใช้เพื่อยืนยันตัวตนเราและจะคิดเงินเราก็ต่อเมื่อเราใช้เยอะมากๆ aws มี free tier ให้ใช้ฟรีต่อเดือน
มาลองเขียนกัน
ถ้าจะลองเขียนเฉยๆ เราสามารถ run แบบ offline ได้นะคือไม่ต้องมี account aws ก็เขียนแล้วก็ run ได้
ก่อนอื่นติดตั้ง AWS CLI v2
https://aws.amazon.com/th/cli/
หลังจากติดตั้งลองใช้คำสั่งเช็คดูว่าใช้งานได้หรือยัง
aws
จากนั้นตั้งค่า AWS CLI
aws configure
# แล้วจะมีให้เรากรอกข้อมูล# AWS Access Key ID ใส่ root# AWS Secret Access Key ใส่ root
AWS Access Key ID กับ AWS Secret Access Key จะได้จากการเพิ่ม User ในเมนู IAM ของ aws เหมือนใช้แทนการ login เลยเพราะเราใช้ผ่าน command line
ติดตั้ง Serverless CLI
npm install -g serverless
เริ่มต้น
เราสามารถสร้าง project จากตัวอย่างได้ด้วยคำสั่ง
serverless
# step 1 เลือก AWS - Node.js - HTTP API# step 2 ตั้งชื่อโปรเจค# step 3 จะ Login Dashboard(Y/n) ไหม ตอบ No# step 4 Do you want to deploy now? ตอบ No
เข้าไปที่ directory แล้วเปิด code ขึ้นมาด้วย VS Code
cd aws-node-http-api-projectcode .
จะพบกับไฟล์ต่างๆ ใน VS Code แบบนี้ แล้วลองเปิดดู serverless.yml จะพบหน้าตาประมาณนี้
- serverless.yml เป็นไฟล์หลักที่ใช้กำหนดการตั้งค่าตัว serverless และกำหนด api ของเราว่ามี function อะไรบ้าง แต่ละ function จะถูกสั่งให้ทำงานก็ต่อเมื่อเกิดเหตุการณ์(events)อะไร
- บรรทัดที่ 1 คือกำหนดชื่อ service ว่า aws-node-http-api-project
- บรรทัดที่ 2 คือกำหนดให้ใช้ serverless framework version 3
- บรรทัดที่ 4 คือกำหนด provider
- บรรทัดที่ 5 คือกำหนด provider name เป็น aws
- บรรทัดที่ 6 คือกำหนดให้ run ด้วย nodejs14.x
- บรรทัดที่ 8 คือเป็นตัวบอก serverless ว่ามี functions อะไรบ้าง
- บรรทัดที่ 9 คือประกาศ function ชื่อ hello
- บรรทัดที่ 10 คือให้มันประมวลผลอะไร
handler
คือชื่อไฟล์.
คือเป็นตัวบอกว่าหลังจากนี้จะเป็นชื่อ function ในไฟล์นั้นๆhello
คือชื่อ function ที่นำมาประมวลผล - บรรทัดที่ 11 คือ events หรือ trigger นั่นแหละเป็นตัวสั่งให้ function ทำงาน
- บรรทัดที่ 12 คือ trigger ประเภท http
- บรรทัดที่ 13 คือ เหมือน router ใน api ทั่วไปเลย ถ้ามี request เข้ามาที่ path นี้จะทำงานที่ function นี้นะ
- บรรทัดที่ 14 คือ method เป็น HTTP Methods เช่น get, post, put
- handler.js
- บรรทัดที่ 3 คือประกาศพร้อมกับ export function ชื่อว่า hello
- บรรทัดที่ 4 คือ return หรือเป็นการ response นั่นแหละ
- บรรทัดที่ 5 คือ HTTP response status codes
- บรรทัดที่ 6 คือ ข้อความที่จะตอบกลับ
run แบบ offline
ก่อนอื่นต้องติดตั้ง package ที่จำเป็นต้องใช้ก่อน
npm init -y
npm install serverless --save-devnpm install serverless-offline --save-dev
เพิ่ม plugins ในไฟล์ serverless.yml
plugins: - serverless-offline
และเพิ่ม script ที่ใช้สำหรับ run โปรแกรมในไฟล์ package.json ก่อน
"scripts": { ... "elasticmq": "java -jar elasticmq-server-1.3.3.jar", "dev": "serverless offline start" ...}
จะเห็นมีคำสั่ง java เพิ่มเข้ามาใน package.json ด้วยถ้ายังไม่มี java ใครเครื่องจะ run ไม่ได้นะ สำหรับใครยังไม่มีไผโหลดโลด https://www.java.com/en/download/
ถ้าเครื่องเรามี java แล้วต่อมาให้โหลดไฟล์ elasticmq-server-1.3.3.jar ที่นี้ https://s3/…/elasticmq-server-1.3.3.jar จากนั้นก็นำไฟล์ที่ได้มาไว้ที่ root directory ของโปรเจคเรา
ตอนนี้พร้อม run ละ แต่มาดูว่าตอนนี้ในโปรเจคเราเป็นยังไงบ้าง
ลอง run กันเลยเปิด terminal หรือ cmd ขึ้นมา 2 หน้าแล้วสั่งเลย มันต้องใช้คู่กันนะ
npm run elasticmq
npm run dev
ถ้าใครเจอ error แบบนี้ตอน run
syntaxerror: unexpected end of input
ลองลบ node_modules แล้วสั่ง npm install ใหม่ดู
ถ้าไม่ติดอะไรก็จะได้ผลลัพธ์ตามนี้ http://localhost:3000/
เพิ่มเติม ถ้าจะเปลี่ยน port ก็เพิ่ม config นี้ในไฟล์ serverless.yml
custom: serverless-offline: httpPort: 13000 lambdaPort: 13001
เพิ่ม function ใหม่
step 1 เพิ่ม helloworld ในไฟล์ serverless.yml
functions:... helloworld: handler: handler.helloworld events: - http: path: /helloworld method: get ...
step 2 เพิ่ม function ที่จะให้มันประมวลผลที่ไฟล์ handler.js สร้าง function ชื่อ helloworld
...module.exports.helloworld = async (event) => { return { statusCode: 200, body: "Hello World!", };};...
step 3 สั่ง npm run dev ใหม่เพราะเราแก้ไขไฟล์ serverless.yml ทุกครั้งที่แก้ไขไฟล์นี้ต้องสั่งใหม่ทุกครั้ง จากนั้นลองเข้า http://localhost:13000/dev/helloworld จะพบกับ Hello World!
มีผู้ให้บริการเจ้าไหนบ้าง
- AWS Lambda
- Azure
- Google Cloud Function
อ้างอิง
https://www.youtube.com/watch?v=woqLi6NEW58&t=2s ใน VDO จะยกตัวอย่างเช่น
- Vending Machine ตู้กดน้ำอัตโนมัติ มันเหมาะกับ serverless มากเพราะจริงๆแล้ว server ควรจะทำงานตอนที่มีคนสั่งซื้อเท่านั้น อย่างตอนกลางคืนคงไม่มีใครกดซื้อเยอะ server ก็ไม่จำเป็นต้องรอรับ request เยอะๆ ลดค่าใช้จ่ายได้