Cloud Run पर सुरक्षित रूप से डिप्लॉय करना

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

इस लैब में, Cloud Run पर किसी सेवा को डिप्लॉय करने के डिफ़ॉल्ट चरणों में बदलाव किया जाएगा, ताकि सुरक्षा को बेहतर बनाया जा सके. इसके बाद, यह देखा जाएगा कि डिप्लॉय किए गए ऐप्लिकेशन को सुरक्षित तरीके से कैसे ऐक्सेस किया जाए. यह ऐप्लिकेशन, Cymbal Eats ऐप्लिकेशन की "पार्टनर रजिस्ट्रेशन सेवा" है. इसका इस्तेमाल वे कंपनियां करती हैं जो Cymbal Eats के साथ मिलकर, खाने के ऑर्डर प्रोसेस करती हैं.

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

Cloud Run पर किसी ऐप्लिकेशन को डिप्लॉय करने के लिए, डिफ़ॉल्ट रूप से कुछ ज़रूरी चरण होते हैं. इनमें कुछ छोटे-छोटे बदलाव करके, ऐप्लिकेशन की सुरक्षा को काफ़ी हद तक बढ़ाया जा सकता है. आपको किसी मौजूदा ऐप्लिकेशन और डिप्लॉयमेंट के निर्देशों का इस्तेमाल करके, डिप्लॉयमेंट के चरणों में बदलाव करना होगा. इससे डिप्लॉय किए गए ऐप्लिकेशन की सुरक्षा को बेहतर बनाया जा सकेगा.

इसके बाद, आपको ऐप्लिकेशन को ऐक्सेस करने की अनुमति देने और अनुमति वाले अनुरोध करने का तरीका दिखेगा..

यह ऐप्लिकेशन डिप्लॉयमेंट की सुरक्षा के बारे में पूरी जानकारी नहीं है. इसके बजाय, इसमें उन बदलावों के बारे में बताया गया है जिन्हें आने वाले समय में डिप्लॉय किए जाने वाले सभी ऐप्लिकेशन में किया जा सकता है. इससे, ऐप्लिकेशन की सुरक्षा को बेहतर बनाने में मदद मिलेगी.

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 डॉलर का क्रेडिट मिलता है.

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें 853e55310c205094.png पर क्लिक करें.

55efc1aaa7a4d3ad.png

अगर आपने पहले कभी Cloud Shell का इस्तेमाल नहीं किया है, तो आपको एक इंटरमीडिएट स्क्रीन दिखेगी. इसमें Cloud Shell के बारे में जानकारी दी गई होगी. अगर ऐसा है, तो जारी रखें पर क्लिक करें. इसके बाद, आपको यह स्क्रीन कभी नहीं दिखेगी. एक बार दिखने वाली स्क्रीन ऐसी दिखती है:

9c92662c6a846a5c.png

Cloud Shell से कनेक्ट होने में कुछ ही सेकंड लगेंगे.

9f0e51b578fecce5.png

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल पहले से मौजूद होते हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है और Google Cloud में चलता है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती है. इस कोडलैब में ज़्यादातर काम, सिर्फ़ ब्राउज़र या Chromebook की मदद से किया जा सकता है.

Cloud Shell से कनेक्ट होने के बाद, आपको दिखेगा कि आपकी पुष्टि पहले ही हो चुकी है और प्रोजेक्ट को आपके प्रोजेक्ट आईडी पर पहले ही सेट कर दिया गया है.

  1. पुष्टि करें कि आपने Cloud Shell में पुष्टि कर ली है. इसके लिए, यह कमांड चलाएं:
gcloud auth list

कमांड आउटपुट

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. यह पुष्टि करने के लिए कि gcloud कमांड को आपके प्रोजेक्ट के बारे में पता है, Cloud Shell में यह कमांड चलाएं:
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो इस कमांड का इस्तेमाल करके इसे सेट किया जा सकता है:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

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

