Cloud Run पर Node.js ऐप्लिकेशन को PostgreSQL के लिए Cloud SQL से कनेक्ट करने का तरीका

1. खास जानकारी

Cloud SQL Node.js कनेक्टर, Node.js ऐप्लिकेशन को Cloud SQL डेटाबेस से सुरक्षित तरीके से कनेक्ट करने का सबसे आसान तरीका है. Cloud Run, पूरी तरह से मैनेज किया गया सर्वरलेस प्लैटफ़ॉर्म है. इसकी मदद से, एचटीटीपी अनुरोधों के ज़रिए कॉल किए जा सकने वाले स्टेटलेस कंटेनर चलाए जा सकते हैं. इस कोडलैब में, यह दिखाया जाएगा कि IAM की मदद से पुष्टि करने की सुविधा का इस्तेमाल करके, सेवा खाते की मदद से Cloud Run पर मौजूद Node.js ऐप्लिकेशन को Cloud SQL for PostgreSQL डेटाबेस से सुरक्षित तरीके से कैसे कनेक्ट किया जाता है.

आपको क्या सीखने को मिलेगा

इस लैब में, आपको ये काम करने का तरीका बताया जाएगा:

  • PostgreSQL डेटाबेस के लिए Cloud SQL इंस्टेंस बनाना
  • Cloud Run पर Node.js ऐप्लिकेशन डिप्लॉय करना
  • Cloud SQL Node.js Connector लाइब्रेरी का इस्तेमाल करके, अपने ऐप्लिकेशन को डेटाबेस से कनेक्ट करना

ज़रूरी शर्तें

  • इस लैब को शुरू करने से पहले, यह माना जा रहा है कि आपको Cloud Console और Cloud Shell एनवायरमेंट के बारे में जानकारी है.

2. शुरू करने से पहले

Cloud Project का सेटअप

  1. Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास Google खाता नहीं है, तो आपको एक खाता बनाना होगा.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों के लिए डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, सभी Google Cloud प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे बदला नहीं जा सकता. Cloud Console, यूनीक स्ट्रिंग अपने-आप जनरेट करता है. आम तौर पर, आपको इससे कोई फ़र्क़ नहीं पड़ता कि यह क्या है. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना होगा. इसे आम तौर पर PROJECT_ID के तौर पर पहचाना जाता है. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो कोई दूसरा रैंडम आईडी जनरेट किया जा सकता है. इसके अलावा, आपके पास अपना नाम आज़माने का विकल्प भी है. इससे आपको पता चलेगा कि वह नाम उपलब्ध है या नहीं. इस चरण के बाद, इसे बदला नहीं जा सकता. यह प्रोजेक्ट की अवधि तक बना रहेगा.
  • आपकी जानकारी के लिए बता दें कि एक तीसरी वैल्यू भी होती है, जिसे प्रोजेक्ट नंबर कहा जाता है. इसका इस्तेमाल कुछ एपीआई करते हैं. इन तीनों वैल्यू के बारे में ज़्यादा जानने के लिए, दस्तावेज़ देखें.
  1. इसके बाद, Cloud Console में बिलिंग चालू करें, ताकि Cloud संसाधनों/एपीआई का इस्तेमाल किया जा सके. इस कोडलैब को पूरा करने में ज़्यादा खर्च नहीं आएगा. इस ट्यूटोरियल के बाद बिलिंग से बचने के लिए, बनाए गए संसाधनों को बंद किया जा सकता है. इसके लिए, बनाए गए संसाधनों को मिटाएँ या पूरे प्रोजेक्ट को मिटाएँ. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के क्रेडिट के साथ मुफ़्त में आज़माने के प्रोग्राम के लिए ज़रूरी शर्तें पूरी करते हैं.

एनवायरमेंट सेटअप करना

सर्च बार के दाईं ओर मौजूद आइकॉन पर क्लिक करके, Cloud Shell चालू करें.

ecdc43ada29e91b.png

Cloud Shell में जाकर, इन एपीआई को चालू करें:

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.

3. सेवा खाता सेट अप करना

