פריסת אפליקציית JavaScript ב-Cloud Run באמצעות Cloud SQL ל-PostgreSQL

פריסת אפליקציית JavaScript ב-Cloud Run באמצעות Cloud SQL ל-PostgreSQL

מידע על Codelab זה

subjectהעדכון האחרון: דצמ׳ 12, 2024
account_circleנכתב על ידי Luke Schlangen & Jack Wotherspoon

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

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

מה תלמדו

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

  • יצירת מכונה של Cloud SQL ל-PostgreSQL (שמוגדרת לשימוש ב-Private Service Connect)
  • פריסת אפליקציה ב-Cloud Run שמתחבר למסד הנתונים של Cloud SQL
  • איך משתמשים ב-Gemini Code Assist כדי להוסיף פונקציונליות לאפליקציה

מה תלמדו

  • יצירת מכונה של Cloud SQL ל-PostgreSQL (שמוגדרת לשימוש ב-Private Service Connect)
  • פריסת אפליקציה ב-Cloud Run שמתחבר למסד הנתונים של Cloud SQL
  • איך משתמשים ב-Gemini Code Assist כדי להוסיף פונקציונליות לאפליקציה

2.‏ דרישות מוקדמות

  1. אם עדיין אין לכם חשבון Google, עליכם ליצור חשבון Google.
    • משתמשים בחשבון אישי במקום בחשבון לצורכי עבודה או בחשבון בית ספרי. יכול להיות שבחשבונות לצורכי עבודה ובחשבונות בית ספריים יש הגבלות שמונעות מכם להפעיל את ממשקי ה-API הנדרשים לסדנה הזו.

3.‏ הגדרת הפרויקט

  1. נכנסים למסוף Google Cloud.
  2. מפעילים את החיוב במסוף Cloud.
    • השלמת ה-Lab אמורה לעלות פחות מ-1 $בארה"ב במשאבי Cloud.
    • כדי למנוע חיובים נוספים, תוכלו לפעול לפי השלבים שמפורטים בסוף שיעור ה-Lab הזה כדי למחוק את המשאבים.
    • משתמשים חדשים זכאים לתקופת ניסיון בחינם בשווי 300$‎.
  3. יוצרים פרויקט חדש או בוחרים לעשות שימוש חוזר בפרויקט קיים.

4.‏ פתיחת Cloud Shell Editor

  1. עוברים אל Cloud Shell Editor.
  2. אם מסוף ה-SSH לא מופיע בחלק התחתון של המסך, פותחים אותו:
    • לוחצים על תפריט שלושת הקווים סמל התפריט של שלושת הקווים.
    • לוחצים על Terminal (מסוף).
    • לוחצים על מסוף חדשפתיחת טרמינל חדש ב-Cloud Shell Editor
  3. בטרמינל, מגדירים את הפרויקט באמצעות הפקודה הבאה:
    • פורמט:
      gcloud config set project [PROJECT_ID]
    • דוגמה:
      gcloud config set project lab-project-id-example
    • אם לא זוכרים את מזהה הפרויקט:
      • אפשר להציג את כל מזהי הפרויקטים באמצעות:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
      הגדרת מזהה הפרויקט בטרמינל של Cloud Shell Editor
  4. אם מתבקשים לאשר, לוחצים על Authorize (מתן הרשאה) כדי להמשיך. לוחצים כדי לאשר את Cloud Shell
  5. אמורה להופיע ההודעה הבאה:
    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 \
  sqladmin.googleapis.com \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  networkconnectivity.googleapis.com \
  servicenetworking.googleapis.com \
  cloudaicompanion.googleapis.com

אם מתבקשים לאשר, לוחצים על Authorize (מתן הרשאה) כדי להמשיך. לוחצים כדי לאשר את Cloud Shell

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

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

6.‏ הגדרת חשבון שירות

יוצרים ומגדירים חשבון שירות ב-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. כדי להוסיף את התפקיד כתיבה ביומן לחשבון השירות ב-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.‏ יצירת מכונה של Cloud SQL

  1. יצירת מדיניות חיבור לשירות כדי לאפשר קישוריות רשת מ-Cloud Run ל-Cloud SQL באמצעות Private Service Connect
    gcloud network-connectivity service-connection-policies create quickstart-policy \
        --network=default \
        --project=${GOOGLE_CLOUD_PROJECT} \
        --region=us-central1 \
        --service-class=google-cloud-sql \
        --subnets=https://www.googleapis.com/compute/v1/projects/${GOOGLE_CLOUD_PROJECT}/regions/us-central1/subnetworks/default
  2. יצירת סיסמה ייחודית למסד הנתונים
    export DB_PASSWORD=$(openssl rand -base64 20)
  3. מריצים את הפקודה gcloud sql instances create כדי ליצור מכונה של Cloud SQL
    gcloud sql instances create quickstart-instance \
        --project=${GOOGLE_CLOUD_PROJECT} \
        --root-password=${DB_PASSWORD} \
        --database-version=POSTGRES_17 \
        --tier=db-perf-optimized-N-2 \
        --region=us-central1 \
        --ssl-mode=ENCRYPTED_ONLY \
        --no-assign-ip \
        --enable-private-service-connect \
        --psc-auto-connections=network=projects/${GOOGLE_CLOUD_PROJECT}/global/networks/default

השלמת הפקודה הזו עשויה להימשך כמה דקות.

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

8.‏ הכנת הבקשה

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

  1. יוצרים ספרייה חדשה בשם helloworld ב-Cloud Shell, ולאחר מכן עוברים לספרייה הזו:
    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. מתקינים את pg כדי ליצור אינטראקציה עם מסד הנתונים של PostgreSQL.
    npm install pg
  4. התקנת Express כדי לקבל בקשות HTTP נכנסות.
    npm install express
  5. יוצרים קובץ index.mjs עם קוד האפליקציה. הקוד הזה מאפשר:
    • אישור בקשות HTTP
    • חיבור למסד הנתונים
    • שמירת הזמן של בקשת ה-HTTP במסד הנתונים
    • החזרת הזמנים של חמש הבקשות האחרונות
    מריצים את הפקודה הבאה ב-Cloud Shell:
    cat > index.mjs << "EOF"
    import express from 'express';
    import pg from 'pg';
    const { Pool } = pg;

    const pool = new Pool({
     
    host: process.env.DB_HOST,
     
    user: process.env.DB_USER,
     
    password: process.env.DB_PASSWORD,
     
    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

  1. כדי להוסיף את התפקיד 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"
  1. מריצים את הפקודה הבאה כדי לפרוס את האפליקציה ב-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
  2. אם מופיעה בקשה, מקישים על Y ו-Enter כדי לאשר את המשך הפעולה:
    Do you want to continue (Y/n)? Y
    

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

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

10.‏ מזל טוב

בשיעור ה-Lab הזה למדתם:

  • יצירת מכונה של Cloud SQL ל-PostgreSQL (שהוגדרה לשימוש ב-Private Service Connect)
  • פריסת אפליקציה ב-Cloud Run שמתחבר למסד הנתונים של Cloud SQL
  • איך משתמשים ב-Gemini Code Assist כדי להוסיף פונקציונליות לאפליקציה

הסרת המשאבים

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

gcloud projects delete ${GOOGLE_CLOUD_PROJECT}