פיתוח מקומי באמצעות 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 ל-Node.js שמדווחת אם טמפרטורה מסוימת מקובלת או חמה מדי. תלמדו ליצור, לבדוק ולפתור באגים ב-Cloud Function באמצעות Visual Studio Code במחשב המקומי. לבסוף, תפרסו את הפונקציה ב-Google Cloud Platform.

מה תלמדו

  • Functions Framework ל-Node.js.
  • יצירת פונקציית HTTP של Cloud Functions ובדיקה שלה באופן מקומי.
  • ניפוי באגים של פונקציית HTTP מהמכונה המקומית.
  • פריסת פונקציית HTTP מהמחשב המקומי.

2. הגדרה ודרישות

דרישות מוקדמות

עלויות

בקודלאב הזה נדרשת רק קריאה אחת של פונקציית Cloud Functions שנפרסה, אבל עדיין כדאי לעיין במידע על התמחור של Cloud Functions API כדי להבין איך החיוב פועל.

אפשר להשתמש בממשקי Google API רבים ללא תשלום, אבל השימוש ב-Google Cloud Platform (כלומר במוצרים ובממשקי ה-API שלו) לא בחינם. כדי להשתמש ב-Cloud Functions, צריך חשבון פעיל לחיוב. חשוב לזכור שלמוצרים מסוימים ב-Google Cloud Platform ‏ (GCP) יש תוכנית 'תמיד בחינם', שצריך לחרוג ממנה כדי שנצבור חיוב. לצורכי הקודלאב, כל קריאה ל-Cloud Functions נספרת ברמה החינמית הזו. כל עוד לא תחרגו מהמגבלות הכוללות (בכל חודש), לא תחויבו.

3. התקנה של Functions Framework עבור Node.js

Functions Framework for Node.js היא מסגרת FaaS (Function as a Service) בקוד פתוח לכתיבה של פונקציות Node.js ניידות, שפותחה על ידי צוות Google Cloud Functions.

באמצעות Functions Framework אפשר לכתוב פונקציות קלילות שפועלות בסביבות רבות ושונות, כולל:

  • Google Cloud Functions
  • המכונה המקומית לפיתוח
  • Cloud Run ו-Cloud Run ב-GKE
  • סביבות מבוססות-Knative

יוצרים אפליקציית node.js חדשה.

npm init

כשמאשרים את הגדרות ברירת המחדל, חשוב להשתמש ב-index.js כנקודת הכניסה לאפליקציה.

עכשיו מתקינים את Functions Framework ל-Node.js.

npm install @google-cloud/functions-framework

פותחים את הקובץ package.json. מוודאים ש-functions framework מופיע כיחס תלות, כמו בדוגמה הבאה.

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

ה-Functions Framework הוטמע בהצלחה. עכשיו אתם מוכנים ליצור את הפונקציה ב-Cloud Functions.

4. יצירת פונקציית HTTP של Cloud Functions ובדיקה שלה באופן מקומי

יצירת פונקציה מקומית של Cloud Functions

בקטע הזה תלמדו ליצור ולבדוק פונקציית 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

מכאן ואילך, נשתמש ב מסוף המובנה ב-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/

כדי ליצור חלון טרמינל שני ב-VS Code, לוחצים על סמל הפלוס New Terminal בחלונית של חלון הטרמינל. תצטרכו לעבור בין שני חלונות מסוף: הראשון להצגת הפונקציה והשני להפעלת הפונקציה באמצעות curl.

bceb65f366d837ae.png

אפשר לעבור בין חלונות הטרמינל באמצעות התפריט הנפתח. אם חלון מסוים בטרמינל משמש כרגע פונקציה, הוא יופיע ברשימה הנפתחת בתור node. אחרת, הוא נקרא zsh (או המעטפת שבה אתם משתמשים).

בחלון השני של מסוף ה-SSH, מריצים את הפקודה הבאה כדי לשלוח עומס נתונים של טמפרטורה של 50 לשרת המקומי שמארח את הפונקציה validateTemperature.

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

התגובה הבאה אמורה להתקבל מהפונקציה בענן:

Temperature OK

בחלון המסוף השני, בודקים שוב את הפונקציה על ידי שליחת עומס עבודה של טמפרטורה 'גבוהה מדי', כפי שמתואר בהמשך:

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 בנושא ניפוי באגים.

