इस कोडलैब (कोड बनाना सीखने के लिए ट्यूटोरियल) के बारे में जानकारी
1. परिचय
वर्कफ़्लो का इस्तेमाल करके, ऐसे सर्वरलेस वर्कफ़्लो बनाए जा सकते हैं जो आपके तय किए गए क्रम में, सर्वरलेस टास्क की सीरीज़ को एक साथ लिंक करते हैं. Google Cloud के एपीआई, Cloud Functions और Cloud Run जैसे सर्वरलेस प्रॉडक्ट, और बाहरी एपीआई को कॉल करके, आसानी से इस्तेमाल किए जा सकने वाले सर्वरलेस ऐप्लिकेशन बनाए जा सकते हैं.
वर्कफ़्लो के लिए, इंफ़्रास्ट्रक्चर मैनेज करने की ज़रूरत नहीं होती. साथ ही, मांग के हिसाब से उन्हें आसानी से स्केल किया जा सकता है. यहां तक कि उन्हें शून्य तक स्केल किया जा सकता है. इस्तेमाल के हिसाब से तय की गई कीमत के मॉडल के तहत, आपको सिर्फ़ प्रोसेस होने में लगने वाले समय के लिए पैसे चुकाने होते हैं.
इस कोडलैब में, आपको Google Cloud की अलग-अलग सेवाओं और बाहरी एचटीटीपी एपीआई को वर्कफ़्लो से कनेक्ट करने का तरीका पता चलेगा. खास तौर पर, आपको दो सार्वजनिक Cloud Functions सेवाओं, एक निजी Cloud Run सेवा, और किसी बाहरी सार्वजनिक एचटीटीपी एपीआई को एक वर्कफ़्लो में कनेक्ट करना होगा.
आपको क्या सीखने को मिलेगा
- वर्कफ़्लो के बारे में बुनियादी जानकारी.
- सार्वजनिक Cloud Functions को वर्कफ़्लो से कनेक्ट करने का तरीका.
- निजी Cloud Run सेवाओं को वर्कफ़्लो से कनेक्ट करने का तरीका.
- बाहरी एचटीटीपी एपीआई को वर्कफ़्लो से कनेक्ट करने का तरीका.
2. सेटअप और ज़रूरी शर्तें
अपने हिसाब से एनवायरमेंट सेट अप करना
- Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. (अगर आपके पास पहले से कोई Gmail या G Suite खाता नहीं है, तो आपको एक खाता बनाना होगा.)
प्रोजेक्ट आईडी याद रखें. यह Google Cloud के सभी प्रोजेक्ट के लिए एक यूनीक नाम होता है. माफ़ करें, ऊपर दिया गया नाम पहले से ही ले लिया गया है और यह आपके लिए काम नहीं करेगा! इस कोडलैब में बाद में इसे PROJECT_ID
कहा जाएगा.
- इसके बाद, Google Cloud के संसाधनों का इस्तेमाल करने के लिए, आपको Cloud Console में बिलिंग की सुविधा चालू करनी होगी.
इस कोडलैब को चलाने में आपको ज़्यादा खर्च नहीं करना पड़ेगा. "साफ़-सफ़ाई करना" सेक्शन में दिए गए निर्देशों का पालन करना न भूलें. इनमें, संसाधनों को बंद करने का तरीका बताया गया है, ताकि इस ट्यूटोरियल के बाद आपसे कोई शुल्क न लिया जाए. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त में आज़माने की सुविधा वाले कार्यक्रम में शामिल हो सकते हैं.
Cloud Shell शुरू करना
Google Cloud को आपके लैपटॉप से रिमोट तौर पर इस्तेमाल किया जा सकता है. हालांकि, इस कोडलैब में आपको Google Cloud Shell का इस्तेमाल करना होगा. यह Cloud में चलने वाला कमांड-लाइन एनवायरमेंट है.
GCP कंसोल में, सबसे ऊपर दाएं टूलबार में मौजूद Cloud Shell आइकॉन पर क्लिक करें:
एनवायरमेंट से कनेक्ट होने और उसे प्रोवाइड करने में सिर्फ़ कुछ मिनट लगेंगे. प्रोसेस पूरी होने के बाद, आपको कुछ ऐसा दिखेगा:
इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल लोड होते हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है. यह Google Cloud पर चलता है, जिससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की सुविधा बेहतर होती है. इस लैब में, सारा काम सिर्फ़ ब्राउज़र से किया जा सकता है.
3. वर्कफ़्लो के बारे में खास जानकारी
बुनियादी बातें
वर्कफ़्लो, चरणों की एक सीरीज़ होती है. इसे वर्कफ़्लो के YAML-आधारित सिंटैक्स का इस्तेमाल करके बनाया जाता है. यह वर्कफ़्लो की परिभाषा है. वर्कफ़्लो के YAML सिंटैक्स के बारे में ज़्यादा जानकारी के लिए, सिंटैक्स का रेफ़रंस पेज देखें.
वर्कफ़्लो बनाने के बाद, उसे डिप्लॉय किया जाता है. इससे वर्कफ़्लो, लागू करने के लिए तैयार हो जाता है. एक बार चलाने का मतलब है, वर्कफ़्लो की परिभाषा में मौजूद लॉजिक को एक बार चलाना. सभी वर्कफ़्लो एक-दूसरे से अलग होते हैं. साथ ही, यह प्रॉडक्ट एक साथ कई वर्कफ़्लो चलाने की सुविधा देता है.
सेवाएं चालू करना
इस कोडलैब में, आपको Cloud Functions और Cloud Run की सेवाओं को वर्कफ़्लो से कनेक्ट करना होगा. सेवाएं बनाते समय, आपको Cloud Build और Cloud Storage का भी इस्तेमाल करना होगा.
सभी ज़रूरी सेवाएं चालू करें:
gcloud services enable \ cloudfunctions.googleapis.com \ run.googleapis.com \ workflows.googleapis.com \ cloudbuild.googleapis.com \ storage.googleapis.com
अगले चरण में, आपको एक वर्कफ़्लो में दो Cloud Functions को एक साथ जोड़ना होगा.
4. पहला Cloud फ़ंक्शन डिप्लॉय करना
पहला फ़ंक्शन, Python में रैंडम नंबर जनरेटर है.
फ़ंक्शन कोड के लिए डायरेक्ट्री बनाएं और उस पर जाएं:
mkdir ~/randomgen cd ~/randomgen
डायरेक्ट्री में main.py
फ़ाइल बनाएं और उसमें यह कॉन्टेंट शामिल करें:
import random, json from flask import jsonify def randomgen(request): randomNum = random.randint(1,100) output = {"random":randomNum} return jsonify(output)
जब इसे कोई एचटीटीपी अनुरोध मिलता है, तो यह फ़ंक्शन 1 से 100 के बीच कोई नंबर जनरेट करता है और कॉल करने वाले को JSON फ़ॉर्मैट में दिखाता है.
यह फ़ंक्शन, एचटीटीपी प्रोसेसिंग के लिए Flask पर निर्भर करता है. इसलिए, हमें इसे डिपेंडेंसी के तौर पर जोड़ना होगा. Python में डिपेंडेंसी को pip की मदद से मैनेज किया जाता है और इन्हें requirements.txt
नाम की मेटाडेटा फ़ाइल में दिखाया जाता है.
उसी डायरेक्ट्री में requirements.txt
फ़ाइल बनाएं और उसमें यह कॉन्टेंट शामिल करें:
flask>=1.0.2
एचटीटीपी ट्रिगर के साथ फ़ंक्शन को डिप्लॉय करें. साथ ही, इस कमांड की मदद से, पुष्टि नहीं किए गए अनुरोधों को अनुमति दें:
gcloud functions deploy randomgen \ --runtime python312 \ --trigger-http \ --allow-unauthenticated
फ़ंक्शन डिप्लॉय होने के बाद, आपको फ़ंक्शन का यूआरएल दिखेगा. यह यूआरएल, कंसोल में दिखने वाली url
प्रॉपर्टी में या gcloud functions describe
कमांड के साथ दिखेगा.
इस फ़ंक्शन के यूआरएल पर जाने के लिए, यहां दिए गए curl
कमांड का इस्तेमाल भी किया जा सकता है:
curl $(gcloud functions describe randomgen --format='value(url)')
फ़ंक्शन, वर्कफ़्लो के लिए तैयार है.
5. दूसरा Cloud फ़ंक्शन डिप्लॉय करना
दूसरा फ़ंक्शन, मल्टीप्लायर होता है. यह मिलने वाले इनपुट को दो से गुणा करता है.
फ़ंक्शन कोड के लिए डायरेक्ट्री बनाएं और उस पर जाएं:
mkdir ~/multiply cd ~/multiply
डायरेक्ट्री में main.py
फ़ाइल बनाएं और उसमें यह कॉन्टेंट शामिल करें:
import random, json from flask import jsonify def multiply(request): request_json = request.get_json() output = {"multiplied":2*request_json['input']} return jsonify(output)
जब इसे एचटीटीपी अनुरोध मिलता है, तो यह फ़ंक्शन JSON बॉडी से input
को निकालता है, उसका दो से गुणा करता है, और कॉलर को JSON फ़ॉर्मैट में वापस भेजता है.
उसी डायरेक्ट्री में, यहां दिए गए कॉन्टेंट के साथ requirements.txt
फ़ाइल बनाएं:
flask>=1.0.2
एचटीटीपी ट्रिगर के साथ फ़ंक्शन को डिप्लॉय करें. साथ ही, इस कमांड की मदद से, पुष्टि नहीं किए गए अनुरोधों को अनुमति दें:
gcloud functions deploy multiply \ --runtime python312 \ --trigger-http \ --allow-unauthenticated
फ़ंक्शन डिप्लॉय होने के बाद, इस curl
कमांड की मदद से, फ़ंक्शन के यूआरएल पर भी जाया जा सकता है:
curl $(gcloud functions describe multiply --format='value(url)') \ -X POST \ -H "content-type: application/json" \ -d '{"input": 5}'
फ़ंक्शन, वर्कफ़्लो के लिए तैयार है.
6. दो Cloud Functions को कनेक्ट करना
पहले वर्कफ़्लो में, दोनों फ़ंक्शन को एक-दूसरे से कनेक्ट करें.
यहां दिए गए कॉन्टेंट के साथ workflow.yaml
फ़ाइल बनाएं.
- randomgenFunction: call: http.get args: url: https://<region>-<project-id>.cloudfunctions.net/randomgen result: randomgenResult - multiplyFunction: call: http.post args: url: https://<region>-<project-id>.cloudfunctions.net/multiply body: input: ${randomgenResult.body.random} result: multiplyResult - returnResult: return: ${multiplyResult}
इस वर्कफ़्लो में, आपको पहले फ़ंक्शन से एक रैंडम नंबर मिलता है और उसे दूसरे फ़ंक्शन को पास किया जाता है. इसका नतीजा, मल्टीप्लाई किया गया कोई रैंडम नंबर होता है.
पहला वर्कफ़्लो डिप्लॉय करना:
gcloud workflows deploy workflow --source=workflow.yaml
पहला वर्कफ़्लो चलाएं:
gcloud workflows execute workflow
वर्कफ़्लो लागू होने के बाद, पिछले चरण में दिए गए 'एग्ज़ीक्यूशन आईडी' को पास करके नतीजा देखा जा सकता है:
gcloud workflows executions describe <your-execution-id> --workflow workflow
आउटपुट में result
और state
शामिल होंगे:
result: '{"body":{"multiplied":108},"code":200 ... } ... state: SUCCEEDED
7. किसी बाहरी एचटीटीपी एपीआई को कनेक्ट करना
इसके बाद, आपको वर्कफ़्लो में math.js को बाहरी सेवा के तौर पर कनेक्ट करना होगा.
math.js में, मैथमैटिकल एक्सप्रेशन का आकलन इस तरह किया जा सकता है:
curl https://api.mathjs.org/v4/?'expr=log(56)'
इस बार, आपको हमारे वर्कफ़्लो को अपडेट करने के लिए, Cloud Console का इस्तेमाल करना होगा. Google Cloud Console में Workflows
ढूंढने के लिए:
अपना वर्कफ़्लो ढूंढें और Definition
टैब पर क्लिक करें:
वर्कफ़्लो की परिभाषा में बदलाव करें और math.js
को कॉल करें.
- randomgenFunction: call: http.get args: url: https://<region>-<project-id>.cloudfunctions.net/randomgen result: randomgenResult - multiplyFunction: call: http.post args: url: https://<region>-<project-id>.cloudfunctions.net/multiply body: input: ${randomgenResult.body.random} result: multiplyResult - logFunction: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiplyResult.body.multiplied) + ")"} result: logResult - returnResult: return: ${logResult}
वर्कफ़्लो अब math.js
में, मल्टीप्लाई फ़ंक्शन के आउटपुट को लॉग फ़ंक्शन कॉल में फ़ीड करता है.
यूज़र इंटरफ़ेस (यूआई) से, आपको वर्कफ़्लो में बदलाव करने और उसे डिप्लॉय करने के लिए निर्देश मिलेंगे. डिप्लॉय होने के बाद, वर्कफ़्लो को लागू करने के लिए Execute
पर क्लिक करें. आपको एक्सपोर्ट की प्रोसेस की जानकारी दिखेगी:
लॉग फ़ंक्शन के आउटपुट के साथ स्टेटस कोड 200
और body
पर ध्यान दें.
आपने हमारे वर्कफ़्लो में किसी बाहरी सेवा को इंटिग्रेट किया है. यह बहुत बढ़िया है!
8. Cloud Run सेवा को डिप्लॉय करना
आखिरी चरण में, निजी Cloud Run सेवा को कॉल करके वर्कफ़्लो को पूरा करें. इसका मतलब है कि Cloud Run सेवा को कॉल करने के लिए, वर्कफ़्लो की पुष्टि की जानी चाहिए.
Cloud Run सेवा, दी गई संख्या का math.floor
दिखाती है.
सेवा कोड के लिए डायरेक्ट्री बनाएं और उस पर जाएं:
mkdir ~/floor cd ~/floor
डायरेक्ट्री में app.py
फ़ाइल बनाएं और उसमें यह कॉन्टेंट शामिल करें:
import json import logging import os import math from flask import Flask, request app = Flask(__name__) @app.route('/', methods=['POST']) def handle_post(): content = json.loads(request.data) input = float(content['input']) return f"{math.floor(input)}", 200 if __name__ != '__main__': # Redirect Flask logs to Gunicorn logs gunicorn_logger = logging.getLogger('gunicorn.error') app.logger.handlers = gunicorn_logger.handlers app.logger.setLevel(gunicorn_logger.level) app.logger.info('Service started...') else: app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))
Cloud Run, कंटेनर डिप्लॉय करता है. इसलिए, आपको Dockerfile
की ज़रूरत होती है. साथ ही, आपके कंटेनर को 0.0.0.0
और PORT
एनवायरमेंट वैरिएबल से बंधा होना चाहिए. इसलिए, ऊपर दिया गया कोड.
जब इसे एचटीटीपी अनुरोध मिलता है, तो यह फ़ंक्शन JSON बॉडी से input
निकालता है, math.floor को कॉल करता है, और कॉल करने वाले को नतीजा दिखाता है.
उसी डायरेक्ट्री में, यह Dockerfile
बनाएं:
# Use an official lightweight Python image. # https://hub.docker.com/_/python FROM python:3.7-slim # Install production dependencies. RUN pip install Flask gunicorn # Copy local code to the container image. WORKDIR /app COPY . . # Run the web service on container startup. Here we use the gunicorn # webserver, with one worker process and 8 threads. # For environments with multiple CPU cores, increase the number of workers # to be equal to the cores available. CMD exec gunicorn --bind 0.0.0.0:8080 --workers 1 --threads 8 app:app
कंटेनर बनाएं:
export SERVICE_NAME=floor gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}
कंटेनर बन जाने के बाद, उसे Cloud Run पर डिप्लॉय करें. no-allow-unauthenticated
फ़्लैग पर ध्यान दें. इससे यह पक्का होता है कि सेवा सिर्फ़ पुष्टि किए गए कॉल स्वीकार करती है:
gcloud run deploy ${SERVICE_NAME} \ --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \ --platform managed \ --no-allow-unauthenticated
डिप्लॉय होने के बाद, सेवा वर्कफ़्लो के लिए तैयार हो जाती है.
9. Cloud Run सेवा को कनेक्ट करना
निजी Cloud Run सेवा को कॉल करने के लिए वर्कफ़्लो को कॉन्फ़िगर करने से पहले, आपको वर्कफ़्लो के इस्तेमाल के लिए एक सेवा खाता बनाना होगा:
export SERVICE_ACCOUNT=workflows-sa gcloud iam service-accounts create ${SERVICE_ACCOUNT}
सेवा खाते को run.invoker
की भूमिका दें. इससे सेवा खाते को पुष्टि की गई Cloud Run सेवाओं को कॉल करने की अनुमति मिलेगी:
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member "serviceAccount:${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role "roles/run.invoker"
Cloud Run सेवा को शामिल करने के लिए, workflow.yaml
में वर्कफ़्लो की परिभाषा अपडेट करें. ध्यान दें कि auth
फ़ील्ड को भी शामिल किया जा रहा है, ताकि यह पक्का किया जा सके कि वर्कफ़्लो, Cloud Run सेवा को कॉल करते समय पुष्टि करने वाला टोकन पास कर सके:
- randomgenFunction: call: http.get args: url: https://<region>-<project-id>.cloudfunctions.net/randomgen result: randomgenResult - multiplyFunction: call: http.post args: url: https://<region>-<project-id>.cloudfunctions.net/multiply body: input: ${randomgenResult.body.random} result: multiplyResult - logFunction: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiplyResult.body.multiplied) + ")"} result: logResult - floorFunction: call: http.post args: url: https://floor-<random-hash>.run.app auth: type: OIDC body: input: ${logResult.body} result: floorResult - returnResult: return: ${floorResult}
वर्कफ़्लो अपडेट करें. service-account में यह समय गुज़र रहा है:
gcloud workflows deploy workflow \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com
वर्कफ़्लो को लागू करें:
gcloud workflows execute workflow
नतीजा देखने के लिए, कुछ सेकंड में वर्कफ़्लो के लागू होने पर नज़र डालें:
gcloud workflows executions describe <your-execution-id> --workflow workflow
आउटपुट में पूर्णांक result
और state
शामिल होंगे:
result: '{"body":"5","code":200 ... } ... state: SUCCEEDED
10. बधाई हो!
कोडलैब पूरा करने के लिए बधाई.
हमने क्या-क्या शामिल किया है
- वर्कफ़्लो के बारे में बुनियादी जानकारी.
- सार्वजनिक Cloud Functions को वर्कफ़्लो से कनेक्ट करने का तरीका.
- निजी Cloud Run सेवाओं को वर्कफ़्लो से कनेक्ट करने का तरीका.
- बाहरी एचटीटीपी एपीआई को वर्कफ़्लो से कनेक्ट करने का तरीका.