इस लैब के लिए, Cloud Shell की कमांड लाइन में कमांड चलाई जाएंगी. आम तौर पर, कमांड को कॉपी करके चिपकाया जा सकता है. हालांकि, कुछ मामलों में आपको प्लेसहोल्डर की वैल्यू को सही वैल्यू में बदलना होगा.

  1. बाद की कमांड में इस्तेमाल करने के लिए, प्रोजेक्ट आईडी के लिए एनवायरमेंट वैरिएबल सेट करें:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export SERVICE_NAME=partner-registration-service
  1. Cloud Run service API चालू करें. यह आपके ऐप्लिकेशन को चलाएगा. साथ ही, Firestore API चालू करें. यह NoSQL डेटा स्टोरेज की सुविधा देगा. इसके अलावा, Cloud Build API चालू करें. इसका इस्तेमाल डिप्लॉयमेंट कमांड के लिए किया जाएगा. साथ ही, Artifact Registry चालू करें. इसका इस्तेमाल ऐप्लिकेशन कंटेनर को होल्ड करने के लिए किया जाएगा:
gcloud services enable \
  run.googleapis.com \
  firestore.googleapis.com \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com
  1. नेटिव मोड में Firestore डेटाबेस शुरू करें. यह कमांड, App Engine API का इस्तेमाल करती है. इसलिए, इसे पहले चालू करना होगा.

कमांड में App Engine के लिए एक क्षेत्र तय करना होगा. हम इसका इस्तेमाल नहीं करेंगे, लेकिन हमें इसे पुराने डेटा के लिए बनाना होगा. साथ ही, डेटाबेस के लिए एक क्षेत्र तय करना होगा. हम App Engine के लिए us-central और डेटाबेस के लिए nam5 का इस्तेमाल करेंगे. nam5, अमेरिका के एक से ज़्यादा इलाकों में मौजूद है. एक से ज़्यादा क्षेत्रों में डेटाबेस को डिप्लॉय करने से, डेटाबेस की उपलब्धता और टिकाऊपन को बढ़ाया जा सकता है.

gcloud services enable appengine.googleapis.com

gcloud app create --region=us-central
gcloud firestore databases create --region=nam5
  1. सेंपल ऐप्लिकेशन की रिपॉज़िटरी क्लोन करें और डायरेक्ट्री पर जाएं
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git

cd cymbal-eats/partner-registration-service

3. README फ़ाइल देखें

एडिटर खोलें और ऐप्लिकेशन में शामिल फ़ाइलों को देखें. README.md देखें. इसमें इस ऐप्लिकेशन को डिप्लॉय करने के लिए ज़रूरी चरणों के बारे में बताया गया है. इनमें से कुछ चरणों में, सुरक्षा से जुड़े फ़ैसले शामिल हो सकते हैं. आपको इनमें से कुछ विकल्पों में बदलाव करना होगा, ताकि डिप्लॉय किए गए ऐप्लिकेशन की सुरक्षा को बेहतर बनाया जा सके. इसके बारे में यहां बताया गया है:

तीसरा चरण - npm install को रन करना

किसी ऐप्लिकेशन में इस्तेमाल किए गए तीसरे पक्ष के सॉफ़्टवेयर की उत्पत्ति और अखंडता के बारे में जानना ज़रूरी है. सॉफ़्टवेयर सप्लाई चेन की सुरक्षा को मैनेज करना, किसी भी सॉफ़्टवेयर को बनाने के लिए ज़रूरी है. यह सिर्फ़ Cloud Run पर डिप्लॉय किए गए ऐप्लिकेशन के लिए ज़रूरी नहीं है. इस लैब में डिप्लॉयमेंट पर फ़ोकस किया गया है. इसलिए, इसमें इस बारे में जानकारी नहीं दी गई है. हालांकि, इस विषय पर अलग से रिसर्च की जा सकती है.

चौथा और पांचवां चरण - बदलाव करना और चलाना deploy.sh

