איך לחבר אפליקציית Node.js ב-Cloud Run למסד נתונים של Cloud SQL ל-PostgreSQL

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

המחבר Cloud SQL Node.js הוא הדרך הקלה ביותר לחבר בצורה מאובטחת את אפליקציית Node.js למסד הנתונים של Cloud SQL. ‫Cloud Run היא פלטפורמה מנוהלת ללא שרת (serverless) שמאפשרת להריץ קונטיינרים ללא שמירת מצב שאפשר להפעיל באמצעות בקשות HTTP. בשיעור הזה נלמד איך לחבר אפליקציית Node.js ב-Cloud Run למסד נתונים של Cloud SQL ל-PostgreSQL באופן מאובטח באמצעות חשבון שירות ואימות IAM.

מה תלמדו

בשיעור Lab זה תלמדו איך:

  • יצירת מכונה של Cloud SQL למסד נתונים של PostgreSQL
  • פריסת אפליקציית Node.js ב-Cloud Run
  • חיבור האפליקציה למסד הנתונים באמצעות ספריית המחברים של Cloud SQL Node.js

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

  • ההנחה בשיעור ה-Lab הזה היא שאתם מכירים את סביבות Cloud Console ו-Cloud Shell.

‫2. לפני שמתחילים

הגדרה של פרויקט ב-Cloud

  1. נכנסים ל-מסוף Google Cloud ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Google, אתם צריכים ליצור חשבון.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • שם הפרויקט הוא השם המוצג של המשתתפים בפרויקט הזה. זו מחרוזת תווים שלא נמצאת בשימוש ב-Google APIs. אפשר לעדכן את המיקום הזה בכל שלב.
  • מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud, והוא קבוע (אי אפשר לשנות אותו אחרי שהוא מוגדר). מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית, ובדרך כלל לא צריך לדעת מה היא. ברוב ה-Codelabs, תצטרכו להפנות למזהה הפרויקט (בדרך כלל הוא מסומן כ-PROJECT_ID). אם אתם לא אוהבים את המזהה שנוצר, אתם יכולים ליצור מזהה אקראי אחר. אפשר גם לנסות שם משתמש משלכם ולבדוק אם הוא זמין. אי אפשר לשנות את ההגדרה הזו אחרי השלב הזה, והיא תישאר כזו למשך הפרויקט.
  • לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. במאמרי העזרה מפורט מידע נוסף על שלושת הערכים האלה.
  1. בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API. העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי אפילו לא תהיה עלות בכלל. כדי להשבית את המשאבים ולא לחייב אתכם אחרי שתסיימו את המדריך הזה, תוכלו למחוק את המשאבים שיצרתם או למחוק את הפרויקט כולו. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.

הגדרת הסביבה

לוחצים על הסמל משמאל לסרגל החיפוש כדי להפעיל את Cloud Shell.

ecdc43ada29e91b.png

מפעילים את ממשקי ה-API מ-Cloud Shell:

gcloud services enable compute.googleapis.com sqladmin.googleapis.com \
  run.googleapis.com artifactregistry.googleapis.com \
  cloudbuild.googleapis.com servicenetworking.googleapis.com

אם מתבקשים לאשר, לוחצים על 'אישור' כדי להמשיך.

6356559df3eccdda.png

הפקודה הזו עשויה להימשך כמה דקות, אבל בסופו של דבר היא אמורה להציג הודעה על הצלחה שדומה להודעה הזו:

Operation "operations/acf.p2-327036483151-73d90d00-47ee-447a-b600-a6badf0eceae" finished successfully.

3. הגדרה של חשבון שירות

יוצרים ומגדירים חשבון שירות ב-Google Cloud לשימוש ב-Cloud Run, כדי שיהיו לו ההרשאות הנכונות להתחבר ל-Cloud SQL.

  1. כדי ליצור חשבון שירות חדש, מריצים את הפקודה gcloud iam service-accounts create באופן הבא:
    gcloud iam service-accounts create quickstart-service-account \
      --display-name="Quickstart Service Account"
    
  2. מריצים את הפקודה gcloud projects add-iam-policy-binding באופן הבא כדי להוסיף את התפקיד Cloud SQL Client לחשבון השירות של Google Cloud שיצרתם. ב-Cloud Shell, הביטוי ${GOOGLE_CLOUD_PROJECT} יוחלף בשם הפרויקט. אפשר גם להחליף את התמונה באופן ידני אם אתם מעדיפים.
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
      --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
      --role="roles/cloudsql.client"
    
  3. מריצים את הפקודה gcloud projects add-iam-policy-binding באופן הבא כדי להוסיף את התפקיד משתמש במכונת Cloud SQL לחשבון השירות של Google Cloud שיצרתם.
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
      --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
      --role="roles/cloudsql.instanceUser"
    
  4. מריצים את הפקודה gcloud projects add-iam-policy-binding באופן הבא כדי להוסיף את התפקיד Log Writer לחשבון השירות ב-Google Cloud שיצרתם.
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
      --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
      --role="roles/logging.logWriter"
    

4. הגדרת Cloud SQL

