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

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

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

19c7b05f35789fda.png

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

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

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

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

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

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

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