یک برنامه جاوا اسکریپت را در Cloud Run با AlloyDB اجرا کنید

۱. مرور کلی

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

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

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

  • یک نمونه AlloyDB ایجاد کنید (برای استفاده از Private Service Connect پیکربندی شده باشد)
  • یک برنامه را در Cloud Run مستقر کنید که به نمونه AlloyDB شما متصل شود

۲. پیش‌نیازها

  1. اگر از قبل حساب گوگل ندارید، باید یک حساب گوگل ایجاد کنید .
    • به جای حساب کاری یا تحصیلی از یک حساب شخصی استفاده کنید. حساب‌های کاری و تحصیلی ممکن است محدودیت‌هایی داشته باشند که مانع از فعال کردن APIهای مورد نیاز برای این آزمایشگاه توسط شما شود.

۳. راه‌اندازی پروژه

  1. وارد کنسول ابری گوگل شوید.
  2. فعال کردن پرداخت در کنسول ابری
    • تکمیل این آزمایشگاه باید کمتر از ۱ دلار آمریکا از طریق منابع ابری هزینه داشته باشد.
    • شما می‌توانید مراحل انتهای این آزمایش را برای حذف منابع دنبال کنید تا از هزینه‌های بیشتر جلوگیری شود.
    • کاربران جدید واجد شرایط استفاده از دوره آزمایشی رایگان ۳۰۰ دلاری هستند.
  3. یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید.

۴. ویرایشگر Cloud Shell را باز کنید

  1. به ویرایشگر Cloud Shell بروید
  2. اگر ترمینال در پایین صفحه نمایش داده نشد، آن را باز کنید:
    • روی منوی همبرگری کلیک کنید آیکون منوی همبرگری
    • روی ترمینال کلیک کنید
    • روی ترمینال جدید کلیک کنید باز کردن ترمینال جدید در ویرایشگر 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 اجرا کنید.

۵. فعال کردن APIها

در ترمینال، APIها را فعال کنید:

gcloud services enable \
  compute.googleapis.com \
  alloydb.googleapis.com \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  cloudaicompanion.googleapis.com

اگر از شما خواسته شد که مجوز دهید، برای ادامه روی تأیید کلیک کنید. برای تأیید Cloud Shell کلیک کنید

تکمیل این دستور ممکن است چند دقیقه طول بکشد، اما در نهایت باید پیامی مشابه این پیام موفقیت‌آمیز نمایش داده شود:

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

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

یک حساب کاربری سرویس Google Cloud ایجاد و پیکربندی کنید تا توسط Cloud Run مورد استفاده قرار گیرد و مجوزهای صحیح برای اتصال به AlloyDB را داشته باشد.

  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 را به صورت زیر اجرا کنید تا نقش کاربری پایگاه داده AlloyDB به حساب سرویس Google Cloud که اخیراً ایجاد کرده‌اید، اضافه شود.
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
      --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
      --role="roles/alloydb.databaseUser"
    
  3. دستور gcloud projects add-iam-policy-binding را به صورت زیر اجرا کنید تا نقش Service Usage Consumer به حساب سرویس Google Cloud که اخیراً ایجاد کرده‌اید اضافه شود.
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
      --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
      --role="roles/serviceusage.serviceUsageConsumer"
    
  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"
    

۷. ایجاد پایگاه داده AlloyDB

  1. دستور gcloud alloydb clusters create اجرا کنید تا یک نمونه Cloud SQL ایجاد شود.
    gcloud alloydb clusters create quickstart-cluster \
      --password=$(openssl rand -base64 20) \
      --region=us-central1 \
      --project=${GOOGLE_CLOUD_PROJECT} \
      --enable-private-service-connect \
      --database-version=POSTGRES_16
    

