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

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

इस कोडलैब (कोड बनाना सीखने के लिए ट्यूटोरियल) के बारे में जानकारी

subjectपिछली बार मार्च 8, 2023 को अपडेट किया गया
account_circleLuke Schlangen & Jack Wotherspoon ने लिखा

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

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

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

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

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

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

  • यह लैब, Cloud Console और Cloud Shell एनवायरमेंट के बारे में अच्छी तरह से समझ लेता है.

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

Cloud प्रोजेक्ट का सेटअप

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों का डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करता. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे बदला नहीं जा सकता. इसे सेट करने के बाद बदला नहीं जा सकता. Cloud Console, एक यूनीक स्ट्रिंग अपने-आप जनरेट करता है; आम तौर पर, आपको उसके होने की कोई परवाह नहीं होती. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना होगा. आम तौर पर, इसे PROJECT_ID के तौर पर पहचाना जाता है. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो किसी भी क्रम में एक और आईडी जनरेट किया जा सकता है. इसके अलावा, खुद भी आज़माया जा सकता है और देखें कि वह उपलब्ध है या नहीं. इस चरण के बाद इसे बदला नहीं जा सकता और प्रोजेक्ट के कुल समय तक बना रहेगा.
  • आपकी जानकारी के लिए, एक तीसरी वैल्यू यानी प्रोजेक्ट नंबर है. इसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
  1. इसके बाद, आपको क्लाउड संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. इस ट्यूटोरियल के अलावा, संसाधनों को बंद करने के लिए कि आपको बिलिंग न करनी पड़े. इसके लिए, अपने बनाए गए संसाधनों को मिटाएं या पूरा प्रोजेक्ट मिटाएं. 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 प्रोजेक्ट 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 प्रोजेक्ट 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 सेवा खाता बनाया है उसमें लॉग राइटर की भूमिका जोड़ने के लिए, gcloud प्रोजेक्ट 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 डेटाबेस के वर्शन का दस्तावेज़ देखें.
  • –सीपीयू: मशीन में ज़रूरी कोर की संख्या.
  • –मेमोरी: पूर्णांक की वैल्यू से पता चलता है कि मशीन में कितनी मेमोरी चाहिए. साइज़ की यूनिट दी जानी चाहिए (उदाहरण के लिए, 3072एमबी या 9 जीबी). अगर कोई इकाई तय नहीं की गई है, तो जीबी मान लिया जाता है.
  • –region: इंस्टेंस की रीजनल लोकेशन (उदाहरण के लिए: us-central1, asia-east1, us-east1).
  • –डेटाबेस-फ़्लैग: फ़्लैग सेट करने की अनुमति देता है. इस मामले में, हम पहले बनाए गए सेवा खाते का इस्तेमाल करके, Cloud Run को Cloud SQL से कनेक्ट करने के लिए cloudsql.iam_authentication को चालू कर रहे हैं.
    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 Connector डिपेंडेंसी को इंस्टॉल करें.
    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. क्लाउड रन ऐप्लिकेशन डिप्लॉय करें

अपने ऐप्लिकेशन को डिप्लॉय करने के लिए, नीचे दिया गया निर्देश चलाएं:

  • –region: इंस्टेंस की रीजनल लोकेशन (उदाहरण के लिए: us-central1, asia-east1, us-east1).
  • –सोर्स: डिप्लॉय किया जाने वाला सोर्स कोड. इस मामले में, ., मौजूदा फ़ोल्डर helloworld के सोर्स कोड का हवाला देता है.
  • –set-env-vars: यह ऐप्लिकेशन के इस्तेमाल किए जाने वाले एनवायरमेंट वैरिएबल को सेट करता है, ताकि ऐप्लिकेशन को Cloud SQL डेटाबेस पर ले जाया जा सके.
  • –सेवा-खाता: Cloud Run डिप्लॉयमेंट को सेवा खाते से जोड़ता है. इसके तहत, इस कोडलैब की शुरुआत में बनाए गए Cloud SQL डेटाबेस से कनेक्ट करने की अनुमतियां दी जाती हैं.
  • –पुष्टि नहीं किए गए अनुरोधों को अनुमति दें: पुष्टि नहीं किए गए अनुरोधों को अनुमति देता है, ताकि ऐप्लिकेशन को इंटरनेट से ऐक्सेस किया जा सके.
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 डेटाबेस से कनेक्ट कर सकता है.

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

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

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

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

gcloud projects delete ${GOOGLE_CLOUD_PROJECT}