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 SDK
- โค้ด Visual Studio
- Node.js 8.6.0 ขึ้นไป (หากต้องการติดตั้ง Node.js ให้ใช้ nvm หากต้องการตรวจสอบเวอร์ชัน ให้เรียกใช้ node –version)
- จบหลักสูตรฟังก์ชันแรก: คู่มือ Node.js
ค่าใช้จ่าย
แม้ว่าโค้ดแล็บนี้จะต้องมีการเรียกใช้ 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
คุณสลับระหว่างหน้าต่างเทอร์มินัลได้โดยใช้เมนูแบบเลื่อนลง หากหน้าต่างเทอร์มินัลแสดงฟังก์ชันอยู่ รายการแบบเลื่อนลงจะเรียกหน้าต่างดังกล่าวว่า 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
ในแผงคำสั่ง แล้วเลือกรายการด้านบนในรายการ
สําหรับโค้ดแล็บนี้ ให้เลือก Only With Flag
ดังที่แสดงในรูปภาพด้านล่าง
ตอนนี้โหลดหน้าต่างเทอร์มินัลที่คุณใช้ใน VS Code อีกครั้งเพื่อแสดงฟังก์ชันโดยวางเมาส์เหนือไอคอนคำเตือนที่ปรากฏขึ้นทางด้านขวาสุด
คลิก Relaunch Terminal
จากหน้าต่างเทอร์มินัลที่โหลดซ้ำ ให้เรียกใช้เฟรมเวิร์กฟังก์ชันอีกครั้งเพื่อแสดงฟังก์ชันโดยใช้คําสั่งต่อไปนี้
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 โดยคลิกในขอบด้านซ้ายของหมายเลขบรรทัด
ไอคอนจุดหยุดพักจะสว่างเป็นสีแดงสด ซึ่งบ่งบอกว่าโปรแกรมแก้ไขข้อบกพร่องเข้าถึงโค้ดบรรทัดนี้ได้
ในหน้าต่างเทอร์มินัลที่ 2 ให้กดจุดหยุดพักชั่วคราวโดยเรียกใช้คำสั่ง curl ต่อไปนี้
curl -X POST http://localhost:8080
คุณจะเห็นไฮไลต์สีเหลืองปรากฏเหนือบรรทัดที่ 3 การไฮไลต์นี้บ่งบอกว่าบรรทัดนี้เป็นคำสั่งปัจจุบันที่โปรแกรมแก้ไขข้อบกพร่องกำลังประเมิน
วางเมาส์เหนือตัวแปร temp เพื่อตรวจสอบว่าเนื้อหาคือ undefined
เนื่องจากคำขอไม่ได้ระบุเพย์โหลดอุณหภูมิ
คลิกไอคอนข้ามเพื่อเรียกใช้คำสั่งถัดไป
คุณจะเห็นคำสั่งปัจจุบันข้ามไปยังส่วน else ของคำสั่ง if
ในการสาธิตนี้ คุณสามารถสมมติว่าข้อกำหนดกำหนดให้คำขอทั้งหมดต้องส่งค่าอุณหภูมิที่อ่านได้ ในกรณีที่ไม่ได้ระบุค่าอุณหภูมิ ฟังก์ชันควรแสดงข้อยกเว้น
คลิกปุ่ม "ยกเลิกการเชื่อมต่อ" เพื่อยกเลิกการเชื่อมต่อโปรแกรมแก้ไขข้อบกพร่อง
ในหน้าต่างเทอร์มินัลแรก ให้หยุดการเรียกใช้ฟังก์ชันโดยกด 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
หากเลือกลบทั้งโปรเจ็กต์ ให้ไปที่ 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 ใช้งานได้จากเครื่อง