نحوه اتصال یک برنامه Node.js در Cloud Run به یک Cloud SQL برای پایگاه داده PostgreSQL

۱. مرور کلی

رابط Cloud SQL Node.js ساده‌ترین راه برای اتصال ایمن برنامه Node.js شما به پایگاه داده Cloud SQL است. Cloud Run یک پلتفرم کاملاً مدیریت‌شده بدون سرور است که به شما امکان می‌دهد کانتینرهای بدون وضعیت را که از طریق درخواست‌های HTTP قابل فراخوانی هستند، اجرا کنید. این Codelab نحوه اتصال ایمن یک برنامه Node.js در Cloud Run به یک پایگاه داده Cloud SQL برای PostgreSQL را با یک حساب کاربری سرویس با استفاده از احراز هویت IAM نشان می‌دهد.

آنچه یاد خواهید گرفت

در این آزمایشگاه، شما یاد خواهید گرفت که چگونه موارد زیر را انجام دهید:

  • ایجاد یک نمونه Cloud SQL برای پایگاه داده PostgreSQL
  • یک برنامه Node.js را روی Cloud Run مستقر کنید
  • برنامه خود را با استفاده از کتابخانه Cloud SQL Node.js Connector به پایگاه داده خود متصل کنید

پیش‌نیازها

  • این آزمایشگاه آشنایی با محیط‌های Cloud Console و Cloud Shell را پیش‌فرض قرار می‌دهد.

۲. قبل از شروع

راه‌اندازی پروژه ابری

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب گوگل ندارید، باید یکی ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه ، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. می‌توانید آن را در هر زمانی به‌روزرسانی کنید.
  • شناسه پروژه در تمام پروژه‌های گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چیست. در اکثر آزمایشگاه‌های کد، باید به شناسه پروژه ارجاع دهید (که معمولاً با عنوان PROJECT_ID شناخته می‌شود). اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی خواهد ماند.
  • برای اطلاع شما، یک مقدار سوم هم وجود دارد، شماره پروژه که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، هزینه زیادی نخواهد داشت. برای خاموش کردن منابع به طوری که پس از این آموزش متحمل پرداخت صورتحساب نشوید، می‌توانید منابعی را که ایجاد کرده‌اید یا کل پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

تنظیمات محیط

با کلیک روی آیکون سمت راست نوار جستجو، 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.

۳. یک حساب کاربری سرویس راه‌اندازی کنید

یک حساب کاربری سرویس 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 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 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. دستور 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"
    

۴. تنظیم SQL ابری

دستور gcloud sql instances create اجرا کنید تا یک نمونه Cloud SQL ایجاد شود.

  • --database-version : نوع و نسخه موتور پایگاه داده. در صورت عدم تعیین، از پیش‌فرض API استفاده می‌شود. برای مشاهده نسخه‌های موجود فعلی، به مستندات نسخه‌های پایگاه داده gcloud مراجعه کنید.
  • --cpu : تعداد هسته‌های مورد نظر در دستگاه.
  • --memory : مقدار عددی صحیح که نشان می‌دهد چه مقدار حافظه در دستگاه مورد نیاز است. واحد اندازه باید ارائه شود (برای مثال، 3072 مگابایت یا 9 گیگابایت). اگر هیچ واحدی مشخص نشود، 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 استفاده نکنید. ما از این برای ارائه امتیازات لازم برای ایجاد و حذف جداول به صورت برنامه‌نویسی برای کد موجود در این آزمایش استفاده می‌کنیم.

۵. آماده‌سازی درخواست

یک برنامه 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. برای پذیرش درخواست‌های http ورودی، express را نصب کنید.
    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 گوش می‌دهد. اکنون برنامه آماده‌ی استقرار است.

۶. اجرای برنامه ابری را مستقر کنید

دستور زیر را برای استقرار برنامه خود در 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 برگردانده شده‌اند، مشاهده خواهید کرد.

۷. تبریک

شما یک برنامه Node.js را روی Cloud Run مستقر کرده‌اید که قادر به اتصال به پایگاه داده PostgreSQL است که روی Cloud SQL اجرا می‌شود.

آنچه ما پوشش داده‌ایم:

  • ایجاد یک Cloud SQL برای پایگاه داده PostgreSQL
  • استقرار یک برنامه Node.js در Cloud Run
  • اتصال برنامه شما به Cloud SQL با استفاده از رابط Cloud SQL Node.js

تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این آموزش، یا پروژه‌ای که شامل منابع است را حذف کنید، یا پروژه را نگه دارید و منابع تکی را حذف کنید. اگر می‌خواهید کل پروژه را حذف کنید، می‌توانید دستور زیر را اجرا کنید:

gcloud projects delete ${GOOGLE_CLOUD_PROJECT}