Cloud Run से Private CloudSQL से कनेक्ट करना

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

इस लैब में, Cymbal Eats मेन्यू सेवा बनाई जाएगी. इसमें, मेन्यू आइटम जोड़ने, अपडेट करने, मिटाने, और उनकी सूची देखने के लिए, RESTful एपीआई दिखाए जाएंगे. मेन्यू सेवा के लिए, Cloud SQL डेटाबेस को बैकएंड डेटाबेस के तौर पर बनाया जाएगा. यह Cloud Run में चलेगा. Cloud Run, Cloud SQL डेटाबेस वाले VPC में नहीं होता. इसलिए, आपको सर्वर के बिना VPC ऐक्सेस करने की सुविधा का कनेक्टर कॉन्फ़िगर करना होगा. इससे, Cloud Run, निजी आईपी पते के ज़रिए Cloud SQL से कम्यूनिकेट कर पाएगा.

19c7b05f35789fda.png

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

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

  • प्राइवेट वीपीसी नेटवर्क कॉन्फ़िगर करना
  • प्राइवेट Postgres Cloud SQL डेटाबेस बनाना
  • Cloud Run को प्राइवेट वीपीसी से कनेक्ट करना
  • Cloud Run पर कोई ऐसी सेवा डिप्लॉय करना जो Cloud SQL डेटाबेस से कनेक्ट होती हो

2. सेटअप और ज़रूरी शर्तें

अपनी रफ़्तार से चलने वाले एनवायरमेंट का सेटअप

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

b35bf95b8bf3d5d8.pnga99b7ace416376c4.pngbd84a6d3004737c5.png

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

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

  1. प्रोजेक्ट और संसाधन से जुड़े एनवायरमेंट वैरिएबल बनाना
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service

export SERVERLESS_VPC_CONNECTOR=cymbalconnector
export DB_INSTANCE_NAME=menu-catalog
export DB_INSTANCE_PASSWORD=password123
export DB_DATABASE=menu-db
export DB_USER=menu-user
export DB_PASSWORD=menupassword123
  1. क्लोन किए गए रिपॉज़िटरी पर जाएं और डायरेक्ट्री पर नेविगेट करें
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
  1. सेवाएं चालू करना
gcloud services enable \
    sqladmin.googleapis.com \
    run.googleapis.com \
    vpcaccess.googleapis.com \
    servicenetworking.googleapis.com

3. प्राइवेट ऐक्सेस कॉन्फ़िगर करना

प्राइवेट सेवाओं का ऐक्सेस, आपके वीपीसी नेटवर्क और Google Cloud के उस वीपीसी नेटवर्क के बीच वीपीसी पीयरिंग लिंक के तौर पर दिया जाता है जहां आपका Cloud SQL इंस्टेंस मौजूद है. प्राइवेट कनेक्शन की मदद से, आपके वीपीसी नेटवर्क में मौजूद वीएम इंस्टेंस और इस्तेमाल की जा रही सेवाओं के बीच, सिर्फ़ इंटरनल आईपी पतों के ज़रिए कम्यूनिकेट किया जा सकता है. प्राइवेट सेवाओं के ऐक्सेस के ज़रिए उपलब्ध सेवाओं को ऐक्सेस करने के लिए, वीएम इंस्टेंस को इंटरनेट कनेक्टिविटी या बाहरी आईपी पतों की ज़रूरत नहीं होती.

  1. कोई आईपी पता रेंज असाइन करना
gcloud compute addresses create google-managed-services-default \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=20 \
    --network=projects/$PROJECT_ID/global/networks/default

आउटपुट का उदाहरण

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-2-348215/global/addresses/google-managed-services-default].
  1. प्राइवेट कनेक्शन बनाना.
gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=google-managed-services-default \
    --network=default \
    --project=$PROJECT_ID

आउटपुट का उदाहरण

Operation "operations/pssn.p24-528514492617-2f2b507f-e4e5-4d53-a4de-9ddaceb4e92f" finished successfully.

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

