1. סקירה כללית
Cloud Run היא פלטפורמה מנוהלת ללא שרת (serverless) שמאפשרת להריץ קונטיינרים ללא שמירת מצב שאפשר להפעיל באמצעות בקשות HTTP. ב-Codelab הזה נסביר איך לחבר אפליקציית Node.js ב-Cloud Run ל-AlloyDB באופן מאובטח באמצעות חשבון שירות באמצעות אימות IAM.
מה תלמדו
בשיעור ה-Lab הזה תלמדו איך:
- יצירת מכונה של AlloyDB (שהוגדרה לשימוש ב-Private Service Connect)
- פריסת אפליקציה ב-Cloud Run שמתחבר למכונה של AlloyDB
- איך משתמשים ב-Gemini Code Assist כדי להוסיף פונקציונליות לאפליקציה
2. דרישות מוקדמות
- אם עדיין אין לכם חשבון Google, עליכם ליצור חשבון Google.
- משתמשים בחשבון אישי במקום בחשבון לצורכי עבודה או בחשבון בית ספרי. יכול להיות שבחשבונות לצורכי עבודה ובחשבונות בית ספריים יש הגבלות שמונעות מכם להפעיל את ממשקי ה-API הנדרשים לסדנה הזו.
3. הגדרת הפרויקט
- נכנסים למסוף Google Cloud.
- מפעילים את החיוב במסוף Cloud.
- השלמת ה-Lab הזה אמורה לעלות פחות מ-1 $בארה"ב במשאבי Cloud.
- כדי למנוע חיובים נוספים, תוכלו לפעול לפי השלבים שמפורטים בסוף שיעור ה-Lab הזה כדי למחוק את המשאבים.
- משתמשים חדשים זכאים לתקופת ניסיון בחינם בשווי 300$.
- יוצרים פרויקט חדש או בוחרים לעשות שימוש חוזר בפרויקט קיים.
4. פתיחת Cloud Shell Editor
- עוברים אל Cloud Shell Editor.
- אם מסוף ה-SSH לא מופיע בחלק התחתון של המסך, פותחים אותו:
- לוחצים על תפריט שלושת הקווים
.
- לוחצים על Terminal (מסוף).
- לוחצים על מסוף חדש
- לוחצים על תפריט שלושת הקווים
- בטרמינל, מגדירים את הפרויקט באמצעות הפקודה הבאה:
- פורמט:
gcloud config set project [PROJECT_ID]
- דוגמה:
gcloud config set project lab-project-id-example
- אם לא זוכרים את מזהה הפרויקט:
- אפשר להציג את כל מזהי הפרויקטים באמצעות:
gcloud projects list | awk '/PROJECT_ID/{print $2}'
- אפשר להציג את כל מזהי הפרויקטים באמצעות:
- פורמט:
- אם מתבקשים לאשר, לוחצים על Authorize (מתן הרשאה) כדי להמשיך.
- אמורה להופיע ההודעה הבאה:
אם מופיעUpdated property [core/project].
WARNING
ונשאלת השאלהDo you want to continue (Y/N)?
, סביר להניח שהזנתם את מזהה הפרויקט בצורה שגויה. מקישים עלN
, מקישים עלEnter
ומנסים להריץ שוב את הפקודהgcloud config set project
.
5. הפעלת ממשקי API
מפעילים את ממשקי ה-API בטרמינל:
gcloud services enable \
compute.googleapis.com \
alloydb.googleapis.com \
run.googleapis.com \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com \
cloudaicompanion.googleapis.com
אם מתבקשים לאשר, לוחצים על Authorize (מתן הרשאה) כדי להמשיך.
השלמת הפקודה עשויה להימשך כמה דקות, אבל בסופו של דבר אמורה להופיע הודעה על השלמה, בדומה להודעה הבאה:
Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.
6. הגדרת חשבון שירות
יוצרים ומגדירים חשבון שירות ב-Google Cloud לשימוש ב-Cloud Run, כך שיהיה לו את ההרשאות המתאימות להתחברות ל-AlloyDB.
- כדי ליצור חשבון שירות חדש, מריצים את הפקודה
gcloud iam service-accounts create
באופן הבא:gcloud iam service-accounts create quickstart-service-account \ --display-name="Quickstart Service Account"
- כדי להוסיף את התפקיד AlloyDB Database User לחשבון השירות ב-Google Cloud שיצרתם, מריצים את הפקודה gcloud projects add-iam-policy-binding באופן הבא:
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/alloydb.databaseUser"
- כדי להוסיף את התפקיד צרכן של שימוש בשירות לחשבון השירות ב-Google Cloud שיצרתם, מריצים את הפקודה gcloud projects add-iam-policy-binding באופן הבא:
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/serviceusage.serviceUsageConsumer"
- כדי להוסיף את התפקיד כתיבה ביומן לחשבון השירות ב-Google Cloud שיצרתם, מריצים את הפקודה gcloud projects add-iam-policy-binding באופן הבא:
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/logging.logWriter"
7. יצירת מכונה של AlloyDB
- מריצים את הפקודה
gcloud alloydb clusters create
כדי ליצור מכונה של Cloud SQLgcloud alloydb clusters create quickstart-cluster \ --password=$(openssl rand -base64 20) \ --region=us-central1 \ --project=${GOOGLE_CLOUD_PROJECT} \ --enable-private-service-connect \ --database-version=POSTGRES_16
השלמת הפקודה הזו עשויה להימשך כמה דקות.
- מריצים את הפקודה
gcloud alloydb instances create
כדי ליצור מכונה של Cloud SQLgcloud alloydb instances create quickstart-instance \ --project=${GOOGLE_CLOUD_PROJECT} \ --instance-type=PRIMARY \ --cpu-count=2 \ --region=us-central1 \ --cluster=quickstart-cluster \ --allowed-psc-projects=${GOOGLE_CLOUD_PROJECT} \ --database-flags=alloydb.iam_authentication=on
- מריצים את הפקודה
gcloud alloydb instances describe
כדי לקבל את הקישור לקובץ המצורף של השירות ב-PSC וייצוא שלו למשתנהexport SERVICE_ATTACHMENT=$(gcloud alloydb instances describe quickstart-instance \ --cluster=quickstart-cluster --region=us-central1 \ --format="value(pscInstanceConfig.serviceAttachmentLink)")
gcloud compute addresses create quickstart-address \ --region=us-central1 \ --subnet=default
gcloud compute forwarding-rules create quickstart-endpoint \ --region=us-central1 \ --network=default \ --address=quickstart-address \ --target-service-attachment=${SERVICE_ATTACHMENT}
יוצרים משתמש של מסד נתונים ב-PostgreSQL לחשבון השירות שיצרתם מקודם כדי לגשת למסד הנתונים.
gcloud alloydb users create quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam \
--cluster=quickstart-cluster \
--region=us-central1 \
--type=IAM_BASED \
--superuser=true
8. הכנת הבקשה
מכינים אפליקציית Node.js שמגיבה לבקשות HTTP.
- יוצרים ספרייה חדשה בשם
helloworld
ב-Cloud Shell, ולאחר מכן עוברים לספרייה הזו:mkdir helloworld cd helloworld
- אתחול קובץ
package.json
כמודול.npm init -y npm pkg set type="module" npm pkg set main="index.mjs" npm pkg set scripts.start="node index.mjs"
- מתקינים את ספריית Google Cloud Auth.
npm install google-auth-library
- מתקינים את
pg
כדי ליצור אינטראקציה עם מסד הנתונים של PostgreSQL.npm install pg
- מתקינים את Express כדי לקבל בקשות HTTP נכנסות.
npm install express
- יוצרים קובץ
index.mjs
עם קוד האפליקציה. הקוד הזה מאפשר:- אישור בקשות HTTP
- חיבור למסד הנתונים
- שמירת הזמן של בקשת ה-HTTP במסד הנתונים
- החזרת הזמנים של חמש הבקשות האחרונות
cat > index.mjs << "EOF" import express from 'express'; import pg from 'pg'; const { Pool } = pg; import {GoogleAuth} from 'google-auth-library'; const auth = new GoogleAuth({ scopes: ['https://www.googleapis.com/auth/alloydb.login'], }); const pool = new Pool({ host: process.env.DB_HOST, user: process.env.DB_USER, password: async () => { return await auth.getAccessToken(); }, database: process.env.DB_NAME, ssl: { require: true, rejectUnauthorized: false, // required for self-signed certs // https://node-postgres.com/features/ssl#self-signed-cert } }); const app = express(); app.get('/', async (req, res) => { await pool.query('INSERT INTO visits(created_at) VALUES(NOW())'); const {rows} = await pool.query('SELECT created_at FROM visits ORDER BY created_at DESC LIMIT 5'); console.table(rows); // prints the last 5 visits res.send(rows); }); const port = parseInt(process.env.PORT) || 8080; app.listen(port, async () => { console.log('process.env: ', process.env); await pool.query(`CREATE TABLE IF NOT EXISTS visits ( id SERIAL NOT NULL, created_at timestamp NOT NULL, PRIMARY KEY (id) );`); console.log(`helloworld: listening on port ${port}`); }); EOF
הקוד הזה יוצר שרת אינטרנט בסיסי שמאזין ביציאה שמוגדרת על ידי משתנה הסביבה PORT. האפליקציה מוכנה עכשיו לפריסה.
9. פריסת אפליקציה ב-Cloud Run
- כדי להוסיף את התפקיד Network User לחשבון השירות של Cloud Run לשירות Cloud Run שאתם עומדים ליצור, מריצים את הפקודה gcloud projects add-iam-policy-binding באופן הבא:
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member "serviceAccount:service-$(gcloud projects describe ${GOOGLE_CLOUD_PROJECT} --format="value(projectNumber)")@serverless-robot-prod.iam.gserviceaccount.com" \ --role "roles/compute.networkUser"
- מריצים את הפקודה הבאה כדי לפרוס את האפליקציה ב-Cloud Run:
gcloud run deploy helloworld \ --region=us-central1 \ --source=. \ --set-env-vars DB_NAME="quickstart_db" \ --set-env-vars DB_USER="postgres" \ --set-env-vars DB_PASSWORD=${DB_PASSWORD} \ --set-env-vars DB_HOST="$(gcloud sql instances describe quickstart-instance --project=${GOOGLE_CLOUD_PROJECT} --format='value(settings.ipConfiguration.pscConfig.pscAutoConnections.ipAddress)')" \ --service-account="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --network=default \ --subnet=default \ --allow-unauthenticated
- אם מופיעה בקשה, מקישים על
Y
ו-Enter
כדי לאשר את המשך הפעולה:Do you want to continue (Y/n)? Y
אחרי כמה דקות, האפליקציה אמורה לספק כתובת URL שאפשר להיכנס אליה.
עוברים לכתובת ה-URL כדי לראות את האפליקציה בפעולה. בכל פעם שתכנסו לכתובת ה-URL או תתרעננו את הדף, יוצגו לכם חמשת הביקורים האחרונים כקובץ JSON.
אחרי כמה דקות, האפליקציה אמורה לספק כתובת URL שאפשר להיכנס אליה.
עוברים לכתובת ה-URL כדי לראות את האפליקציה בפעולה. בכל פעם שתכנסו לכתובת ה-URL או תחדשו את הדף, יוצגו לכם חמשת הביקורים האחרונים כקובץ JSON.
10. מזל טוב
בשיעור ה-Lab הזה למדתם:
- יצירת מכונה של AlloyDB (שמוגדרת לשימוש ב-Private Service Connect)
- פריסה של אפליקציה ב-Cloud Run שמתחבר למכונה של AlloyDB
- איך משתמשים ב-Gemini Code Assist כדי להוסיף פונקציונליות לאפליקציה
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים הנפרדים. כדי למחוק את הפרויקט כולו, אפשר להריץ את הפקודה:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}