מריצים את הפקודה gcloud sql instances create כדי ליצור מכונה של Cloud SQL.

  • --database-version: סוג מנוע מסד הנתונים והגרסה שלו. אם לא מציינים ערך, המערכת משתמשת בערך ברירת המחדל של ה-API. במאמרי העזרה בנושא גרסאות מסדי נתונים של gcloud אפשר לראות את הגרסאות הזמינות כרגע.
  • --cpu: מספר ליבות המעבד הרצוי במכונה.
  • --memory: ערך של מספר שלם שמציין כמה זיכרון רוצים במכונה. צריך לציין יחידת גודל (לדוגמה, 3072MB או 9GB). אם לא מציינים יחידות, המערכת מניחה שמדובר ב-GB.
  • --region: המיקום האזורי של המכונה (לדוגמה: us-central1, ‏ asia-east1, ‏ us-east1).
  • --database-flags: מאפשר להגדיר דגלים. במקרה הזה, אנחנו מפעילים את cloudsql.iam_authentication כדי לאפשר ל-Cloud Run להתחבר ל-Cloud SQL באמצעות חשבון השירות שיצרנו קודם.
    gcloud sql instances create quickstart-instance \
      --database-version=POSTGRES_18 \
      --tier=db-custom-1-3840 \
      --region=us-central1 \
      --edition=ENTERPRISE \
      --database-flags=cloudsql.iam_authentication=on
    

יכול להיות שיעברו כמה דקות עד שהפקודה הזו תסתיים.

מריצים את הפקודה gcloud sql databases create כדי ליצור מסד נתונים ב-Cloud SQL בתוך quickstart-instance.

gcloud sql databases create quickstart_db \
  --instance=quickstart-instance

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

gcloud sql users create quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam \
  --instance=quickstart-instance \
  --type=cloud_iam_service_account \
  --database-roles=postgres

אזהרה: אין להשתמש ב---database-roles=postgres באפליקציות בסביבת הייצור. אנחנו משתמשים בזה כדי לספק את ההרשאות שנדרשות ליצירה ולמחיקה של טבלאות באופן פרוגרמטי עבור הקוד במעבדה הזו.

5. הכנת הבקשה

מכינים אפליקציית Node.js שמגיבה לבקשות HTTP.

  1. ב-Cloud Shell, יוצרים ספרייה חדשה בשם helloworld ועוברים אליה:
    mkdir helloworld
    cd helloworld
    
  2. מאתחלים קובץ package.json כמודול.
    npm init -y
    npm pkg set type="module"
    npm pkg set main="index.mjs"
    npm pkg set scripts.start="node index.mjs"
    
  3. מתקינים את התלות של מחבר Node.js של Cloud SQL.
    npm install @google-cloud/cloud-sql-connector
    
  4. מתקינים את pg כדי לבצע פעולות במסד הנתונים של PostgreSQL.
    npm install pg
    
  5. מתקינים את express כדי לאשר בקשות http נכנסות.
    npm install express
    
  6. יוצרים קובץ index.mjs עם קוד האפליקציה. הקוד הזה יכול:
    • אישור בקשות HTTP
    • התחברות למסד הנתונים
    • אחסון השעה של בקשת ה-HTTP במסד הנתונים
    • החזרת הזמנים של חמש הבקשות האחרונות
    מריצים את הפקודה הבאה ב-Cloud Shell:
    cat > index.mjs << "EOF"
    import express from 'express';
    import pg from 'pg';
    import {Connector} from '@google-cloud/cloud-sql-connector';
    
    const {Pool} = pg;
    
    const connector = new Connector();
    const clientOpts = await connector.getOptions({
        instanceConnectionName: process.env.INSTANCE_CONNECTION_NAME,
        authType: 'IAM'
    });
    
    const pool = new Pool({
        ...clientOpts,
        user: process.env.DB_USER,
        database: process.env.DB_NAME
    });
    
    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. האפליקציה מוכנה עכשיו לפריסה.

6. פריסת אפליקציית Cloud Run

מריצים את הפקודה הבאה כדי לפרוס את האפליקציה ב-Cloud Run:

  • --region: המיקום האזורי של המכונה (לדוגמה: us-central1, ‏ asia-east1, ‏ us-east1).
  • --source: קוד המקור שרוצים לפרוס. במקרה הזה, . מתייחס לקוד המקור בתיקייה הנוכחית helloworld.
  • --set-env-vars: הגדרת משתני סביבה שהאפליקציה משתמשת בהם כדי להפנות אותה למסד הנתונים של Cloud SQL.
  • --service-account: מקשר בין הפריסה של Cloud Run לבין חשבון השירות עם הרשאות להתחבר למסד הנתונים של Cloud SQL שנוצר בתחילת ה-Codelab הזה.
  • --allow-unauthenticated: מאפשר בקשות לא מאומתות כדי שהאפליקציה תהיה נגישה מהאינטרנט.
gcloud run deploy helloworld \
  --region=us-central1 \
  --source=. \
  --set-env-vars INSTANCE_CONNECTION_NAME="${GOOGLE_CLOUD_PROJECT}:us-central1:quickstart-instance" \
  --set-env-vars DB_NAME="quickstart_db" \
  --set-env-vars DB_USER="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam" \
  --service-account="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
  --allow-unauthenticated

אם מוצגת הנחיה, מקישים על y ועל Enter כדי לאשר שרוצים להמשיך:

Do you want to continue (Y/n)? y

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

עוברים לכתובת ה-URL כדי לראות את האפליקציה בפעולה. בכל פעם שתבקרו בכתובת ה-URL או תרעננו את הדף, יוצגו חמשת הביקורים האחרונים בפורמט JSON.

7. מזל טוב

פרסתם אפליקציית Node.js ב-Cloud Run שיכולה להתחבר למסד נתונים של PostgreSQL שפועל ב-Cloud SQL.

הנושאים שדיברנו עליהם:

  • יצירת מסד נתונים ב-Cloud SQL ל-PostgreSQL
  • פריסת אפליקציית Node.js ב-Cloud Run
  • חיבור האפליקציה ל-Cloud SQL באמצעות Cloud SQL Node.js Connector

הסרת המשאבים

כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד. כדי למחוק את הפרויקט כולו, אפשר להריץ את הפקודה:

gcloud projects delete ${GOOGLE_CLOUD_PROJECT}