Cloud SQL, पूरी तरह से मैनेज की गई डेटाबेस सेवा है. इसकी मदद से, क्लाउड में PostgreSQL और MySQL के मिलते-जुलते डेटाबेस को आसानी से सेट अप किया जा सकता है. साथ ही, उन्हें बनाए रखा जा सकता है, मैनेज किया जा सकता है, और सही तरीके से चलाया जा सकता है. हर Cloud SQL इंस्टेंस, वर्चुअल मशीन (वीएम) पर चलता है. यह वीएम, Google Cloud के होस्ट सर्वर पर चलता है. ज़्यादा उपलब्धता के विकल्प में, स्टैंडबाय वीएम भी शामिल होता है. यह वीएम, प्राइमरी वीएम की तरह ही सेटअप के साथ किसी दूसरे ज़ोन में मौजूद होता है. डेटाबेस को, स्केल किए जा सकने वाले और लंबे समय तक चलने वाले नेटवर्क स्टोरेज डिवाइस पर रखा जाता है. इसे परसिस्टेंट डिस्क कहा जाता है. यह वीएम से कनेक्ट होता है. हर वीएम को एक स्टैटिक आईपी पता असाइन किया जाता है. इससे यह पक्का किया जाता है कि Cloud SQL इंस्टेंस के चालू रहने के दौरान, ऐप्लिकेशन जिस आईपी पते से कनेक्ट होता है वह हमेशा एक ही रहे.

219cb722c2dd1b82.png

प्राइवेट आईपी पते के साथ, Postgres Cloud SQL डेटाबेस बनाया जाएगा.

डेटाबेस और उपयोगकर्ता बनाना

  1. प्राइवेट आईपी का इस्तेमाल करने के लिए, Postgres Cloud SQL इंस्टेंस बनाना
gcloud sql instances create $DB_INSTANCE_NAME \
    --project=$PROJECT_ID \
    --network=projects/$PROJECT_ID/global/networks/default \
    --no-assign-ip \
    --database-version=POSTGRES_12 \
    --cpu=2 \
    --memory=4GB \
    --region=$REGION \
    --root-password=${DB_INSTANCE_PASSWORD}

आउटपुट का उदाहरण

Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/cymbal1/instances/menu-instance].
NAME: menu-instance
DATABASE_VERSION: POSTGRES_12
LOCATION: us-east1-a
TIER: db-custom-2-4096
PRIMARY_ADDRESS: -
PRIVATE_ADDRESS: 10.8.80.5
STATUS: RUNNABLE
  1. डेटाबेस इंस्टेंस में कोई डेटाबेस जोड़ना
gcloud sql databases create $DB_DATABASE --instance=$DB_INSTANCE_NAME

आउटपुट का उदाहरण

Created database [menu-db].
instance: menu-catalog
name: menu-db
project: cymbal1
  1. एसक्यूएल उपयोगकर्ता बनाना
gcloud sql users create ${DB_USER} \
    --password=$DB_PASSWORD \
    --instance=$DB_INSTANCE_NAME

आउटपुट का उदाहरण

Created user [menu-user].
  1. डेटाबेस का आईपी पता सेव करना
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")
  1. Compute Engine के सेवा खाते में, Cloud SQL क्लाइंट की भूमिका जोड़ना
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/cloudsql.client"

आउटपुट का उदाहरण

Updated IAM policy for project [cymbal1].
[...]

5. सर्वर के बिना वीपीसी ऐक्सेस करने की सुविधा

सर्वर के बिना वीपीसी ऐक्सेस करने की सुविधा की मदद से, Cloud Run, App Engine या Cloud Functions जैसे सर्वर के बिना वाले एनवायरमेंट से, सीधे अपने वर्चुअल प्राइवेट क्लाउड नेटवर्क से कनेक्ट किया जा सकता है. सर्वर के बिना वीपीसी ऐक्सेस करने की सुविधा को कॉन्फ़िगर करने से, आपका सर्वर के बिना वाला एनवायरमेंट, इंटरनल डीएनएस और इंटरनल आईपी पतों (RFC 1918 और RFC 6598 के मुताबिक) का इस्तेमाल करके, आपके वीपीसी नेटवर्क को अनुरोध भेज सकता है. इन अनुरोधों के जवाब भी आपके इंटरनल नेटवर्क का इस्तेमाल करते हैं.

Cloud SQL से कनेक्ट करने के लिए, Cloud Run सेवा के लिए, सर्वर के बिना वीपीसी ऐक्सेस करने की सुविधा का कनेक्टर बनाया जाएगा.

19c7b05f35789fda.png

  1. Cloud SQL इंस्टेंस वाले वीपीसी नेटवर्क में, सर्वर के बिना वीपीसी ऐक्सेस करने की सुविधा का कनेक्टर बनाना.
gcloud compute networks vpc-access connectors create ${SERVERLESS_VPC_CONNECTOR} \
    --region=${REGION} \
    --range=10.8.0.0/28

आउटपुट का उदाहरण

Created connector [cymbalconnector].

6. Cloud Run पर डिप्लॉय किया जा रहा है

Cloud Run पर डॉकर इमेज बनाई और डिप्लॉय की जाएगी. साथ ही, Cloud SQL डेटाबेस को ऐक्सेस करने के लिए, Cloud Run को सर्वर के बिना वीपीसी कनेक्टर से कनेक्ट किया जाएगा.

  1. Maven का इस्तेमाल करके, ऐप्लिकेशन कंपाइल करना