Cloud Run के लिए, Google Cloud सेवा खाता बनाएं और उसे कॉन्फ़िगर करें, ताकि उसके पास Cloud SQL से कनेक्ट करने की सही अनुमतियां हों.

  1. नया सेवा खाता बनाने के लिए, gcloud iam service-accounts create कमांड को इस तरह चलाएं:
    gcloud iam service-accounts create quickstart-service-account \
      --display-name="Quickstart Service Account"
    
  2. अभी बनाए गए Google Cloud सेवा खाते में Cloud SQL क्लाइंट की भूमिका जोड़ने के लिए, gcloud projects add-iam-policy-binding कमांड को इस तरह से चलाएं. 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. आपने अभी जो Google Cloud सेवा खाता बनाया है उसमें Cloud SQL इंस्टेंस के उपयोगकर्ता की भूमिका जोड़ने के लिए, 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/cloudsql.instanceUser"
    
  4. अभी बनाए गए Google Cloud सेवा खाते में Log Writer की भूमिका जोड़ने के लिए, 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"
    

4. Cloud SQL सेट अप करना

Cloud SQL इंस्टेंस बनाने के लिए, gcloud sql instances create कमांड चलाएं.

  • --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_18 \
      --tier=db-custom-1-3840 \
      --region=us-central1 \
      --edition=ENTERPRISE \
      --database-flags=cloudsql.iam_authentication=on
    

इस कमांड को पूरा होने में कुछ मिनट लग सकते हैं.

gcloud sql databases create में Cloud SQL डेटाबेस बनाने के लिए, gcloud sql databases create कमांड चलाएं.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 का इस्तेमाल न करें. हम इस कुकी का इस्तेमाल, इस लैब में कोड के लिए प्रोग्राम के हिसाब से टेबल बनाने और हटाने के लिए ज़रूरी अनुमतियां देने के लिए करते हैं.

5. ऐप्लिकेशन तैयार करना

एक ऐसा Node.js ऐप्लिकेशन तैयार करें जो एचटीटीपी अनुरोधों का जवाब दे.

  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. आने वाले एचटीटीपी अनुरोधों को स्वीकार करने के लिए, एक्सप्रेस इंस्टॉल करें.
    npm install express
    
  6. ऐप्लिकेशन कोड के साथ index.mjs फ़ाइल बनाएं. यह कोड ये काम कर सकता है:
    • एचटीटीपी अनुरोध स्वीकार करना
    • डेटाबेस से कनेक्ट करना
    • डेटाबेस में एचटीटीपी अनुरोध का समय सेव करना
    • पिछले पांच अनुरोधों का समय दिखाएं
    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 एनवायरमेंट वैरिएबल से तय किए गए पोर्ट पर सिग्नल पाने के लिए कॉन्फ़िगर किया गया है. अब ऐप्लिकेशन को डिप्लॉय किया जा सकता है.

6. Cloud Run ऐप्लिकेशन डिप्लॉय करना

अपने ऐप्लिकेशन को 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

कुछ मिनटों के बाद, ऐप्लिकेशन आपको एक यूआरएल देगा. इस यूआरएल पर जाकर, आपको यह जानकारी मिल जाएगी.

अपने ऐप्लिकेशन को काम करते हुए देखने के लिए, यूआरएल पर जाएं. जब भी यूआरएल पर विज़िट किया जाएगा या पेज को रीफ़्रेश किया जाएगा, तब आपको JSON के तौर पर पांच सबसे हाल की विज़िट दिखेंगी.

7. बधाई हो

आपने Cloud Run पर एक Node.js ऐप्लिकेशन डिप्लॉय किया है. यह Cloud SQL पर चल रहे PostgreSQL डेटाबेस से कनेक्ट हो सकता है.

हमने इन विषयों के बारे में जानकारी दी है:

  • Cloud SQL for PostgreSQL डेटाबेस बनाना
  • Cloud Run पर Node.js ऐप्लिकेशन डिप्लॉय करना
  • Cloud SQL Node.js कनेक्टर का इस्तेमाल करके, अपने ऐप्लिकेशन को Cloud SQL से कनेक्ट करना

व्यवस्थित करें

इस ट्यूटोरियल में इस्तेमाल किए गए संसाधनों के लिए, अपने Google Cloud खाते से शुल्क न लिए जाने के लिए, संसाधनों वाला प्रोजेक्ट मिटाएं. इसके अलावा, प्रोजेक्ट को बनाए रखने और अलग-अलग संसाधनों को मिटाने का विकल्प भी है. अगर आपको पूरा प्रोजेक्ट मिटाना है, तो यह कमांड चलाएं:

gcloud projects delete ${GOOGLE_CLOUD_PROJECT}