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

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

เกี่ยวกับ Codelab นี้

subjectอัปเดตล่าสุดเมื่อ ม.ค. 28, 2022
account_circleเขียนโดย Googler

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 ใช้งานได้จากเครื่อง