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

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

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

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

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

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

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

  • इस लैब को शुरू करने से पहले, यह माना जा रहा है कि आपको 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_14 \
      --cpu=1 \
      --memory=4GB \
      --region=us-central1 \
      --database-flags=cloudsql.iam_authentication=on
    

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

quickstart-instance में Cloud SQL डेटाबेस बनाने के लिए, gcloud sql databases create कमांड चलाएं.

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. ऐप्लिकेशन तैयार करना

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

  1. Cloud Shell में, helloworld नाम की नई डायरेक्ट्री बनाएं. इसके बाद, उस डायरेक्ट्री में जाएं:
    mkdir helloworld
    cd helloworld
    
  2. नया Go ऐप्लिकेशन शुरू करने के लिए, go mod init चलाएं.
    go mod init github.com/GoogleCloudPlatform/golang-samples/run/helloworld
    
  3. Cloud SQL Go कनेक्टर की डिपेंडेंसी इंस्टॉल करें.
    go get cloud.google.com/go/cloudsqlconn
    go get cloud.google.com/go/cloudsqlconn/postgres/pgxv4
    
  4. ऐप्लिकेशन कोड के साथ main.go फ़ाइल बनाएं. यह कोड ये काम कर सकता है:
    • एचटीटीपी अनुरोध स्वीकार करना
    • डेटाबेस से कनेक्ट करना
    • डेटाबेस में एचटीटीपी अनुरोध का समय सेव करना
    • पिछले पांच अनुरोधों का समय दिखाएं
    Cloud Shell में यह कमांड चलाएं:
    cat > main.go << "EOF"
    package main
    
    import (
      "database/sql"
      "encoding/json"
      "fmt"
      "log"
      "net/http"
      "os"
      "time"
    
      "cloud.google.com/go/cloudsqlconn"
      "cloud.google.com/go/cloudsqlconn/postgres/pgxv4"
    )
    
    // visitData is used to pass data to the HTML template.
    type visitData struct {
      RecentVisits []visit
    }
    
    // visit contains a single row from the visits table in the database.
    // Each visit includes a timestamp.
    type visit struct {
      VisitTime time.Time
    }
    
    // getDB creates a connection to the database
    // based on environment variables.
    func getDB() (*sql.DB, func() error) {
      cleanup, err := pgxv4.RegisterDriver("cloudsql-postgres", cloudsqlconn.WithIAMAuthN())
      if err != nil {
        log.Fatalf("Error on pgxv4.RegisterDriver: %v", err)
      }
    
      dsn := fmt.Sprintf("host=%s user=%s dbname=%s sslmode=disable", os.Getenv("INSTANCE_CONNECTION_NAME"), os.Getenv("DB_USER"), os.Getenv("DB_NAME"))
      db, err := sql.Open("cloudsql-postgres", dsn)
      if err != nil {
        log.Fatalf("Error on sql.Open: %v", err)
      }
    
      createVisits := `CREATE TABLE IF NOT EXISTS visits (
        id SERIAL NOT NULL,
        created_at timestamp NOT NULL,
        PRIMARY KEY (id)
      );`
      _, err = db.Exec(createVisits)
      if err != nil {
        log.Fatalf("unable to create table: %s", err)
      }
    
      return db, cleanup
    }
    
    func main() {
      port := os.Getenv("PORT")
      if port == "" {
        port = "8080"
      }
      log.Printf("Listening on port %s", port)
      db, cleanup := getDB()
      defer cleanup()
    
      http.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) {
        // Insert current visit
        _, err := db.Exec("INSERT INTO visits(created_at) VALUES(NOW())")
        if err != nil {
          log.Fatalf("unable to save visit: %v", err)
        }
    
        // Get the last 5 visits
        rows, err := db.Query("SELECT created_at FROM visits ORDER BY created_at DESC LIMIT 5")
        if err != nil {
          log.Fatalf("DB.Query: %v", err)
        }
        defer rows.Close()
    
        var visits []visit
        for rows.Next() {
          var visitTime time.Time
          err := rows.Scan(&visitTime)
          if err != nil {
            log.Fatalf("Rows.Scan: %v", err)
          }
          visits = append(visits, visit{VisitTime: visitTime})
        }
        response, err := json.Marshal(visitData{RecentVisits: visits})
        if err != nil {
          log.Fatalf("renderIndex: failed to parse totals with json.Marshal: %v", err)
        }
        w.Write(response)
      })
      if err := http.ListenAndServe(":"+port, nil); err != nil {
        log.Fatal(err)
      }
    }
    
    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

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

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

7. बधाई हो

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

हमने इन विषयों पर बात की:

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

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

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

gcloud projects delete ${GOOGLE_CLOUD_PROJECT}