इन चरणों से, ऐप्लिकेशन को Cloud Run पर डिप्लॉय किया जाता है. इसमें ज़्यादातर विकल्पों को डिफ़ॉल्ट पर छोड़ दिया जाता है. इस चरण में बदलाव करके, डिप्लॉयमेंट को दो मुख्य तरीकों से ज़्यादा सुरक्षित बनाया जाएगा:

  1. बिना पुष्टि किए ऐक्सेस करने की अनुमति दें. एक्सप्लोरेशन के दौरान, चीज़ों को आज़माने के लिए इसकी अनुमति देना आसान हो सकता है. हालांकि, यह कमर्शियल पार्टनर के इस्तेमाल के लिए एक वेब सेवा है. इसलिए, इसे हमेशा अपने उपयोगकर्ताओं की पुष्टि करनी चाहिए.
  2. यह बताएं कि ऐप्लिकेशन को एक खास सेवा खाते का इस्तेमाल करना होगा. इस खाते में सिर्फ़ ज़रूरी अनुमतियां होंगी. इसके बजाय, डिफ़ॉल्ट खाते का इस्तेमाल नहीं किया जा सकता, क्योंकि इसमें ज़रूरत से ज़्यादा एपीआई और संसाधन का ऐक्सेस होगा. इसे कम से कम अधिकारों का सिद्धांत कहा जाता है. यह ऐप्लिकेशन की सुरक्षा का बुनियादी सिद्धांत है.

छठा से ग्यारहवां चरण - सही तरीके से काम करने की पुष्टि करने के लिए, वेब के सैंपल अनुरोध करें

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

4. सेवा को सुरक्षित तरीके से डिप्लॉय करना

deploy.sh स्क्रिप्ट में दो बदलावों की ज़रूरत है: बिना पुष्टि किए ऐक्सेस की अनुमति नहीं देना और कम से कम अनुमतियों वाला कोई खास सेवा खाता इस्तेमाल करना.

सबसे पहले, आपको एक नया सेवा खाता बनाना होगा. इसके बाद, उस सेवा खाते का रेफ़रंस देने के लिए, deploy.sh स्क्रिप्ट में बदलाव करना होगा. साथ ही, बिना पुष्टि किए ऐक्सेस को अनुमति नहीं देनी होगी. इसके बाद, सेवा को डिप्लॉय करने के लिए, बदली गई स्क्रिप्ट को चलाना होगा. इससे पहले कि हम बदली गई deploy.sh स्क्रिप्ट को चला सकें.

एक सेवा खाता बनाएं और उसे Firestore/Datastore का ज़रूरी ऐक्सेस दें

gcloud iam service-accounts create partner-sa

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:partner-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role=roles/datastore.user

deploy.sh में बदलाव करें

deploy.sh फ़ाइल में बदलाव करके, बिना पुष्टि किए ऐक्सेस करने की अनुमति न दें(–no-allow-unauthenticated). साथ ही, डिप्लॉय किए गए ऐप्लिकेशन के लिए नया सेवा खाता(–service-account) तय करें. GOOGLE_PROJECT_ID को अपने प्रोजेक्ट के आईडी के तौर पर सही करें.

आपको पहली दो लाइनें मिटानी होंगी. साथ ही, नीचे दिखाए गए तरीके से तीन अन्य लाइनों में बदलाव करना होगा.

gcloud run deploy $SERVICE_NAME \
  --source . \
  --platform managed \
  --region ${REGION} \
  --no-allow-unauthenticated \
  --project=$PROJECT_ID \
  --service-account=partner-sa@${PROJECT_ID}.iam.gserviceaccount.com

सेवा को डिप्लॉय करना

कमांड लाइन से, deploy.sh स्क्रिप्ट चलाएं:

./deploy.sh

डप्लॉयमेंट पूरा होने के बाद, कमांड आउटपुट की आखिरी लाइन में नए ऐप्लिकेशन का सेवा यूआरएल दिखेगा. यूआरएल को एनवायरमेंट वैरिएबल में सेव करें:

export SERVICE_URL=<URL from last line of command output>

अब curl टूल का इस्तेमाल करके, ऐप्लिकेशन से कोई ऑर्डर फ़ेच करने की कोशिश करें:

curl -i -X GET $SERVICE_URL/partners