./mvnw package -DskipTests

आउटपुट का उदाहरण

[...]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  42.864 s
[INFO] Finished at: 2022-04-28T16:15:33Z
[INFO] ------------------------------------------------------------------------
  1. डॉकर इमेज बनाना:
docker build -f src/main/docker/Dockerfile.jvm \
    --tag gcr.io/$PROJECT_NAME/menu-service .

आउटपुट का उदाहरण

[...]
Successfully built 4ef5d7a3befc
Successfully tagged gcr.io/cymbal1/menu-service:latest
  1. कंटेनर रजिस्ट्री में डॉकर इमेज पुश करना:
docker push gcr.io/$PROJECT_NAME/menu-service

आउटपुट का उदाहरण

Using default tag: latest
The push refers to repository [gcr.io/cymbalsql/menu-service]
17b374963800: Pushed
d9a51c06430d: Pushed
fff5d2a2cfc9: Pushed
f21fceb558c6: Pushed
5ffbbbf218dd: Pushed
60609ec85f86: Layer already exists
f2c4302f03b8: Layer already exists
latest: digest: sha256:f64cb7c288dbf4ad9b12bd210c23c5aec1048dee040450ff2d9dbdf96e83a426 size: 1789
  1. मेन्यू सेवा डिप्लॉय करना:
gcloud run deploy $MENU_SERVICE_NAME \
    --image=gcr.io/$PROJECT_NAME/menu-service:latest \
    --region $REGION \
    --allow-unauthenticated \
    --set-env-vars DB_USER=$DB_USER \
    --set-env-vars DB_PASS=$DB_PASSWORD \
    --set-env-vars DB_DATABASE=$DB_DATABASE \
    --set-env-vars DB_HOST=$DB_INSTANCE_IP \
    --vpc-connector $SERVERLESS_VPC_CONNECTOR \
    --project=$PROJECT_ID \
    --quiet

आउटपुट का उदाहरण

[...]
Done.
Service [menu-service] revision [menu-service-00002-xox] has been deployed and is serving 100 percent of traffic.
Service URL: https://menu-service-g2mfphytdq-uk.a.run.app

Google का सुझाव है कि SQL क्रेडेंशियल जैसी संवेदनशील जानकारी सेव करने के लिए, Secret Manager का इस्तेमाल करें. सीक्रेट को एनवायरमेंट वैरिएबल के तौर पर पास किया जा सकता है या Cloud Run के साथ वॉल्यूम के तौर पर माउंट किया जा सकता है.

  1. मेन्यू सेवा का यूआरएल सेव करना:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. मेन्यू सेवा के यूआरएल की पुष्टि करना
echo $MENU_SERVICE_URL

आउटपुट का उदाहरण

https://menu-service-g2mfphytdq-uk.a.run.app

7. सेवा की जांच करना

  1. POST अनुरोध भेजकर, नया मेन्यू आइटम बनाना:
curl -X POST "${MENU_SERVICE_URL}/menu" \
  -H 'Content-Type: application/json' \
  -d '{
       "itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
       "itemName": "Curry Plate",
       "itemPrice": 12.5,
       "itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
       "spiceLevel": 3,
       "status": "Ready",
       "tagLine": "Spicy touch for your taste buds!!"
   }'

आउटपुट का उदाहरण

{
    "id": 16,
    "createDateTime": "2022-04-28T18:14:04.17225",
    "itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "itemName": "Curry Plate",
    "itemPrice": 12.5,
    "itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "spiceLevel": 3,
    "status": "Processing",
    "tagLine": "Spicy touch for your taste buds!!",
    "updateDateTime": "2022-04-28T18:14:04.172298"
}
  1. PUT अनुरोध भेजकर, मेन्यू आइटम का स्टेटस बदलना:
curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Ready"}'

आउटपुट का उदाहरण

{
    "id": 1,
    "createDateTime": "2022-04-28T17:21:02.369093",
    "itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "itemName": "Curry Plate",
    "itemPrice": 12.50,
    "itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "spiceLevel": 0,
    "status": "Ready",
    "tagLine": "Spicy touch for your taste buds!!",
    "updateDateTime": "2022-04-28T17:21:02.657636"
}

8. बधाई हो!

बधाई हो, आपने यह कोडलैब पूरा कर लिया है!

इसके बाद:

Cymbal Eats के अन्य कोडलैब देखें:

स्टोरेज में जगह बनाएं

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

प्रोजेक्ट मिटाना

बिलिंग से बचने का सबसे आसान तरीका है कि ट्यूटोरियल के लिए बनाया गया प्रोजेक्ट मिटा दिया जाए.