Python के साथ नमस्ते Cloud Run

1. परिचय

96d07289bb51daa7.png

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

इस ट्यूटोरियल का मकसद, एक सामान्य वेब ऐप्लिकेशन बनाना और उसे Cloud Run पर डिप्लॉय करना है.

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

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

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

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

Cloud Shell शुरू करें

Google Cloud को अपने लैपटॉप से रिमोटली ऑपरेट किया जा सकता है. हालांकि, इस ट्यूटोरियल में Cloud Shell का इस्तेमाल किया जाएगा. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.

Cloud Shell चालू करें

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

3c1dabeca90e44e5.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

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

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].

3. एपीआई चालू करना

Cloud Shell से, Artifact Registry, Cloud Build, और Cloud Run API चालू करें:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com

इससे, इस तरह का 'हो गया' मैसेज दिखता है:

Operation "operations/..." finished successfully.

अब आप काम शुरू करने और आवेदन लिखने के लिए तैयार हैं...

4. आवेदन लिखें

इस चरण में, एचटीटीपी अनुरोधों का जवाब देने वाला, Flask पर आधारित एक सामान्य Python ऐप्लिकेशन बनाया जाएगा.

वर्किंग डायरेक्ट्री

helloworld-python नाम की वर्किंग डायरेक्ट्री बनाने और उस पर स्विच करने के लिए, Cloud Shell का इस्तेमाल करें:

mkdir ~/helloworld-python
cd ~/helloworld-python

main.py

main.py नाम की फ़ाइल बनाएं:

touch main.py

अपनी पसंद के कमांड लाइन एडिटर (nano, vim या emacs) का इस्तेमाल करके फ़ाइल में बदलाव करें. इसके अलावा, Cloud Shell Editor बटन पर क्लिक करके भी बदलाव किया जा सकता है:

10af7b1a6240e9f4.gif

Cloud Shell Editor की मदद से फ़ाइल में सीधे तौर पर बदलाव करने के लिए, इस कमांड का इस्तेमाल करें:

cloudshell edit main.py

main.py

from flask import Flask, request

app = Flask(__name__)


@app.get("/")
def hello():
    """Return a friendly HTTP greeting."""
    who = request.args.get("who", default="World")
    return f"Hello {who}!\n"


if __name__ == "__main__":
    # Development only: run "python main.py" and open http://localhost:8080
    # When deploying to Cloud Run, a production-grade WSGI HTTP server,
    # such as Gunicorn, will serve the app.
    app.run(host="localhost", port=8080, debug=True)

यह कोड, एचटीटीपी GET अनुरोधों का जवाब देने वाली एक बुनियादी वेब सेवा बनाता है. इसमें लोगों को आसानी से समझ आने वाला मैसेज होता है.

requirements.txt

डिपेंडेंसी तय करने के लिए, requirements.txt नाम की फ़ाइल जोड़ें:

touch requirements.txt

Cloud Shell Editor की मदद से फ़ाइल में सीधे तौर पर बदलाव करने के लिए, इस कमांड का इस्तेमाल करें:

cloudshell edit requirements.txt

requirements.txt

# https://pypi.org/project/flask
Flask==3.0.2

# https://pypi.org/project/gunicorn
gunicorn==21.2.0

Procfile

आखिर में, Procfile नाम की फ़ाइल जोड़ें. इससे यह तय किया जा सकेगा कि ऐप्लिकेशन को कैसे दिखाया जाएगा:

touch Procfile

Cloud Shell Editor की मदद से फ़ाइल में सीधे तौर पर बदलाव करने के लिए, इस कमांड का इस्तेमाल करें:

cloudshell edit Procfile

Procfile

web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

पक्का करें कि सभी फ़ाइलें वर्किंग डायरेक्ट्री में मौजूद हों:

ls

इसमें ये फ़ाइलें शामिल होनी चाहिए:

main.py  Procfile  requirements.txt

आपका ऐप्लिकेशन डिप्लॉय करने के लिए तैयार है, लेकिन आइए पहले इसे टेस्ट कर लें...

5. ऐप्लिकेशन को टेस्ट करना

ऐप्लिकेशन को टेस्ट करने के लिए, वर्चुअल एनवायरमेंट बनाएं:

virtualenv venv

वर्चुअल एनवायरमेंट चालू करें:

source venv/bin/activate

डिपेंडेंसी इंस्टॉल करें:

pip install -r requirements.txt

आपको इस तरह का पुष्टि करने वाला मैसेज मिलेगा:

...
Successfully installed Flask ... gunicorn ...

आवेदन शुरू करें:

python main.py

लॉग से पता चलता है कि आप डेवलपमेंट मोड में हैं:

 * Serving Flask app 'main'
 * Debug mode: on
   WARNING: This is a development server.
   Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Running on http://localhost:8080
   Press CTRL+C to quit
...

Cloud Shell विंडो में, Web Preview आइकॉन पर क्लिक करें और Preview on port 8080 चुनें:

6c9ff9e5c692c58e.gif

ऐसा करने पर, एक ब्राउज़र विंडो खुलेगी. इसमें Hello World! मैसेज दिखेगा.

+ आइकॉन पर क्लिक करके, दूसरा Cloud Shell सेशन (नया टर्मिनल टैब) भी खोला जा सकता है. इसके लिए, आपको स्थानीय तौर पर चल रहे ऐप्लिकेशन को वेब अनुरोध भेजना होगा:

curl localhost:8080

आपको यह जवाब मिलेगा:

Hello World!

जब यह प्रोसेस पूरी हो जाए, तो Cloud Shell के मुख्य सेशन पर वापस जाएं. इसके बाद, python main.py कमांड को CTRL+C की मदद से रोकें.

वर्चुअल एनवायरमेंट से बाहर निकलें:

