פיתוח מקומי באמצעות Cloud Functions ל-Node.js באמצעות Visual Studio Code

1. סקירה כללית

Google Cloud Functions היא פלטפורמת מחשוב ללא שרת (serverless) שמבוססת על אירועים. עם Cloud Functions, אתם יכולים לכתוב את הקוד בלי לדאוג להקצאת משאבים או להתאמת קנה מידה כדי לעמוד בדרישות משתנות.

פונקציות Cloud שנכתבו ב-JavaScript מופעלות בסביבת Node.js ב-Google Cloud Platform. אתם יכולים להפעיל את הפונקציה ב-Cloud Functions בכל סביבת זמן ריצה תקנית של Node.js כדי לאפשר ניוד ובדיקות מקומיות.

הדרכה

ב-Codelab הזה תיצרו פונקציית Cloud Function ל-Node.js שמדווחת אם טמפרטורה מסוימת היא סבירה או חמה מדי. תצרו, תבדקו ותנפו באגים בפונקציה של Cloud Functions באמצעות Visual Studio Code במחשב המקומי. לבסוף, תפרסו את הפונקציה ב-Google Cloud Platform.

מה תלמדו

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

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

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

עלויות

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

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

3. התקנת Functions Framework ל-Node.js

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

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

  • ‫Google Cloud Functions
  • מחשב הפיתוח המקומי
  • ‫Cloud Run ו-Cloud Run on GKE
  • סביבות מבוססות Knative

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

npm init

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

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

npm install @google-cloud/functions-framework

פותחים את הקובץ package.json. מוודאים שרואים את framework הפונקציות ברשימת התלויות, כמו בדוגמה שלמטה.

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

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

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

יצירת פונקציה מקומית של 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

מכאן ואילך, ב-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/

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

bceb65f366d837ae.png

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

בחלון הטרמינל השני, מריצים את הפקודה הבאה כדי לשלוח מטען ייעודי (payload) של טמפרטורה של 50 לשרת המקומי שמפעיל את הפונקציה validateTemperature.

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

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

Temperature OK

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

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

ב-codelab הזה, בוחרים באפשרות Only With Flag כמו שמוצג בתמונה שלמטה:

b9e6b762d150e62b.png

עכשיו טוענים מחדש את חלון הטרמינל שבו השתמשתם ב-VS Code כדי להפעיל את הפונקציה. לשם כך, מעבירים את העכבר מעל סמל האזהרה שמופיע בצד שמאל.

לוחצים על Relaunch Terminal.

37b61e3fb546fc76.png

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

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

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

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

תתבקשו להפעיל את Cloud Functions APIs. מקלידים 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 Function Cloud Console בכתובת 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.

מה נכלל

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