اجرای این دستور ممکن است چند دقیقه طول بکشد.

  1. دستور gcloud alloydb instances create اجرا کنید تا یک نمونه Cloud SQL ایجاد شود.
    gcloud alloydb instances create quickstart-instance \
      --project=${GOOGLE_CLOUD_PROJECT} \
      --instance-type=PRIMARY \
      --cpu-count=2 \
      --region=us-central1 \
      --cluster=quickstart-cluster \
      --allowed-psc-projects=${GOOGLE_CLOUD_PROJECT} \
      --database-flags=alloydb.iam_authentication=on
    
  2. دستور gcloud alloydb instances describe را اجرا کنید تا لینک پیوست سرویس PSC را دریافت کرده و آن را به یک متغیر export کنید.
    export SERVICE_ATTACHMENT=$(gcloud alloydb instances describe quickstart-instance \
        --cluster=quickstart-cluster --region=us-central1 \
        --format="value(pscInstanceConfig.serviceAttachmentLink)")
    
  3. gcloud compute addresses create quickstart-address \
      --region=us-central1 \
      --subnet=default
    
  4. gcloud compute forwarding-rules create quickstart-endpoint \
      --region=us-central1 \
      --network=default \
      --address=quickstart-address \
      --target-service-attachment=${SERVICE_ATTACHMENT}
    

یک کاربر پایگاه داده PostgreSQL برای حساب کاربری سرویسی که قبلاً ایجاد کرده‌اید تا به پایگاه داده دسترسی داشته باشید، ایجاد کنید.

gcloud alloydb users create quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam \
  --cluster=quickstart-cluster \
  --region=us-central1 \
  --type=IAM_BASED \
  --superuser=true

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

یک برنامه 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. کتابخانه Google Cloud Auth را نصب کنید.
    npm install google-auth-library
    
  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';
    const { Pool } = pg;
    import {GoogleAuth} from 'google-auth-library';
    
    const auth = new GoogleAuth({
      scopes: ['https://www.googleapis.com/auth/alloydb.login'],
    });
    
    const pool = new Pool({
      host: process.env.DB_HOST,
      user: process.env.DB_USER,
      password: async () => {
        return await auth.getAccessToken();
      },
      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 گوش می‌دهد. اکنون برنامه آماده‌ی استقرار است.

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

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

پس از چند دقیقه، برنامه باید یک URL برای بازدید شما ارائه دهد.

برای مشاهده‌ی عملکرد برنامه، به آدرس اینترنتی (URL) بروید. هر بار که از آدرس اینترنتی (URL) بازدید می‌کنید یا صفحه را رفرش می‌کنید، پنج بازدید اخیر را که به صورت JSON برگردانده شده‌اند، مشاهده خواهید کرد.

۱۰. تبریک

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

  • یک نمونه AlloyDB ایجاد کنید (برای استفاده از Private Service Connect پیکربندی شده باشد)
  • یک برنامه را در Cloud Run مستقر کنید که به نمونه AlloyDB شما متصل شود

تمیز کردن

Cloud SQL نسخه رایگان ندارد و در صورت ادامه استفاده، از شما هزینه دریافت می‌شود. می‌توانید پروژه Cloud خود را حذف کنید تا از هزینه‌های اضافی جلوگیری شود.

اگرچه Cloud Run در صورت عدم استفاده از سرویس، هزینه‌ای دریافت نمی‌کند، اما ممکن است همچنان برای ذخیره تصویر کانتینر در Artifact Registry هزینه دریافت شود. حذف پروژه Cloud شما، پرداخت هزینه برای تمام منابع استفاده شده در آن پروژه را متوقف می‌کند.

اگر مایلید، پروژه را حذف کنید:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

همچنین ممکن است بخواهید منابع غیرضروری را از دیسک cloudshell خود حذف کنید. می‌توانید:

  1. پوشه پروژه codelab را حذف کنید:
    rm -rf ~/task-app
    
  2. هشدار! اقدام بعدی قابل بازگشت نیست! اگر می‌خواهید همه چیز را در Cloud Shell خود حذف کنید تا فضا آزاد شود، می‌توانید کل دایرکتوری خانگی خود را حذف کنید . مراقب باشید که هر چیزی که می‌خواهید نگه دارید در جای دیگری ذخیره شده باشد.
    sudo rm -rf $HOME
    

به یادگیری ادامه دهید