การพัฒนาในเครื่องด้วย Cloud Functions สำหรับ Node.js โดยใช้ Visual Studio Code

1. ภาพรวม

Google Cloud Functions เป็นแพลตฟอร์มการประมวลผลแบบ Serverless ที่ขับเคลื่อนด้วยเหตุการณ์ Cloud Functions ช่วยให้คุณเขียนโค้ดได้โดยไม่ต้องกังวลเกี่ยวกับการเตรียมทรัพยากรหรือการปรับขนาดเพื่อรองรับข้อกำหนดที่เปลี่ยนแปลงไป

Cloud Functions ที่เขียนด้วย JavaScript จะทํางานในสภาพแวดล้อม Node.js บน Google Cloud Platform คุณสามารถเรียกใช้ Cloud Functions ในรันไทม์ Node.js มาตรฐานใดก็ได้เพื่อให้สามารถย้ายข้อมูลและทดสอบในเครื่องได้

บทแนะนำ

ในโค้ดแล็บนี้ คุณจะได้สร้าง Cloud Function สำหรับ Node.js ซึ่งจะรายงานว่าอุณหภูมิที่ระบุนั้นยอมรับได้หรือร้อนเกินไป คุณจะต้องสร้าง ทดสอบ และแก้ไขข้อบกพร่องของ Cloud Function โดยใช้ Visual Studio Code ในเครื่อง สุดท้าย คุณจะนำฟังก์ชันไปใช้งานใน Google Cloud Platform

สิ่งที่จะได้เรียนรู้

  • เฟรมเวิร์กฟังก์ชันสําหรับ Node.js
  • สร้างและทดสอบ HTTP Cloud Function ในเครื่อง
  • แก้ไขข้อบกพร่องของฟังก์ชัน HTTP จากเครื่อง
  • ทำให้ฟังก์ชัน HTTP ใช้งานได้จากเครื่อง

2. การตั้งค่าและข้อกําหนด

ข้อกำหนดเบื้องต้น

ค่าใช้จ่าย

แม้ว่าโค้ดแล็บนี้จะต้องมีการเรียกใช้ Cloud Function ที่ติดตั้งใช้งานเพียง 1 ครั้ง แต่คุณก็ควรดูข้อมูลราคา Cloud Functions API เพื่อให้เข้าใจวิธีเรียกเก็บเงิน

แม้ว่า Google API หลายรายการจะใช้ได้โดยไม่เสียค่าธรรมเนียม แต่การใช้ Google Cloud Platform (เช่น ผลิตภัณฑ์และ API) นั้นจะต้องเสียค่าใช้จ่าย คุณต้องมีบัญชีการเรียกเก็บเงินที่ใช้งานอยู่จึงจะใช้ Cloud Functions ได้ โปรดทราบว่าผลิตภัณฑ์ Google Cloud Platform (GCP) บางรายการมีระดับ"ฟรีตลอด" ซึ่งคุณต้องใช้งานเกินเกณฑ์จึงจะมีการเรียกเก็บเงิน สำหรับการเรียกใช้ Cloud Functions แต่ละครั้งในโค้ดแล็บ ระบบจะนับรวมกับการใช้งานระดับฟรีดังกล่าว ตราบใดที่คุณใช้ไม่เกินขีดจำกัดโดยรวม (ภายในแต่ละเดือน) ก็ไม่ควรจะมีการเรียกเก็บเงิน

3. ติดตั้งเฟรมเวิร์ก Functions สำหรับ Node.js

เฟรมเวิร์ก Functions สำหรับ Node.js เป็นเฟรมเวิร์ก FaaS (Function as a Service) แบบโอเพนซอร์สสําหรับเขียนฟังก์ชัน Node.js ที่นําเสนอโดยทีม Google Cloud Functions

เฟรมเวิร์กฟังก์ชันช่วยให้คุณเขียนฟังก์ชันที่มีน้ำหนักเบาซึ่งทำงานได้ในสภาพแวดล้อมต่างๆ เช่น

  • Google Cloud Functions
  • เครื่องสำหรับพัฒนาซอฟต์แวร์ของคุณ
  • Cloud Run และ Cloud Run บน GKE
  • สภาพแวดล้อมที่อิงตาม Knative