curl कमांड के लिए -i फ़्लैग, इसे आउटपुट में रिस्पॉन्स हेडर शामिल करने के लिए कहता है. आउटपुट की पहली लाइन यह होनी चाहिए:

HTTP/2 403

ऐप्लिकेशन को ऐसे अनुरोधों को अनुमति न देने के विकल्प के साथ डिप्लॉय किया गया था जिनकी पुष्टि नहीं हुई है. इस कर्ल कमांड में पुष्टि करने की कोई जानकारी नहीं है. इसलिए, Cloud Run ने इसे अस्वीकार कर दिया है. असल में डिप्लॉय किया गया ऐप्लिकेशन, इस अनुरोध से न तो चलता है और न ही कोई डेटा पाता है.

5. पुष्टि किए गए अनुरोध करना

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

Authorization: Bearer identity-token

पहचान टोकन, कम समय के लिए इस्तेमाल किया जाने वाला, क्रिप्टोग्राफ़िक तरीके से हस्ताक्षर किया गया, और एन्कोड किया गया स्ट्रिंग होता है. इसे पुष्टि करने वाली भरोसेमंद सेवा देने वाली कंपनी जारी करती है. इस मामले में, Google से जारी किया गया ऐसा आइडेंटिटी टोकन ज़रूरी है जिसकी समयसीमा खत्म न हुई हो और जो मान्य हो.

अपने उपयोगकर्ता खाते से अनुरोध करना

Google Cloud CLI टूल, पुष्टि किए गए डिफ़ॉल्ट उपयोगकर्ता के लिए टोकन उपलब्ध करा सकता है. अपने खाते के लिए आइडेंटिटी टोकन पाने के लिए, यह कमांड चलाएं और इसे ID_TOKEN एनवायरमेंट वैरिएबल में सेव करें:

export ID_TOKEN=$(gcloud auth print-identity-token)

डिफ़ॉल्ट रूप से, Google की ओर से जारी किए गए आइडेंटिटी टोकन एक घंटे के लिए मान्य होते हैं. यहां दी गई curl कमांड चलाकर, वह अनुरोध करें जिसे पहले अस्वीकार कर दिया गया था. ऐसा इसलिए हुआ था, क्योंकि उसे अनुमति नहीं मिली थी. इस कमांड में ज़रूरी हेडर शामिल होगा:

curl -i -X GET $SERVICE_URL/partners \
  -H "Authorization: Bearer $ID_TOKEN"

कमांड का आउटपुट HTTP/2 200 से शुरू होना चाहिए. इससे पता चलता है कि अनुरोध स्वीकार कर लिया गया है और उसे पूरा किया जा रहा है. (अगर एक घंटे बाद इस अनुरोध को फिर से भेजा जाता है, तो यह पूरा नहीं होगा. ऐसा इसलिए होगा, क्योंकि टोकन की समयसीमा खत्म हो जाएगी.) जवाब का मुख्य हिस्सा, आउटपुट के आखिर में मौजूद होता है. यह एक खाली लाइन के बाद दिखता है:

{"status":"success","data":[]}

फ़िलहाल, कोई पार्टनर नहीं है.

डाइरेक्ट्री में मौजूद JSON डेटा के सैंपल का इस्तेमाल करके, पार्टनर रजिस्टर करें. इसके लिए, दो curl कमांड का इस्तेमाल करें:

curl -X POST \
  -H "Authorization: Bearer $ID_TOKEN" \
  -H "Content-Type: application/json" \
  -d "@example-partner.json" \
  $SERVICE_URL/partner

और

curl -X POST \
  -H "Authorization: Bearer $ID_TOKEN" \
  -H "Content-Type: application/json" \
  -d "@example-partner2.json" \
  $SERVICE_URL/partner

अब रजिस्टर किए गए सभी पार्टनर देखने के लिए, पहले किए गए GET अनुरोध को दोहराएं:

curl -i -X GET $SERVICE_URL/partners \
  -H "Authorization: Bearer $ID_TOKEN"

आपको JSON डेटा में ज़्यादा कॉन्टेंट दिखेगा. इसमें रजिस्टर किए गए दोनों पार्टनर के बारे में जानकारी होगी.

