1. نظرة عامة
يُعدّ موصل Node.js في Cloud SQL أسهل طريقة لربط تطبيق Node.js بقاعدة بيانات Cloud SQL بأمان. التشغيل في السحابة الإلكترونية هو نظام أساسي مُدار بالكامل بدون خادم يتيح لك تشغيل حاويات بدون حالة قابلة للإلغاء من خلال طلبات HTTP. سيشرح هذا الدرس التطبيقي حول الترميز كيفية ربط تطبيق Node.js على النظام الأساسي Cloud Run بقاعدة بيانات Cloud SQL for PostgreSQL بأمان من خلال حساب خدمة يستخدم "مصادقة إدارة الهوية وإمكانية الوصول".
ما سوف تتعلمه
ستتعلم في هذا التمرين المعملي كيفية القيام بما يلي:
- إنشاء مثيل Cloud SQL لقاعدة بيانات PostgreSQL
- نشر تطبيق Node.js في Cloud Run
- ربط التطبيق بقاعدة البيانات باستخدام مكتبة Cloud SQL Node.js Connector
المتطلبات الأساسية
- يفترض هذا التمرين المعملي الإلمام ببيئة Cloud Console وCloud Shell.
2. قبل البدء
إعداد مشروع Cloud
- سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Google، عليك إنشاء حساب.
- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديله في أي وقت.
- يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد تحديده). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الإشارة إلى رقم تعريف المشروع (يتم تحديده عادةً على أنّه
PROJECT_ID
). وإذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. ويمكنك بدلاً من ذلك تجربة طلبك الخاص ومعرفة ما إذا كان متوفّرًا. ولا يمكن تغييره بعد هذه الخطوة وسيبقى طوال مدة المشروع. - لمعلوماتك، هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في Cloud. إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. لإيقاف تشغيل الموارد حتى لا تتحمل الفوترة بعد هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع بالكامل. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.
إعداد البيئة
يمكنك تفعيل Cloud Shell من خلال النقر على الرمز على يسار شريط البحث.
من Cloud Shell، فعِّل واجهات برمجة التطبيقات:
gcloud services enable compute.googleapis.com sqladmin.googleapis.com \
run.googleapis.com artifactregistry.googleapis.com \
cloudbuild.googleapis.com servicenetworking.googleapis.com
إذا طُلب منك التفويض، انقر على "تفويض". للمتابعة.
قد يستغرق هذا الأمر بضع دقائق حتى يكتمل، ولكن يُفترض في النهاية أن تنتج رسالة ناجحة مماثلة للرسالة التالية:
Operation "operations/acf.p2-327036483151-73d90d00-47ee-447a-b600-a6badf0eceae" finished successfully.
3- إعداد حساب الخدمة
يمكنك إنشاء حساب خدمة Google Cloud وإعداده ليتم استخدامه بواسطة Cloud Run حتى يحصل على الأذونات الصحيحة للاتصال بخدمة Cloud SQL.
- شغِّل الأمر
gcloud iam service-accounts create
على النحو التالي لإنشاء حساب خدمة جديد:gcloud iam service-accounts create quickstart-service-account \ --display-name="Quickstart Service Account"
- شغِّل الأمر 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"
- شغِّل الأمر add-iam-policy-binding في مشاريع gcloud على النحو التالي لإضافة دور مستخدم مثيل 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"
- شغِّل الأمر 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
شغِّل الأمر gcloud sql instances create
لإنشاء مثيل Cloud SQL.
- –database-version: نوع محرك قاعدة البيانات وإصداره. في حال ترك هذه السياسة بدون تحديد، يتم استخدام الإعدادات التلقائية لواجهة برمجة التطبيقات. راجِع وثائق إصدارات قاعدة بيانات gcloud للاطّلاع على الإصدارات المتاحة حاليًا.
- –cpu: عدد النوى المطلوبة في الجهاز.
- –memory: قيمة العدد الكامل التي تشير إلى حجم الذاكرة المطلوبة في الجهاز. يجب تقديم وحدة حجم (على سبيل المثال، 3072 ميغابايت أو 9 غيغابايت). إذا لم يتم تحديد أي وحدات، يتم افتراض غيغابايت.
- –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.
- في Cloud Shell، أنشئ دليلاً جديدًا باسم
helloworld
، ثم غيِّره إلى ذلك الدليل: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"
- ثبِّت تبعية موصل Cloud SQL Node.js.
npm install @google-cloud/cloud-sql-connector
- ثبِّت
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'; 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
شغّل الأمر أدناه لنشر تطبيقك في تشغيل السحابة:
- –region: الموقع الجغرافي للمثيل (مثلاً: us-central1 وasia-east1 وus-east1).
- –source: رمز المصدر المطلوب نشره. في هذه الحالة، يشير
.
إلى رمز المصدر في المجلد الحاليhelloworld
. - –set-env-vars: تضبط هذه السياسة متغيّرات البيئة التي يستخدمها التطبيق لتوجيه التطبيق إلى قاعدة بيانات Cloud SQL.
- –service-account: يربط نشر Cloud Run بحساب الخدمة بأذونات للربط بقاعدة بيانات Cloud SQL التي تم إنشاؤها في بداية هذا الدرس التطبيقي حول الترميز.
- –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 باستخدام موصل Node.js في Cloud SQL
تَنظيم
لتجنُّب تحمُّل الرسوم المفروضة على حسابك على Google Cloud مقابل الموارد المُستخدَمة في هذا الدليل التوجيهي، يمكنك إما حذف المشروع الذي يحتوي على الموارد أو الاحتفاظ بالمشروع وحذف الموارد الفردية. إذا كنت ترغب في حذف المشروع بأكمله، يمكنك تشغيل:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}