Blog About
Table of Contents
  • เนื้อหา
  • trigger คืออะไร
  • ข้อดี
  • ข้อเสีย
  • สิ่งที่ต้องมีในการใช้ aws lambda
  • มาลองเขียนกัน
  • ก่อนอื่นติดตั้ง AWS CLI v2
  • ติดตั้ง Serverless CLI
  • เริ่มต้น
  • run แบบ offline
  • เพิ่ม function ใหม่
  • มีผู้ให้บริการเจ้าไหนบ้าง
  • อ้างอิง

Serverless Framework with AWS Lambda

Apisit N.
12 Jul 2022

serverless api สิ่งแรกที่คิด มันไม่มี server ใช่มะ จริงๆแล้วมันก็เป็น server ตัวนึงนั้นแหละข้อแตกต่างก็คือมันไม่ได้ทำงานอยู่ตลอดเวลา เหมือนตัว server ในตอนแรกมันจะปิดเครื่องอยู่ พอมีคนสั่งให้มันทำบางอย่าง(trigger)ตัว server มันจะเปิดเครื่องขึ้นมาแล้วก็ทำงานนั้น พอเสร็จงานก็ปิดเครื่องไปแบบนี้

ต้องอธิบายก่อนว่าเดิมที server api ทั่วไปนั้นจะทำงานอยู่เสมอเพื่อรอรับ request จาก client แล้วประมวลผลบางอย่าง จากนั้นก็ตอบกลับ response ไปยัง client แต่สิ่งหนึ่งที่ควรรู้ก็คือ server มันยังคงทำงานเสมอต่อเนื่องถึงแม้จะไม่มี request อะไรมาก็ตาม

เนื้อหา

  • เนื้อหา
  • trigger คืออะไร
  • ข้อดี
  • ข้อเสีย
  • สิ่งที่ต้องมีในการใช้ aws lambda
  • มาลองเขียนกัน
    • ก่อนอื่นติดตั้ง AWS CLI v2
    • ติดตั้ง Serverless CLI
    • เริ่มต้น
    • run แบบ offline
    • เพิ่ม function ใหม่
  • มีผู้ให้บริการเจ้าไหนบ้าง
  • อ้างอิง

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 CLI v2

หลังจากติดตั้งลองใช้คำสั่งเช็คดูว่าใช้งานได้หรือยัง

Terminal window
aws

จากนั้นตั้งค่า AWS CLI

Terminal window
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

Terminal window
npm install -g serverless

เริ่มต้น

เราสามารถสร้าง project จากตัวอย่างได้ด้วยคำสั่ง

Terminal window
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

สร้าง project ด้วยคำสั่ง serverless

เข้าไปที่ directory แล้วเปิด code ขึ้นมาด้วย VS Code

Terminal window
cd aws-node-http-api-project
code .

จะพบกับไฟล์ต่างๆ ใน 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

ไฟล์โปรเจค serverless http api

  • handler.js
    • บรรทัดที่ 3 คือประกาศพร้อมกับ export function ชื่อว่า hello
    • บรรทัดที่ 4 คือ return หรือเป็นการ response นั่นแหละ
    • บรรทัดที่ 5 คือ HTTP response status codes
    • บรรทัดที่ 6 คือ ข้อความที่จะตอบกลับ

handler.hello

run แบบ offline

ก่อนอื่นต้องติดตั้ง package ที่จำเป็นต้องใช้ก่อน

Terminal window
npm init -y
npm install serverless --save-dev
npm install serverless-offline --save-dev

เพิ่ม plugins ในไฟล์ serverless.yml

1
plugins:
2
- serverless-offline

และเพิ่ม script ที่ใช้สำหรับ run โปรแกรมในไฟล์ package.json ก่อน

1
"scripts": {
2
...
3
"elasticmq": "java -jar elasticmq-server-1.3.3.jar",
4
"dev": "serverless offline start"
5
...
6
}

จะเห็นมีคำสั่ง 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 ละ แต่มาดูว่าตอนนี้ในโปรเจคเราเป็นยังไงบ้าง

package.json serverless.yml

ลอง run กันเลยเปิด terminal หรือ cmd ขึ้นมา 2 หน้าแล้วสั่งเลย มันต้องใช้คู่กันนะ

Terminal window
npm run elasticmq
Terminal window
npm run dev

ถ้าใครเจอ error แบบนี้ตอน run syntaxerror: unexpected end of input ลองลบ node_modules แล้วสั่ง npm install ใหม่ดู

หน้า terminal หรือ cmd

ถ้าไม่ติดอะไรก็จะได้ผลลัพธ์ตามนี้ http://localhost:3000/

หน้า api ที่ได้

เพิ่มเติม ถ้าจะเปลี่ยน port ก็เพิ่ม config นี้ในไฟล์ serverless.yml

1
custom:
2
serverless-offline:
3
httpPort: 13000
4
lambdaPort: 13001

เพิ่ม function ใหม่

step 1 เพิ่ม helloworld ในไฟล์ serverless.yml

serverless.yml
1
functions:
2
...
3
helloworld:
4
handler: handler.helloworld
5
events:
6
- http:
7
path: /helloworld
8
method: get
9
...

step 2 เพิ่ม function ที่จะให้มันประมวลผลที่ไฟล์ handler.js สร้าง function ชื่อ helloworld

handler.js
1
...
2
module.exports.helloworld = async (event) => {
3
return {
4
statusCode: 200,
5
body: "Hello World!",
6
};
7
};
8
...

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 เยอะๆ ลดค่าใช้จ่ายได้
© 2025 Apisit N.