שימו לב שאתם משתמשים ב-node_modules/.bin/functions-framework במקום ב-node_modules/@google-cloud/functions-framework. כדי להשתמש במצב הבדיקה, צריך להשתמש בקובץ ההפעלה המקושר באופן אוטומטי ב-/node_modules/.bin.

הפעם אמור להופיע סרגל סטטוס כתום ב-VS Code, שמציין שהמתקף מצורף.

כדי להגדיר נקודת עצירה בשורה 3, לוחצים בתוך השוליים שמשמאל למספר השורה.

2fbb4d5916e1dbfa.png

סמל נקודת העצירה אמור להאיר באדום בוהק, כדי לציין שלמתקן הבאגים יש גישה לשורת הקוד הזו.

846e6c5993cc87f9.png

בחלון השני של מסוף, מגיעים לנקודת העצירה על ידי הפעלת הפקודה הבאה של curl.

curl -X POST http://localhost:8080 

תופיע הדגשה צהובה מעל שורה 3. ההדגשה הזו מציינת שהשורה הזו היא ההצהרה הנוכחית שמועברת להערכה על ידי מנתח הבאגים.

206c7ed1eb189e90.png

מעבירים את העכבר מעל המשתנה temp כדי לוודא שהתוכן שלו הוא undefined, כי הבקשה לא כללה עומס עבודה של טמפרטורה.

97979025f4bf2842.png

לוחצים על סמל הניתוח של שלב אחד כדי להריץ את ההצהרה הבאה.

תוכלו לראות שההצהרה הנוכחית תזנק לחלק else של משפט ה-if.

cf0e8ce7e0388f98.png

בדגמה הזו, אפשר להניח שהמפרט מחייב שכל הבקשות ישלחו קריאת טמפרטורה. במקרה הלא סביר שבו לא יסופק נתון של טמפרטורה, הפונקציה צריכה להוציא חריגה.

לוחצים על הלחצן Disconnect כדי לנתק את מנתח הבאגים.

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";
   }

 ...

בחלון המסוף הראשון, מפעילים שוב את פונקציית הענן באמצעות הפקודה הבאה בלי הדגל –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 Functions במחשב המקומי, אתם מוכנים לפרוס אותה ב-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 בשם validateTemperature עם נקודת כניסה בשם validateTemperature
  • --trigger-http – סוג האירוע המפעיל
  • --runtime nodejs12 – סביבת זמן הריצה המטורגטת של הפונקציה הזו
  • --allow-unauthenticated – מאפשר גישה ציבורית לקריאה לפונקציה

תתבקשו להפעיל את ממשקי ה-API של Cloud Functions. מקלידים 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 Functions מופעלת בטעות יותר פעמים מההקצאה החודשית שלכם להפעלות של Cloud Functions ברמה החינמית, אתם יכולים למחוק את פונקציית Cloud Functions או למחוק את הפרויקט שיצרתם בשלב 2.

כדי למחוק את Cloud Function, נכנסים למסוף Cloud של Cloud Function בכתובת https://console.cloud.google.com/functions/. מוודאים שהפרויקט שיצרתם בשלב 2 הוא הפרויקט שנבחר כרגע.

בוחרים את הפונקציה validateTemperature שפרסמתם בשלב 6. לאחר מכן מקישים על 'מחיקה'.

4dada486485a935a.png

אם בוחרים למחוק את הפרויקט כולו, אפשר לעבור אל https://console.cloud.google.com/cloud-resource-manager, לבחור את הפרויקט שיצרתם בשלב 2 ולבחור באפשרות Delete (מחיקה). אם תמחקו את הפרויקט, תצטרכו לשנות את הפרויקטים ב-Cloud SDK. כדי להציג את רשימת כל הפרויקטים הזמינים, מריצים את הפקודה gcloud projects list.

8. מעולה!

כל הכבוד על השלמת ה-Codelab. מידע נוסף זמין במאמרים איך Cloud Functions תומך בסביבת זמן הריצה של Node.js ואיך מתבצע ניפוי באגים מקומי ב-Cloud Functions.

מה עסקנו בו

  • Functions Framework ל-Node.js.
  • יצירת פונקציית HTTP של Cloud Functions ובדיקה שלה באופן מקומי.
  • ניפוי באגים של פונקציית HTTP מהמכונה המקומית.
  • פריסת פונקציית HTTP מהמחשב המקומי.