نشر تطبيق JavaScript على Cloud Run باستخدام Cloud SQL for PostgreSQL

1. نظرة عامة

Cloud Run هو نظام أساسي مُدار بالكامل بدون خادم يتيح لك تشغيل حاويات لا تتضمّن حالة ويمكن استدعاؤها من خلال طلبات HTTP. سيوضّح لك هذا الدليل التعليمي كيفية ربط تطبيق Node.js على Cloud Run بقاعدة بيانات Cloud SQL لقاعدة بيانات PostgreSQL.

ما ستتعرّف عليه

في هذه الميزة الاختبارية، ستتعرّف على كيفية تنفيذ ما يلي:

  • إنشاء مثيل Cloud SQL for PostgreSQL (تم ضبطه لاستخدام Private Service Connect)
  • نشر تطبيق على Cloud Run يتصل بقاعدة بيانات Cloud SQL
  • استخدام ميزة Gemini Code Assist لإضافة وظائف إلى تطبيقك

ما ستتعرّف عليه

  • إنشاء مثيل Cloud SQL for PostgreSQL (تم ضبطه لاستخدام Private Service Connect)
  • نشر تطبيق على Cloud Run يتصل بقاعدة بيانات Cloud SQL
  • استخدام ميزة Gemini Code Assist لإضافة وظائف إلى تطبيقك

2. المتطلبات الأساسية

  1. إذا لم يكن لديك حساب على Google، عليك إنشاء حساب على Google.
    • استخدام حساب شخصي بدلاً من حساب عمل أو حساب تديره مؤسسة تعليمية قد تفرض حسابات العمل والحسابات التي تديرها المؤسسات التعليمية قيودًا تمنعك من تفعيل واجهات برمجة التطبيقات اللازمة لهذا الدرس التطبيقي.

3- إعداد المشروع

  1. سجِّل الدخول إلى Google Cloud Console.
  2. فعِّل الفوترة في Cloud Console.
    • من المفترض أن تبلغ تكلفة إكمال هذا البرنامج التدريبي أقل من دولار أمريكي واحد في موارد Cloud.
    • يمكنك اتّباع الخطوات الواردة في نهاية هذا البرنامج التدريبي لحذف الموارد لتجنُّب تحصيل المزيد من الرسوم.
    • يكون المستخدمون الجدد مؤهّلين للاستفادة من الفترة التجريبية المجانية التي تبلغ قيمتها 300 دولار أمريكي.
  3. أنشئ مشروعًا جديدًا أو اختَر إعادة استخدام مشروع حالي.

4. فتح محرِّر Cloud Shell

  1. انتقِل إلى محرِّر Cloud Shell.
  2. إذا لم تظهر المحطة الطرفية في أسفل الشاشة، افتح المحطة باتّباع الخطوات التالية:
    • انقر على قائمة الخطوط الثلاثة رمز قائمة الهمبرغر.
    • انقر على Terminal (الوحدة الطرفية).
    • انقر على وحدة تحكّم جديدةفتح وحدة طرفية جديدة في محرِّر Cloud Shell.
  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
  4. إذا طُلب منك تفويض، انقر على تفويض للمتابعة. انقر على تفويض Cloud Shell.
  5. من المفترض أن تظهر لك هذه الرسالة:
    Updated property [core/project].
    
    إذا ظهر لك رمز WARNING وتلقّيت رسالة Do you want to continue (Y/N)?، هذا يعني على الأرجح أنّك أدخلت رقم تعريف المشروع بشكل غير صحيح. اضغط على N، ثم اضغط على Enter، وحاول تنفيذ الأمر gcloud config set project مرة أخرى.

5- تفعيل واجهات برمجة التطبيقات

في الوحدة الطرفية، فعِّل واجهات برمجة التطبيقات:

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

إذا طُلب منك تفويض، انقر على تفويض للمتابعة. انقر على تفويض 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. شغِّل الأمر gcloud projects add-iam-policy-binding على النحو التالي لإضافة دور كاتب السجلّ إلى حساب الخدمة على 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"
    

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. في 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. ثبِّت 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. نفِّذ الأمر gcloud projects add-iam-policy-binding على النحو التالي لإضافة دور مستخدم الشبكة إلى حساب خدمة Cloud Run لخدمة Cloud Run التي أنت على وشك إنشاؤها.
    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. تهانينا

في هذه الميزة الاختبارية، تعلمت كيفية تنفيذ ما يلي:

  • إنشاء مثيل Cloud SQL for PostgreSQL (تم ضبطه لاستخدام Private Service Connect)
  • نشر تطبيق على Cloud Run يتصل بقاعدة بيانات Cloud SQL
  • استخدام ميزة Gemini Code Assist لإضافة وظائف إلى تطبيقك

تَنظيم

لتجنُّب تحصيل رسوم من حسابك على Google Cloud مقابل الموارد المستخدَمة في هذا الدليل التعليمي، يمكنك إما حذف المشروع الذي يحتوي على الموارد أو الاحتفاظ بالمشروع وحذف الموارد الفردية. إذا أردت حذف المشروع بأكمله، يمكنك تنفيذ:

gcloud projects delete ${GOOGLE_CLOUD_PROJECT}