สร้างแอป node.js ใหม่

npm init

ขณะยอมรับค่าเริ่มต้น ให้ใช้ index.js เป็นจุดแรกเข้าของแอป

จากนั้นติดตั้งเฟรมเวิร์ก Functions สำหรับ Node.js

npm install @google-cloud/functions-framework

เปิด package.json ตรวจสอบว่าคุณเห็นเฟรมเวิร์กฟังก์ชันแสดงอยู่ในรายการทรัพยากร ดังที่แสดงในตัวอย่างด้านล่าง

"dependencies": {
   "@google-cloud/functions-framework": "^1.7.1"
 }

ติดตั้งเฟรมเวิร์กฟังก์ชันเรียบร้อยแล้ว ตอนนี้คุณก็พร้อมสร้าง Cloud Function แล้ว

4. สร้างและทดสอบ HTTP Cloud Function บนเครื่อง

สร้าง Cloud Function ในเครื่อง

ในส่วนนี้ คุณจะต้องสร้างและทดสอบฟังก์ชัน HTTP ที่ตอบสนองต่อคําขอ HTTP

สร้างไฟล์ใหม่ชื่อ index.js ในไดเรกทอรีเดียวกับไฟล์ package.json

เพิ่มข้อมูลต่อไปนี้

exports.validateTemperature = async (req, res) => {
 try {
   if (req.body.temp < 100) {
     res.status(200).send("Temperature OK");
   } else {
     res.status(200).send("Too hot");
   }
 } catch (error) {
   //return an error
   console.log("got error: ", error);
   res.status(500).send(error);
 }
};

ตอนนี้คุณพร้อมที่จะทดสอบฟังก์ชันแล้ว

ทดสอบฟังก์ชันใน Visual Studio Code

จากนี้ไป Codelab นี้จะใช้ เทอร์มินัลแบบรวมภายใน Visual Studio Code

เปิดหน้าต่างเทอร์มินัลใน Visual Studio Code

เรียกใช้คำสั่งต่อไปนี้

node node_modules/@google-cloud/functions-framework --target=validateTemperature

คำสั่งนี้จะเริ่มต้นเซิร์ฟเวอร์ในเครื่องที่พร้อมเรียกใช้ฟังก์ชัน validateTemperature เมื่อเซิร์ฟเวอร์ได้รับคำขอ HTTP

คุณควรเห็นเอาต์พุตต่อไปนี้ในหน้าต่างเทอร์มินัล

Serving function...
Function: validateTemperature
URL: http://localhost:8080/

สร้างหน้าต่างเทอร์มินัลที่ 2 ภายใน VS Code โดยคลิกไอคอนเครื่องหมายบวก New Terminal ในแผงหน้าต่างเทอร์มินัล คุณจะต้องสลับระหว่างหน้าต่างเทอร์มินัล 2 หน้าต่างนี้ หน้าต่างแรกสำหรับแสดงฟังก์ชัน และหน้าต่างที่ 2 สำหรับการเรียกใช้ฟังก์ชันโดยใช้ curl

bceb65f366d837ae.png

คุณสลับระหว่างหน้าต่างเทอร์มินัลได้โดยใช้เมนูแบบเลื่อนลง หากหน้าต่างเทอร์มินัลแสดงฟังก์ชันอยู่ รายการแบบเลื่อนลงจะเรียกหน้าต่างดังกล่าวว่า node ไม่เช่นนั้น ระบบจะเรียก shell นั้นว่า zsh (หรือ shell ที่คุณใช้อยู่)

ในหน้าต่างเทอร์มินัลที่ 2 ให้เรียกใช้คําสั่งต่อไปนี้เพื่อส่งเพย์โหลดอุณหภูมิ 50 ไปยังเซิร์ฟเวอร์ภายในที่ใช้ฟังก์ชัน validateTemperature

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"50"}'

คุณควรได้รับการตอบกลับต่อไปนี้จากฟังก์ชันระบบคลาวด์

