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 SDK
- Visual Studio Code
- Node.js בגרסה 8.6.0 ואילך (כדי להתקין את Node.js, משתמשים ב-nvm. כדי לבדוק את הגרסה, מריצים את הפקודה node –version).
- השלמת המדריך 'הפונקציה הראשונה שלי: Node.js'
עלויות
בקודלאב הזה נדרשת רק קריאה אחת של פונקציית 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.
אפשר לעבור בין חלונות הטרמינל באמצעות התפריט הנפתח. אם חלון מסוים בטרמינל משמש כרגע פונקציה, הוא יופיע ברשימה הנפתחת בתור 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
בחלונית הפקודות ובוחרים את הפריט העליון ברשימה.
בקודלאב הזה, בוחרים באפשרות Only With Flag
כפי שמוצג בתמונה הבאה:
עכשיו מעמיסים מחדש את חלון המסוף שבו השתמשתם ב-VS Code כדי להציג את הפונקציה. לשם כך, מעבירים את העכבר מעל סמל האזהרה שמופיע בצד שמאל.
לוחצים על Relaunch Terminal
.
בחלון המסוף שהוטען מחדש, מריצים מחדש את מסגרת הפונקציות כדי להפעיל את הפונקציה באמצעות הפקודה הבאה:
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, לוחצים בתוך השוליים שמשמאל למספר השורה.
סמל נקודת העצירה אמור להאיר באדום בוהק, כדי לציין שלמתקן הבאגים יש גישה לשורת הקוד הזו.
בחלון השני של מסוף, מגיעים לנקודת העצירה על ידי הפעלת הפקודה הבאה של curl.
curl -X POST http://localhost:8080
תופיע הדגשה צהובה מעל שורה 3. ההדגשה הזו מציינת שהשורה הזו היא ההצהרה הנוכחית שמועברת להערכה על ידי מנתח הבאגים.
מעבירים את העכבר מעל המשתנה temp כדי לוודא שהתוכן שלו הוא undefined
, כי הבקשה לא כללה עומס עבודה של טמפרטורה.
לוחצים על סמל הניתוח של שלב אחד כדי להריץ את ההצהרה הבאה.
תוכלו לראות שההצהרה הנוכחית תזנק לחלק else של משפט ה-if.
בדגמה הזו, אפשר להניח שהמפרט מחייב שכל הבקשות ישלחו קריאת טמפרטורה. במקרה הלא סביר שבו לא יסופק נתון של טמפרטורה, הפונקציה צריכה להוציא חריגה.
לוחצים על הלחצן Disconnect כדי לנתק את מנתח הבאגים.
בחלון המסוף הראשון, לוחצים על 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. לאחר מכן מקישים על 'מחיקה'.
אם בוחרים למחוק את הפרויקט כולו, אפשר לעבור אל 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 מהמחשב המקומי.