बिना अनुमति वाले खाते के तौर पर अनुरोध करना

पिछले चरण में पुष्टि किया गया अनुरोध इसलिए पूरा हुआ, क्योंकि उसकी पुष्टि की गई थी. साथ ही, पुष्टि किए गए उपयोगकर्ता (आपका खाता) को अनुमति दी गई थी. इसका मतलब है कि खाते को ऐप्लिकेशन शुरू करने की अनुमति थी. हालांकि, पुष्टि किए गए सभी खातों को ऐसा करने की अनुमति नहीं होगी.

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

  1. tester नाम का सेवा खाता बनाएं.
gcloud iam service-accounts create tester
  1. आपको इस नए खाते के लिए भी उसी तरह पहचान टोकन मिलेगा जिस तरह आपको पहले अपने डिफ़ॉल्ट खाते के लिए मिला था. हालांकि, इसके लिए ज़रूरी है कि आपके डिफ़ॉल्ट खाते के पास, सेवा खातों के तौर पर काम करने की अनुमति हो. अपने खाते को यह अनुमति दें.
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="user:$USER_EMAIL" \
  --role=roles/iam.serviceAccountTokenCreator
  1. अब इस नए खाते के लिए, TEST_IDENTITY एनवायरमेंट वैरिएबल में आइडेंटिटी टोकन सेव करने के लिए, यहां दिया गया कमांड चलाएं. अगर कमांड में गड़बड़ी का मैसेज दिखता है, तो एक या दो मिनट इंतज़ार करें और फिर से कोशिश करें.
export TEST_TOKEN=$( \
  gcloud auth print-identity-token \
    --impersonate-service-account \
    "tester@$PROJECT_ID.iam.gserviceaccount.com" \
)
  1. पहले की तरह ही, पुष्टि किया गया वेब अनुरोध करें. हालांकि, इस बार इस आइडेंटिटी टोकन का इस्तेमाल करें:
curl -i -X GET $SERVICE_URL/partners \
  -H "Authorization: Bearer $TEST_TOKEN"

कमांड का आउटपुट फिर से HTTP/2 403 से शुरू होगा, क्योंकि अनुरोध की पुष्टि हो गई है, लेकिन उसे अनुमति नहीं मिली है. नए सेवा खाते के पास, इस ऐप्लिकेशन को शुरू करने की अनुमति नहीं है.

किसी खाते को अनुमति देना

किसी उपयोगकर्ता या सेवा खाते को Cloud Run सेवा से अनुरोध करने के लिए, उसके पास Cloud Run Invoker की भूमिका होनी चाहिए. टेस्टर सेवा खाते को यह भूमिका असाइन करने के लिए, यह कमांड इस्तेमाल करें:

export REGION=us-central1
gcloud run services add-iam-policy-binding ${SERVICE_NAME} \
  --member="serviceAccount:tester@$PROJECT_ID.iam.gserviceaccount.com" \
  --role=roles/run.invoker \
  --region=${REGION}

नई भूमिका के अपडेट होने के लिए एक या दो मिनट इंतज़ार करें. इसके बाद, पुष्टि किया गया अनुरोध फिर से भेजें. अगर TEST_TOKEN को पहली बार सेव किए हुए एक घंटा या उससे ज़्यादा हो गया है, तो नया TEST_TOKEN सेव करें.

curl -i -X GET $SERVICE_URL/partners \
  -H "Authorization: Bearer $TEST_TOKEN"

अब कमांड का आउटपुट HTTP/1.1 200 OK से शुरू होता है और आखिरी लाइन में JSON रिस्पॉन्स होता है. इस अनुरोध को Cloud Run ने स्वीकार कर लिया था और ऐप्लिकेशन ने इसे प्रोसेस किया था.

6. प्रोग्राम की पुष्टि करना बनाम उपयोगकर्ताओं की पुष्टि करना