Temperature OK

ในหน้าต่างเทอร์มินัลที่ 2 ให้ทดสอบฟังก์ชันอีกครั้งโดยส่งเพย์โหลดอุณหภูมิ "สูงเกินไป" ดังที่แสดงด้านล่าง

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"120"}'

คุณควรได้รับการตอบกลับต่อไปนี้จากฟังก์ชันที่อยู่ในระบบคลาวด์

Too hot

สุดท้าย ให้ทดสอบฟังก์ชันโดยเรียกใช้โดยไม่มีเพย์โหลด

curl -X POST http://localhost:8080

คุณควรได้รับการตอบกลับต่อไปนี้จากฟังก์ชันที่อยู่ในระบบคลาวด์

Too hot

โดยหลักการแล้ว ฟังก์ชันไม่ควรแสดงผลเป็น "ร้อนเกินไป" หากไม่มีการระบุอุณหภูมิ คุณพบข้อบกพร่องในโค้ด

อย่าลืมหยุดฟังก์ชันไม่ให้ทำงานโดยกด Ctrl + C ในหน้าต่างเทอร์มินัลแรกที่ใช้แสดงฟังก์ชัน

5. แก้ไขข้อบกพร่องของฟังก์ชัน HTTP จากเครื่อง

เปิดพาเล็ตคำสั่งใน Visual Studio Code หากใช้ Mac ให้ใช้ Cmd + Shift + P หากใช้ Windows ให้ใช้ Ctrl + Shift + P.

พิมพ์ auto attach ในแผงคำสั่ง แล้วเลือกรายการด้านบนในรายการ

601e542b4ec9f6f9.png

สําหรับโค้ดแล็บนี้ ให้เลือก Only With Flag ดังที่แสดงในรูปภาพด้านล่าง

b9e6b762d150e62b.png

ตอนนี้โหลดหน้าต่างเทอร์มินัลที่คุณใช้ใน VS Code อีกครั้งเพื่อแสดงฟังก์ชันโดยวางเมาส์เหนือไอคอนคำเตือนที่ปรากฏขึ้นทางด้านขวาสุด

คลิก Relaunch Terminal

37b61e3fb546fc76.png

จากหน้าต่างเทอร์มินัลที่โหลดซ้ำ ให้เรียกใช้เฟรมเวิร์กฟังก์ชันอีกครั้งเพื่อแสดงฟังก์ชันโดยใช้คําสั่งต่อไปนี้

node --inspect node_modules/.bin/functions-framework --target=validateTemperature

โดย Flag --inspect จะบอกให้ Node.js รอรับไคลเอ็นต์การแก้ไขข้อบกพร่อง ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบของ Node เกี่ยวกับการแก้ไขข้อบกพร่อง

โปรดทราบว่าคุณใช้ node_modules/.bin/functions-framework แทน node_modules/@google-cloud/functions-framework คุณต้องใช้ไฟล์ปฏิบัติการแบบลิงก์โดยอัตโนมัติใน /node_modules/.bin เพื่อใช้โหมดตรวจสอบ

ตอนนี้คุณควรเห็นแถบสถานะสีส้มใน VS Code ซึ่งระบุว่าได้แนบโปรแกรมแก้ไขข้อบกพร่องแล้ว

ตั้งจุดหยุดพักที่บรรทัด 3 โดยคลิกในขอบด้านซ้ายของหมายเลขบรรทัด

2fbb4d5916e1dbfa.png

ไอคอนจุดหยุดพักจะสว่างเป็นสีแดงสด ซึ่งบ่งบอกว่าโปรแกรมแก้ไขข้อบกพร่องเข้าถึงโค้ดบรรทัดนี้ได้

846e6c5993cc87f9.png

ในหน้าต่างเทอร์มินัลที่ 2 ให้กดจุดหยุดพักชั่วคราวโดยเรียกใช้คำสั่ง curl ต่อไปนี้

curl -X POST http://localhost:8080 

คุณจะเห็นไฮไลต์สีเหลืองปรากฏเหนือบรรทัดที่ 3 การไฮไลต์นี้บ่งบอกว่าบรรทัดนี้เป็นคำสั่งปัจจุบันที่โปรแกรมแก้ไขข้อบกพร่องกำลังประเมิน

