PostgreSQL ডাটাবেসের জন্য একটি ক্লাউড এসকিউএল-এ ক্লাউড রানে একটি গো অ্যাপ্লিকেশন কীভাবে সংযুক্ত করবেন

1. ওভারভিউ

ক্লাউড এসকিউএল গো সংযোগকারী হল আপনার গো অ্যাপ্লিকেশনটিকে আপনার ক্লাউড SQL ডাটাবেসের সাথে নিরাপদে সংযুক্ত করার সবচেয়ে সহজ উপায়। ক্লাউড রান হল একটি সম্পূর্ণরূপে পরিচালিত সার্ভারহীন প্ল্যাটফর্ম যা আপনাকে HTTP অনুরোধের মাধ্যমে আবেদনযোগ্য স্টেটলেস কন্টেনার চালাতে সক্ষম করে। এই কোডল্যাব প্রদর্শন করবে কিভাবে IAM প্রমাণীকরণ ব্যবহার করে একটি পরিষেবা অ্যাকাউন্টের সাথে PostgreSQL ডাটাবেসের জন্য একটি ক্লাউড এসকিউএল-এর সাথে ক্লাউড রানে একটি গো অ্যাপ্লিকেশন সংযুক্ত করা যায়।

যা শিখবেন

এই ল্যাবে, আপনি নিম্নলিখিতগুলি কীভাবে করবেন তা শিখবেন:

  • PostgreSQL ডাটাবেসের জন্য একটি ক্লাউড SQL তৈরি করুন
  • ক্লাউড রানে একটি গো অ্যাপ্লিকেশন স্থাপন করুন
  • Go Connector ব্যবহার করে আপনার অ্যাপ্লিকেশনটিকে Cloud SQL-এ সংযুক্ত করুন

পূর্বশর্ত

  • এই ল্যাবটি ক্লাউড কনসোল এবং ক্লাউড শেল পরিবেশের সাথে পরিচিতি অনুমান করে।

2. আপনি শুরু করার আগে