अब तक आपने पुष्टि किए गए जो अनुरोध किए हैं उनमें curl कमांड लाइन टूल का इस्तेमाल किया गया है. इसके अलावा, अन्य टूल और प्रोग्रामिंग भाषाओं का भी इस्तेमाल किया जा सकता था. हालांकि, सामान्य वेब पेजों वाले वेब ब्राउज़र का इस्तेमाल करके, Cloud Run के लिए पुष्टि किए गए अनुरोध नहीं किए जा सकते. अगर कोई उपयोगकर्ता किसी वेब पेज में मौजूद किसी लिंक पर क्लिक करता है या फ़ॉर्म सबमिट करने के लिए किसी बटन पर क्लिक करता है, तो ब्राउज़र, Cloud Run के लिए ज़रूरी Authorization हेडर को नहीं जोड़ेगा. यह हेडर, पुष्टि किए गए अनुरोधों के लिए ज़रूरी होता है.

Cloud Run में पुष्टि करने की सुविधा, प्रोग्राम के लिए बनाई गई है. इसका इस्तेमाल असली उपयोगकर्ता नहीं कर सकते.

ध्यान दें:

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

आपने देखा होगा कि अब तक उदाहरण के तौर पर किए गए अनुरोधों के जवाब, वेब पेज के बजाय JSON ऑब्जेक्ट के तौर पर मिले हैं. ऐसा इसलिए है, क्योंकि पार्टनर रजिस्ट्रेशन की यह सेवा प्रोग्राम के इस्तेमाल के लिए है. साथ ही, JSON उनके लिए इस्तेमाल करने का एक आसान तरीका है. इसके बाद, आपको इस डेटा का इस्तेमाल करने के लिए एक प्रोग्राम लिखना होगा और उसे चलाना होगा.

Python प्रोग्राम से पुष्टि किए गए अनुरोध

कोई प्रोग्राम, स्टैंडर्ड एचटीटीपी वेब अनुरोधों के ज़रिए सुरक्षित Cloud Run ऐप्लिकेशन के लिए पुष्टि किए गए अनुरोध कर सकता है. हालांकि, इसमें Authorization हेडर शामिल करना होगा. इन प्रोग्राम के लिए, सिर्फ़ एक नई चुनौती है. वह यह है कि उन्हें उस हेडर में रखने के लिए, मान्य और समयसीमा खत्म न हुआ पहचान टोकन पाना होगा. Cloud Run, Google Cloud Identity and Access Management (IAM) का इस्तेमाल करके उस टोकन की पुष्टि करेगा. इसलिए, टोकन को IAM से मान्यता प्राप्त किसी संस्था को जारी और हस्ताक्षर करना होगा. क्लाइंट लाइब्रेरी कई भाषाओं में उपलब्ध हैं. प्रोग्राम इनका इस्तेमाल करके, इस तरह के टोकन जारी करने का अनुरोध कर सकते हैं. इस उदाहरण में, Python google.auth क्लाइंट लाइब्रेरी का इस्तेमाल किया जाएगा. वेब अनुरोध करने के लिए, Python की कई लाइब्रेरी उपलब्ध हैं. इस उदाहरण में, लोकप्रिय requests मॉड्यूल का इस्तेमाल किया गया है.

सबसे पहले, इन दो क्लाइंट लाइब्रेरी को इंस्टॉल करें:

pip install google-auth
pip install requests

डिफ़ॉल्ट उपयोगकर्ता के लिए आइडेंटिटी टोकन का अनुरोध करने वाला Python कोड यह है:

credentials, _ = google.auth.default()
credentials.refresh(google.auth.transport.requests.Request())
identity_token = credentials.id_token

अगर अपने कंप्यूटर पर Cloud Shell या स्टैंडर्ड टर्मिनल शेल जैसे कमांड शेल का इस्तेमाल किया जा रहा है, तो डिफ़ॉल्ट उपयोगकर्ता वह होता है जिसने उस शेल में पुष्टि की है. Cloud Shell में, आम तौर पर Google में लॉग इन किया गया उपयोगकर्ता होता है. अन्य मामलों में, यह वह उपयोगकर्ता होता है जिसने gcloud auth login या अन्य gcloud कमांड का इस्तेमाल करके पुष्टि की हो. अगर उपयोगकर्ता ने कभी लॉग इन नहीं किया है, तो कोई डिफ़ॉल्ट उपयोगकर्ता नहीं होगा और यह कोड काम नहीं करेगा.