206c7ed1eb189e90.png

วางเมาส์เหนือตัวแปร temp เพื่อตรวจสอบว่าเนื้อหาคือ undefined เนื่องจากคำขอไม่ได้ระบุเพย์โหลดอุณหภูมิ

97979025f4bf2842.png

คลิกไอคอนข้ามเพื่อเรียกใช้คำสั่งถัดไป

คุณจะเห็นคำสั่งปัจจุบันข้ามไปยังส่วน else ของคำสั่ง if

cf0e8ce7e0388f98.png

ในการสาธิตนี้ คุณสามารถสมมติว่าข้อกำหนดกำหนดให้คำขอทั้งหมดต้องส่งค่าอุณหภูมิที่อ่านได้ ในกรณีที่ไม่ได้ระบุค่าอุณหภูมิ ฟังก์ชันควรแสดงข้อยกเว้น

คลิกปุ่ม "ยกเลิกการเชื่อมต่อ" เพื่อยกเลิกการเชื่อมต่อโปรแกรมแก้ไขข้อบกพร่อง

1070d059775ad769.png

ในหน้าต่างเทอร์มินัลแรก ให้หยุดการเรียกใช้ฟังก์ชันโดยกด Ctrl + C

อัปเดตฟังก์ชันเพื่อเพิ่มคำสั่ง if เพื่อแสดงข้อยกเว้นหากอุณหภูมิไม่มีค่า ดังที่แสดงด้านล่าง