deactivate

आखिर में, वर्चुअल एनवायरमेंट डायरेक्ट्री हटाएं:

rm -r venv/

आपका ऐप्लिकेशन उम्मीद के मुताबिक काम कर रहा है: इसे डिप्लॉय करते हैं...

6. Cloud Run पर डिप्लॉय करें

Cloud Run, रीजनल सेवा है. इसका मतलब है कि Cloud Run की सेवाओं को चलाने वाला इन्फ़्रास्ट्रक्चर, किसी खास रीजन में मौजूद होता है. इसे Google मैनेज करता है, ताकि यह उस रीजन के सभी ज़ोन में उपलब्ध रहे. उस क्षेत्र को तय करें जिसका इस्तेमाल आपको डिप्लॉयमेंट के लिए करना है. उदाहरण के लिए:

REGION="europe-west9"

पक्का करें कि आप अब भी वर्किंग डायरेक्ट्री में हों:

ls

इसमें ये फ़ाइलें शामिल होनी चाहिए:

main.py  Procfile  requirements.txt

ऐप्लिकेशन को Cloud Run पर डिप्लॉय करें:

gcloud run deploy helloworld-python \
  --source . \
  --platform managed \
  --region $REGION \
  --allow-unauthenticated
  • इस निर्देश की मदद से, डिफ़ॉल्ट क्षेत्र तय किया जा सकता है: gcloud config set run/region $REGION
  • इस निर्देश की मदद से, Cloud Run को डिफ़ॉल्ट रूप से मैनेज किया जा सकता है: gcloud config set run/platform managed
  • --allow-unauthenticated विकल्प चुनने पर, सेवा सार्वजनिक तौर पर उपलब्ध हो जाती है. बिना पुष्टि वाले अनुरोधों से बचने के लिए, --no-allow-unauthenticated का इस्तेमाल करें.

पहली बार, आपको Artifact Registry रिपॉज़िटरी बनाने के लिए एक प्रॉम्प्ट मिलेगा. पुष्टि करने के लिए, Enter दबाएं:

Deploying from source requires an Artifact Registry Docker repository to store
built containers. A repository named [cloud-run-source-deploy] in region [REGION]
will be created.

Do you want to continue (Y/n)?

इससे, Artifact Registry रिपॉज़िटरी में आपका सोर्स कोड अपलोड हो जाएगा और कंटेनर इमेज बन जाएगी:

Building using Buildpacks and deploying container ...
* Building and deploying new service... Building Container.           
  OK Creating Container Repository...
  OK Uploading sources...
  * Building Container... Logs are available at ...

इसके बाद, डिप्लॉयमेंट पूरा होने तक इंतज़ार करें. सफल होने पर, कमांड लाइन में सेवा का यूआरएल दिखता है:

...
OK Building and deploying new service... Done.
  OK Creating Container Repository...
  OK Uploading sources...
  OK Building Container... Logs are available at ...
  OK Creating Revision... Creating Service.
  OK Routing traffic...
  OK Setting IAM Policy...
Done.
Service [SERVICE]... has been deployed and is serving 100 percent of traffic.
Service URL: https://SERVICE-PROJECTHASH-REGIONID.a.run.app

इस कमांड का इस्तेमाल करके, सेवा का यूआरएल पाया जा सकता है:

SERVICE_URL=$( \
  gcloud run services describe helloworld-python \
  --platform managed \
  --region $REGION \
  --format "value(status.url)" \
)
echo $SERVICE_URL

यह कुछ ऐसा दिखना चाहिए:

https://helloworld-python-PROJECTHASH-REGIONID.a.run.app

अब वेब ब्राउज़र में सेवा का यूआरएल खोलकर, अपने ऐप्लिकेशन का इस्तेमाल किया जा सकता है:

c836b93e5601e2cf.gif

Cloud Shell से भी ऐप्लिकेशन को कॉल किया जा सकता है:

curl $SERVICE_URL?who=me

इससे आपको उम्मीद के मुताबिक जवाब मिलेगा:

Hello me!

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

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

Cloud Run, सेवा का इस्तेमाल न किए जाने पर कोई शुल्क नहीं लेता. हालांकि, Artifact Registry में कंटेनर इमेज सेव करने के लिए आपसे शुल्क लिया जा सकता है. शुल्क से बचने के लिए, अपनी रिपॉज़िटरी या Cloud प्रोजेक्ट मिटाया जा सकता है. Cloud प्रोजेक्ट मिटाने पर, उस प्रोजेक्ट में इस्तेमाल किए गए सभी संसाधनों के लिए बिलिंग बंद हो जाती है.

कंटेनर इमेज रिपॉज़िटरी मिटाने के लिए:

gcloud artifacts repositories delete cloud-run-source-deploy \
  --location $REGION

Cloud Run सेवा मिटाने के लिए:

gcloud run services delete helloworld-python \
  --platform managed \
  --region $REGION

Google Cloud प्रोजेक्ट मिटाने के लिए,

  1. अपने मौजूदा प्रोजेक्ट का आईडी वापस पाएं:
PROJECT_ID=$(gcloud config get-value core/project)
  1. पक्का करें कि आपको यही प्रोजेक्ट मिटाना है:
echo $PROJECT_ID
  1. प्रोजेक्ट मिटाने के लिए:
gcloud projects delete $PROJECT_ID

8. बधाई हो!

96d07289bb51daa7.png

आपने एक सामान्य वेब ऐप्लिकेशन बनाया और उसे Cloud Run पर डिप्लॉय किया!

ज़्यादा जानें

लाइसेंस

इस काम के लिए, Creative Commons एट्रिब्यूशन 2.0 जेनेरिक लाइसेंस के तहत लाइसेंस मिला है.