किसी दूसरे प्रोग्राम से अनुरोध करने वाले प्रोग्राम के लिए, आम तौर पर किसी व्यक्ति की पहचान का इस्तेमाल नहीं किया जाता है. इसके बजाय, अनुरोध करने वाले प्रोग्राम की पहचान का इस्तेमाल किया जाता है. सेवा खातों का इस्तेमाल इसी काम के लिए किया जाता है. आपने Cloud Run सेवा को एक खास सेवा खाते के साथ डिप्लॉय किया है. यह सेवा खाता, एपीआई अनुरोध करते समय अपनी पहचान देता है. जैसे, Cloud Firestore को अनुरोध करते समय. जब कोई प्रोग्राम Google Cloud Platform पर चलता है, तो क्लाइंट लाइब्रेरी अपने-आप उस प्रोग्राम को असाइन किए गए सेवा खाते का इस्तेमाल डिफ़ॉल्ट पहचान के तौर पर करती हैं. इसलिए, प्रोग्राम का एक ही कोड दोनों स्थितियों में काम करता है.

Authorization हेडर जोड़कर अनुरोध करने के लिए, Python कोड यह है:

auth_header = {"Authorization": "Bearer " + identity_token}
response = requests.get(url, headers=auth_header)

यहां दिया गया पूरा Python प्रोग्राम, Cloud Run सेवा से पुष्टि किया गया अनुरोध करेगा. इससे सभी रजिस्टर्ड पार्टनर की जानकारी मिलेगी. इसके बाद, उनके नाम और असाइन किए गए आईडी प्रिंट किए जाएंगे. इस कोड को print_partners.py फ़ाइल में सेव करने के लिए, यहां दिए गए निर्देश को कॉपी करके चलाएं.

cat > ./print_partners.py << EOF
def print_partners():
    import google.auth
    import google.auth.transport.requests
    import requests

    credentials, _ = google.auth.default()
    credentials.refresh(google.auth.transport.requests.Request())
    identity_token = credentials.id_token

    auth_header = {"Authorization": "Bearer " + identity_token}
    response = requests.get("${SERVICE_URL}/partners", headers=auth_header)

    parsed_response = response.json()
    partners = parsed_response["data"]

    for partner in partners:
        print(f"{partner['partnerId']}: {partner['name']}")


print_partners()
EOF

इस प्रोग्राम को शेल कमांड की मदद से चलाया जाएगा. आपको पहले डिफ़ॉल्ट उपयोगकर्ता के तौर पर पुष्टि करनी होगी, ताकि प्रोग्राम उन क्रेडेंशियल का इस्तेमाल कर सके. यहां दिया गया gcloud auth कमांड चलाएं:

gcloud auth application-default login

लॉगिन करने के लिए, निर्देशों का पालन करें. इसके बाद, कमांड लाइन से प्रोग्राम चलाएं:

python print_partners.py

आउटपुट कुछ ऐसा दिखेगा:

10102: Zippy food delivery
67292: Foodful

प्रोग्राम का अनुरोध Cloud Run सेवा तक पहुंच गया है, क्योंकि इसकी पुष्टि आपकी पहचान से की गई थी. साथ ही, आपके पास इस प्रोजेक्ट का मालिकाना हक है. इसलिए, आपके पास इसे डिफ़ॉल्ट रूप से चलाने का अधिकार है. इस प्रोग्राम को सेवा खाते की पहचान के तहत चलाना ज़्यादा सामान्य होगा. Cloud Run या App Engine जैसे ज़्यादातर Google Cloud प्रॉडक्ट पर चलाने के दौरान, डिफ़ॉल्ट पहचान एक सेवा खाता होगी. इसका इस्तेमाल निजी खाते के बजाय किया जाएगा.

7. बधाई हो!

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

इसके बाद क्या होगा:

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

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

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

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

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