exports.validateTemperature = async (req, res) => {

 try {

   // add this if statement below line #2
   if (!req.body.temp) {
     throw "Temperature is undefined";
   }

 ...

ในหน้าต่างเทอร์มินัลแรก ให้เริ่มเรียกใช้ฟังก์ชัน Cloud อีกครั้งโดยเรียกใช้คำสั่งต่อไปนี้โดยไม่ใช้ Flag –inspect เพื่อหลีกเลี่ยงการแนบโปรแกรมแก้ไขข้อบกพร่อง

node node_modules/@google-cloud/functions-framework --target=validateTemperature

ยืนยันว่าระบบแสดงข้อยกเว้นโดยเรียกใช้คำสั่งต่อไปนี้ในหน้าต่างเทอร์มินัลที่ 2

curl -X POST http://localhost:8080 

คุณควรเห็นเอาต์พุตต่อไปนี้แสดงผลจากคำขอ

Temperature is undefined

ในหน้าต่างเทอร์มินัลแรก คุณจะเห็นข้อผิดพลาดที่บันทึกโดยฟังก์ชันด้วย

Serving function...
Function: validateTemperature
URL: http://localhost:8080/
got error:  Temperature is undefined

ตอนนี้คุณหยุดการทำงานของฟังก์ชันได้โดยกด Ctrl + C ในหน้าต่างเทอร์มินัลแรก

6. ติดตั้งใช้งานฟังก์ชัน HTTP จากเครื่องภายในไปยัง Google Cloud

เมื่อสร้าง ทดสอบ และแก้ไขข้อบกพร่อง Cloud Function ในเครื่องแล้ว คุณก็พร้อมที่จะทำให้ใช้งานได้ใน Google Cloud

ยืนยันว่าคุณใช้โปรเจ็กต์ที่สร้างในขั้นตอนที่ 2 บนเครื่องโดยเรียกใช้คําสั่งต่อไปนี้

gcloud config get-value project

หากโปรเจ็กต์ที่คุณระบุไว้ในขั้นตอนที่ 2 ไม่ใช่การกำหนดค่าที่ใช้งานอยู่ ให้เรียกใช้คําสั่งต่อไปนี้

gcloud config set project <project-name-created-step-2>

ในหน้าต่างเทอร์มินัลใดก็ได้ ให้เรียกใช้คำสั่งต่อไปนี้

gcloud functions deploy validateTemperature --trigger-http --runtime nodejs12 --allow-unauthenticated

โดยคําอธิบายพารามิเตอร์มีดังนี้

  • deploy validateTemperature - คำสั่งย่อย gcloud สำหรับทำให้ Cloud Function ที่มีชื่อ validateTemperature พร้อมใช้งานโดยมี Entry Point ชื่อ validateTemperature
  • --trigger-http - ประเภทเหตุการณ์ที่ทริกเกอร์
  • --runtime nodejs12 - รันไทม์เป้าหมายของฟังก์ชันนี้
  • --allow-unauthenticated - อนุญาตให้การเข้าถึงแบบสาธารณะเรียกใช้ฟังก์ชัน

ระบบจะแจ้งให้คุณเปิดใช้ Cloud Functions API พิมพ์ y เพื่อเปิดใช้ API

API [cloudfunctions.googleapis.com] not enabled on project 
[1057316433766]. Would you like to enable and retry (this will take a 
few minutes)? (y/N)? y 

เมื่อการทำให้ใช้งานได้เสร็จสมบูรณ์แล้ว คุณจะเห็นข้อมูลต่อไปนี้ในเอาต์พุต

Deploying function (may take a while - up to 2 minutes)...done. 
availableMemoryMb: 256
buildId: <your-build-id>
entryPoint: validateTemperature
httpsTrigger:
  url: https://<your-region-and-project>.cloudfunctions.net/validateTemperature
...

ในหน้าต่างเทอร์มินัล ให้ใช้ curl เพื่อเรียกใช้ปลายทางสาธารณะนี้

curl -X POST https://<your-region-and-project>.cloudfunctions.net/validateTemperature -H "Content-Type:application/json"  -d '{"temp":"50"}'

และยืนยันว่าได้ติดตั้งใช้งานฟังก์ชันการทำงานบนระบบคลาวด์เรียบร้อยแล้วโดยยืนยันการตอบกลับที่เหมาะสม

Temperature OK

7. ล้างข้อมูล

หากต้องการหลีกเลี่ยงการเรียกเก็บเงินโดยไม่ตั้งใจ เช่น Cloud Function นี้มีการเรียกใช้โดยไม่ตั้งใจมากกว่าการจัดสรรการเรียกใช้ Cloud Function รายเดือนในแพ็กเกจฟรี คุณสามารถลบ Cloud Function หรือลบโปรเจ็กต์ที่สร้างไว้ในขั้นตอนที่ 2

หากต้องการลบ Cloud Function ให้ไปที่คอนโซล Cloud Function ที่ https://console.cloud.google.com/functions/ ตรวจสอบว่าโปรเจ็กต์ที่คุณสร้างในขั้นตอนที่ 2 เป็นโปรเจ็กต์ที่เลือกอยู่ในปัจจุบัน

เลือกฟังก์ชัน validateTemperature ที่คุณติดตั้งใช้งานในขั้นตอนที่ 6 จากนั้นกด Delete

4dada486485a935a.png

หากเลือกลบทั้งโปรเจ็กต์ ให้ไปที่ https://console.cloud.google.com/cloud-resource-manager เลือกโปรเจ็กต์ที่สร้างในขั้นตอนที่ 2 แล้วเลือก "ลบ" หากลบโปรเจ็กต์ คุณจะต้องเปลี่ยนโปรเจ็กต์ใน Cloud SDK คุณดูรายการโปรเจ็กต์ทั้งหมดที่ใช้ได้โดยการเรียกใช้ gcloud projects list

8. ยินดีด้วย

ขอแสดงความยินดีที่ทํา Codelab จนเสร็จสมบูรณ์ ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่ Cloud Functions รองรับรันไทม์ Node.js และวิธีแก้ไขข้อบกพร่องในเครื่องกับ Cloud Functions

สิ่งที่เราได้พูดถึง

  • เฟรมเวิร์กฟังก์ชันสําหรับ Node.js
  • สร้างและทดสอบ HTTP Cloud Function ในเครื่อง
  • แก้ไขข้อบกพร่องของฟังก์ชัน HTTP จากเครื่อง
  • ทำให้ฟังก์ชัน HTTP ใช้งานได้จากเครื่อง