ক্লাউড প্রজেক্ট সেটআপ

  1. Google ক্লাউড কনসোলে সাইন-ইন করুন এবং একটি নতুন প্রকল্প তৈরি করুন বা বিদ্যমান একটি পুনরায় ব্যবহার করুন৷ আপনার যদি ইতিমধ্যে একটি Google অ্যাকাউন্ট না থাকে তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে৷

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • প্রকল্পের নাম এই প্রকল্পের অংশগ্রহণকারীদের জন্য প্রদর্শনের নাম। এটি একটি অক্ষর স্ট্রিং যা Google API দ্বারা ব্যবহৃত হয় না। আপনি যে কোনো সময় এটি আপডেট করতে পারেন.
  • প্রোজেক্ট আইডি সমস্ত Google ক্লাউড প্রোজেক্ট জুড়ে অনন্য এবং অপরিবর্তনীয় (সেট করার পরে পরিবর্তন করা যাবে না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত আপনি এটা কি যত্ন না. বেশিরভাগ কোডল্যাবে, আপনাকে প্রজেক্ট আইডি উল্লেখ করতে হবে (এটি সাধারণত PROJECT_ID হিসাবে চিহ্নিত করা হয়)। আপনি যদি জেনারেট করা আইডি পছন্দ না করেন, তাহলে আপনি অন্য এলোমেলো আইডি তৈরি করতে পারেন। বিকল্পভাবে, আপনি নিজের চেষ্টা করে দেখতে পারেন এবং এটি উপলব্ধ কিনা। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রকল্পের সময়কালের জন্য থাকবে।
  • আপনার তথ্যের জন্য, একটি তৃতীয় মান রয়েছে, একটি প্রকল্প নম্বর যা কিছু API ব্যবহার করে। ডকুমেন্টেশনে এই তিনটি মান সম্পর্কে আরও জানুন।
  1. এরপরে, ক্লাউড রিসোর্স/এপিআই ব্যবহার করতে আপনাকে ক্লাউড কনসোলে বিলিং সক্ষম করতে হবে। এই কোডল্যাবের মাধ্যমে চালানোর জন্য খুব বেশি খরচ করা উচিত নয়, যদি কিছু থাকে। রিসোর্স বন্ধ করতে যাতে এই টিউটোরিয়ালের বাইরে আপনার বিলিং খরচ না হয়, আপনি আপনার তৈরি করা রিসোর্স মুছে ফেলতে পারেন বা পুরো প্রোজেক্ট মুছে ফেলতে পারেন। Google ক্লাউডের নতুন ব্যবহারকারীরা $300 USD বিনামূল্যের ট্রায়াল প্রোগ্রামের জন্য যোগ্য৷

পরিবেশ সেটআপ

অনুসন্ধান বারের ডানদিকে আইকনে ক্লিক করে ক্লাউড শেল সক্রিয় করুন।

ecdc43ada29e91b.png

ক্লাউড শেল থেকে, 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.

3. একটি পরিষেবা অ্যাকাউন্ট সেট আপ করুন৷

ক্লাউড রান দ্বারা ব্যবহার করার জন্য একটি Google ক্লাউড পরিষেবা অ্যাকাউন্ট তৈরি এবং কনফিগার করুন যাতে এটি ক্লাউড SQL এর সাথে সংযোগ করার জন্য সঠিক অনুমতি পায়৷

  1. একটি নতুন পরিষেবা অ্যাকাউন্ট তৈরি করতে নিম্নরূপ gcloud iam service-accounts create কমান্ড চালান:
    gcloud iam service-accounts create quickstart-service-account \
      --display-name="Quickstart Service Account"
    
  2. আপনি এইমাত্র তৈরি করা Google ক্লাউড পরিষেবা অ্যাকাউন্টে ক্লাউড SQL ক্লায়েন্ট ভূমিকা যোগ করতে নিম্নোক্তভাবে gcloud প্রকল্পের add-iam-policy-binding কমান্ডটি চালান। ক্লাউড শেলে, অভিব্যক্তি ${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 ক্লাউড পরিষেবা অ্যাকাউন্টে ক্লাউড এসকিউএল ইন্সট্যান্স ব্যবহারকারীর ভূমিকা যোগ করতে নিচের মতো gcloud প্রোজেক্ট অ্যাড-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 ক্লাউড পরিষেবা অ্যাকাউন্টে লগ রাইটার ভূমিকা যোগ করতে নিম্নরূপ gcloud প্রজেক্ট অ্যাড-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. ক্লাউড এসকিউএল সেট আপ করুন

একটি ক্লাউড এসকিউএল ইনস্ট্যান্স তৈরি করতে gcloud sql instances create কমান্ডটি চালান।

  • -ডাটাবেস-সংস্করণ : ডাটাবেস ইঞ্জিনের ধরন এবং সংস্করণ। অনির্দিষ্ট থাকলে, API ডিফল্ট ব্যবহার করা হয়। বর্তমান উপলব্ধ সংস্করণগুলি দেখতে gcloud ডাটাবেস সংস্করণ ডকুমেন্টেশন দেখুন।
  • -cpu : মেশিনে কাঙ্খিত কোরের সংখ্যা।
  • -মেমরি : মেশিনে কত মেমরি কাঙ্ক্ষিত তা নির্দেশ করে পুরো সংখ্যার মান। একটি আকারের ইউনিট প্রদান করা উচিত (উদাহরণস্বরূপ, 3072MB বা 9GB)। যদি কোনো ইউনিট নির্দিষ্ট করা না থাকে, তাহলে GB ধরে নেওয়া হয়।
  • -অঞ্চল : উদাহরণের আঞ্চলিক অবস্থান (উদাহরণস্বরূপ: us-central1, asia-east1, us-east1)।
  • -ডেটাবেস-পতাকা : পতাকা সেট করার অনুমতি দেয়। এই ক্ষেত্রে, আমরা আগে তৈরি করা পরিষেবা অ্যাকাউন্ট ব্যবহার করে ক্লাউড এসকিউএল-এর সাথে সংযোগ করতে ক্লাউড রানকে সক্ষম করতে 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 মধ্যে একটি ক্লাউড এসকিউএল ডাটাবেস তৈরি করতে 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. আবেদন প্রস্তুত করুন

একটি গো অ্যাপ্লিকেশন প্রস্তুত করুন যা HTTP অনুরোধে সাড়া দেয়।

  1. ক্লাউড শেলে helloworld নামে একটি নতুন ডিরেক্টরি তৈরি করুন, তারপর সেই ডিরেক্টরিতে পরিবর্তন করুন:
    mkdir helloworld
    cd helloworld
    
  2. একটি নতুন গো অ্যাপ্লিকেশন আরম্ভ করতে go mod init চালান।
    go mod init github.com/GoogleCloudPlatform/golang-samples/run/helloworld
    
  3. ক্লাউড এসকিউএল গো সংযোগকারী নির্ভরতা ইনস্টল করুন।
    go get cloud.google.com/go/cloudsqlconn
    go get cloud.google.com/go/cloudsqlconn/postgres/pgxv4
    
  4. অ্যাপ্লিকেশন কোড সহ একটি main.go ফাইল তৈরি করুন। এই কোড করতে সক্ষম:
    • HTTP অনুরোধ গ্রহণ করুন
    • ডাটাবেসের সাথে সংযোগ করুন
    • ডাটাবেসে HTTP অনুরোধের সময় সংরক্ষণ করুন
    • শেষ পাঁচটি অনুরোধের সময় ফেরত দিন
    ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
    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
    

এই কোডটি একটি মৌলিক ওয়েব সার্ভার তৈরি করে যা পোর্ট পরিবেশ পরিবর্তনশীল দ্বারা সংজ্ঞায়িত পোর্টে শোনে। অ্যাপ্লিকেশন এখন স্থাপন করার জন্য প্রস্তুত.

6. ক্লাউড রান অ্যাপ্লিকেশন স্থাপন করুন

আপনার অ্যাপ্লিকেশন স্থাপন করতে নীচের কমান্ডটি চালান:

  • -অঞ্চল : উদাহরণের আঞ্চলিক অবস্থান (উদাহরণস্বরূপ: us-central1, asia-east1, us-east1)।
  • -উৎস : সোর্স কোড স্থাপন করা হবে। এই ক্ষেত্রে, . বর্তমান ফোল্ডারে সোর্স কোড বোঝায় helloworld .
  • –set-env-vars : ক্লাউড এসকিউএল ডাটাবেসে অ্যাপ্লিকেশনটিকে নির্দেশ করতে অ্যাপ্লিকেশন দ্বারা ব্যবহৃত পরিবেশের ভেরিয়েবল সেট করে।
  • -সার্ভিস-অ্যাকাউন্ট : এই কোডল্যাবের শুরুতে তৈরি করা ক্লাউড এসকিউএল ডাটাবেসের সাথে সংযোগ করার অনুমতি সহ ক্লাউড রান ডিপ্লোয়মেন্টকে পরিষেবা অ্যাকাউন্টের সাথে সংযুক্ত করে।
  • -অনুমোদিত-অপ্রমাণিত : অননুমোদিত অনুরোধগুলিকে অনুমতি দেয় যাতে অ্যাপ্লিকেশনটি ইন্টারনেট থেকে অ্যাক্সেসযোগ্য হয়।
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 হিসাবে পাঁচটি সাম্প্রতিক ভিজিট দেখতে পাবেন।

7. অভিনন্দন

আপনি ক্লাউড রানে একটি গো অ্যাপ্লিকেশন স্থাপন করেছেন যা ক্লাউড এসকিউএল-এ চলমান একটি PostgreSQL ডাটাবেসের সাথে সংযোগ করতে সক্ষম।

আমরা যা কভার করেছি:

  • PostgreSQL ডাটাবেসের জন্য একটি ক্লাউড SQL তৈরি করা
  • ক্লাউড রানে একটি গো অ্যাপ্লিকেশন স্থাপন করা হচ্ছে
  • Go Connector ব্যবহার করে আপনার অ্যাপ্লিকেশনটিকে Cloud SQL এর সাথে সংযুক্ত করা হচ্ছে

পরিষ্কার করুন

এই টিউটোরিয়ালে ব্যবহৃত সংস্থানগুলির জন্য আপনার Google ক্লাউড অ্যাকাউন্টে চার্জ এড়াতে, হয় সংস্থানগুলি রয়েছে এমন প্রকল্পটি মুছুন, অথবা প্রকল্পটি রাখুন এবং পৃথক সংস্থানগুলি মুছুন৷ আপনি যদি পুরো প্রকল্পটি মুছতে চান, আপনি চালাতে পারেন:

gcloud projects delete ${GOOGLE_CLOUD_PROJECT}