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

1. ภาพรวม

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

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

คำแนะนำแบบทีละขั้น

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

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

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

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

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

ค่าใช้จ่าย

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

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

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

เฟรมเวิร์กฟังก์ชันสำหรับ 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 เป็นจุดเริ่มต้นสำหรับแอปของคุณ

จากนั้นติดตั้งเฟรมเวิร์กฟังก์ชันสำหรับ 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

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

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

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

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

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

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

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

bceb65f366d837ae.png

คุณสามารถสลับระหว่างหน้าต่างเทอร์มินัลได้โดยใช้เมนูแบบเลื่อนลง หากหน้าต่างเทอร์มินัลแสดงฟังก์ชันอยู่ รายการแบบเลื่อนลงจะเรียกหน้าต่างนั้นว่า node มิฉะนั้นจะเรียกว่า 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

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

โปรดทราบว่าคุณกำลังใช้ 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

วางเมาส์เหนือตัวแปรอุณหภูมิเพื่อยืนยันว่าเนื้อหาของตัวแปรคือ 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

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

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 ใน Cloud Console ที่ https://console.cloud.google.com/functions/ ตรวจสอบว่าโปรเจ็กต์ที่คุณสร้างในขั้นตอนที่ 2 เป็นโปรเจ็กต์ที่เลือกไว้ในปัจจุบัน

เลือกฟังก์ชัน ValidTemperature ที่คุณทำให้ใช้งานได้ในขั้นตอนที่ 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 ใช้งานได้จากเครื่องภายในของคุณ