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

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

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

מה תלמדו

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

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

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

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

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

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name הוא השם המוצג של המשתתפים בפרויקט. זו מחרוזת תווים שלא משמשת את Google APIs. אפשר לעדכן אותו בכל שלב.
  • Project ID הוא ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי; בדרך כלל לא מעניין אותך מה זה. ברוב ה-Codelabs תצטרכו להפנות אל מזהה הפרויקט (בדרך כלל הוא מזוהה כ-PROJECT_ID). אם המזהה שנוצר לא מוצא חן בעיניך, יש לך אפשרות ליצור מזהה אקראי אחר. לחלופין, אפשר לנסות תבנית משלך ולבדוק אם היא זמינה. לא ניתן לשנות אותו אחרי השלב הזה, והוא יישאר למשך הפרויקט.
  • לידיעתך, יש ערך שלישי – Project Number (מספר פרויקט), שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי התיעוד.
  1. בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים או בממשקי API של Cloud. מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. כדי להשבית את המשאבים ולא לצבור חיובים מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את הפרויקט כולו. משתמשים חדשים ב-Google Cloud זכאים להצטרף לתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.

הגדרת סביבה

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

ecdc43ada29e91b.png

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

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. מריצים את הפקודה add-iam-policy-binding לפרויקטים של gcloud כדי להוסיף את התפקיד לקוח Cloud SQL לחשבון השירות ב-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. מריצים את הפקודה add-iam-policy-binding לפרויקטים של gcloud כדי להוסיף את התפקיד Cloud SQL Instance User לחשבון השירות ב-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. מריצים את הפקודה add-iam-policy-binding לפרויקטים של gcloud כדי להוסיף את התפקיד 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

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

  • –database-version: הסוג והגרסה של המנוע של מסד הנתונים. אם לא צוין ערך, ייעשה שימוש בברירת המחדל של ה-API. במסמכי התיעוד בנושא גרסאות של מסד הנתונים של gcloud אפשר לראות את הגרסאות הקיימות של מסד הנתונים.
  • –cpu: מספר הליבות שרוצים במכונה.
  • –זיכרון: מספר שלם שמציין כמה זיכרון רוצים לקבל במכונה. צריך לספק יחידת גודל (לדוגמה, 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_14 \
      --cpu=1 \
      --memory=4GB \
      --region=us-central1 \
      --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

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. התקנת התלות של מחבר Cloud SQL Node.js.
    npm install @google-cloud/cloud-sql-connector
    
  4. כדי לבצע אינטראקציה עם מסד הנתונים של PostgreSQL, צריך להתקין את pg.
    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}