1. परिचय
बिना सर्वर वाले वर्कफ़्लो बनाने के लिए, वर्कफ़्लो का इस्तेमाल किया जा सकता है. ये बिना सर्वर वाले टास्क की सीरीज़ को आपके तय किए गए क्रम में एक साथ लिंक करते हैं. Google Cloud के एपीआई और Cloud Functions और Cloud Run जैसे बिना सर्वर वाले प्रॉडक्ट का इस्तेमाल किया जा सकता है. साथ ही, सर्वर के बिना इस्तेमाल किए जाने वाले सुविधाजनक ऐप्लिकेशन बनाने के लिए, बाहरी एपीआई को कॉल किया जा सकता है.
वर्कफ़्लो को इन्फ़्रास्ट्रक्चर मैनेजमेंट की ज़रूरत नहीं होती. यह मांग के हिसाब से बिना किसी रुकावट के बेहतर तरीके से काम करता है. इसमें मांग को भी शून्य तक बढ़ाना शामिल है. इसके भुगतान-प्रति-उपयोग मूल्य-निर्धारण मॉडल के साथ, आप केवल निष्पादन समय के लिए भुगतान करते हैं.
इस कोडलैब में, आपको Workflows के साथ Google Cloud की कई सेवाओं और बाहरी एचटीटीपी एपीआई को कनेक्ट करने का तरीका पता चलेगा. खास तौर पर, आपको वर्कफ़्लो में Cloud Functions की दो सार्वजनिक सेवाएं जोड़नी होंगी, एक निजी Cloud Run सेवा और बाहरी सार्वजनिक एचटीटीपी API.
आप इन चीज़ों के बारे में जानेंगे
- वर्कफ़्लो से जुड़ी बुनियादी बातें.
- सार्वजनिक Cloud Functions को, Workflows से कनेक्ट करने का तरीका.
- Workflows के साथ Cloud Run की निजी सेवाओं को कनेक्ट करने का तरीका.
- एक्सटर्नल एचटीटीपी एपीआई को Workflows से कैसे कनेक्ट करें.
2. सेटअप और ज़रूरी शर्तें
अपने हिसाब से एनवायरमेंट सेटअप करना
- Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. (अगर आपके पास पहले से Gmail या G Suite खाता नहीं है, तो आपको एक खाता बनाना होगा.)
प्रोजेक्ट आईडी याद रखें. यह Google Cloud के सभी प्रोजेक्ट के लिए एक खास नाम होता है (ऊपर दिया गया नाम पहले ही ले लिया गया है और यह आपके लिए काम नहीं करेगा!). बाद में, इस कोडलैब को इस कोडलैब में PROJECT_ID
के तौर पर दिखाया जाएगा.
- इसके बाद, आपको Google Cloud के संसाधनों का इस्तेमाल करने के लिए, Cloud Console में बिलिंग की सुविधा चालू करनी होगी.
इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. "साफ़ करना" सेक्शन में दिए गए निर्देशों का पालन करना न भूलें सेक्शन में, संसाधनों को बंद करने का तरीका बताया गया है. इससे इस ट्यूटोरियल के अलावा बिलिंग की सुविधा नहीं मिलेगी. Google Cloud के नए उपयोगकर्ता, 300USD डॉलर के मुफ़्त में आज़माने वाले प्रोग्राम में हिस्सा ले सकते हैं.
Cloud Shell शुरू करना
Google Cloud को आपके लैपटॉप से, कहीं से भी ऑपरेट किया जा सकता है. हालांकि, इस कोडलैब में Google Cloud Shell का इस्तेमाल किया जा रहा है. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.
GCP कंसोल में, सबसे ऊपर दाईं ओर मौजूद टूलबार पर क्लाउड शेल आइकॉन पर क्लिक करें:
प्रावधान करने और एनवायरमेंट से कनेक्ट होने में कुछ ही समय लगेगा. उसके पूरा हो जाने पर, आपको कुछ ऐसा दिखाई देगा:
इस वर्चुअल मशीन में ऐसे सभी डेवलपमेंट टूल मौजूद हैं जिनकी आपको ज़रूरत पड़ेगी. यह पांच जीबी की स्थायी होम डायरेक्ट्री उपलब्ध कराता है और Google Cloud पर चलता है. यह नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रक्रिया को बेहतर बनाता है. इस लैब में आपका सारा काम बस एक ब्राउज़र से किया जा सकता है.
3. वर्कफ़्लो की खास जानकारी
बुनियादी बातें
वर्कफ़्लो में कई चरणों को शामिल किया जाता है. इन चरणों के बारे में वर्कफ़्लो YAML पर आधारित सिंटैक्स का इस्तेमाल करके बताया गया है. वर्कफ़्लो की परिभाषा. वर्कफ़्लो YAML सिंटैक्स के बारे में ज़्यादा जानने के लिए, सिंटैक्स रेफ़रंस पेज देखें.
वर्कफ़्लो बन जाने के बाद, उसे डिप्लॉय किया जाता है. इससे वर्कफ़्लो, एक्ज़ीक्यूशन के लिए तैयार हो जाता है. एक्ज़ीक्यूशन का मतलब है कि वर्कफ़्लो की परिभाषा में मौजूद लॉजिक को एक बार चलाया जाना. सभी वर्कफ़्लो एक साथ लागू होते हैं. साथ ही, प्रॉडक्ट को एक साथ बहुत ज़्यादा संख्या में एक्ज़ीक्यूट किया जा सकता है.
सेवाएं चालू करें
इस कोडलैब में, Cloud Functions और Cloud Run सेवाओं को Workflows के साथ कनेक्ट किया जाएगा. सेवाएं बनाने के दौरान आपको 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 फ़ॉर्मैट में वापस करता है.
यह फ़ंक्शन, एचटीटीपी प्रोसेसिंग के लिए फ़्लास्क का इस्तेमाल करता है और हमें उसे डिपेंडेंसी के तौर पर जोड़ना होता है. Python में डिपेंडेंसी को पीआईपी की मदद से मैनेज किया जाता है. साथ ही, इसकी जानकारी requirements.txt
नाम की मेटाडेटा फ़ाइल में दी जाती है.
उसी डायरेक्ट्री में इस कॉन्टेंट के साथ requirements.txt
फ़ाइल बनाएं:
flask>=1.0.2
इस निर्देश की मदद से, फ़ंक्शन को एचटीटीपी ट्रिगर और बिना पुष्टि वाले अनुरोधों के साथ डिप्लॉय करें:
gcloud functions deploy randomgen \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
फ़ंक्शन डिप्लॉय होने के बाद, कंसोल में या gcloud functions describe
कमांड के साथ httpsTrigger.url
प्रॉपर्टी में, फ़ंक्शन का यूआरएल देखा जा सकता है.
आप निम्न curl
आदेश के साथ फ़ंक्शन के उस URL पर भी जा सकते हैं:
curl $(gcloud functions describe randomgen --format='value(httpsTrigger.url)')
फ़ंक्शन, वर्कफ़्लो के लिए तैयार है.
5. दूसरा Cloud फ़ंक्शन डिप्लॉय करें
दूसरा फ़ंक्शन, मल्टीप्लायर है. यह जो इनपुट मिला है उसे 2 से गुणा कर देता है.
फ़ंक्शन कोड के लिए एक डायरेक्ट्री बनाएं और उस पर जाएं:
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 python37 \ --trigger-http \ --allow-unauthenticated
फ़ंक्शन डिप्लॉय होने के बाद, यहां दिए गए curl
कमांड की मदद से, फ़ंक्शन के यूआरएल पर भी जाया जा सकता है:
curl $(gcloud functions describe multiply --format='value(httpsTrigger.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
को एक्सट्रैक्ट करता है, Mat.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 की निजी सेवा को कॉल करने के लिए, Workflows को कॉन्फ़िगर करने से पहले, आपको एक सेवा खाता बनाना होगा. इससे वर्कफ़्लो, इन सेवाओं का इस्तेमाल कर पाएगा:
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
फ़ील्ड को भी शामिल किया जा रहा है, ताकि यह पक्का किया जा सके कि Workflows के कॉल में, 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}
वर्कफ़्लो को अपडेट करें. इस समय सेवा-खाते में पास हो रहा है:
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 को, Workflows से कनेक्ट करने का तरीका.
- Workflows के साथ Cloud Run की निजी सेवाओं को कनेक्ट करने का तरीका.
- एक्सटर्नल एचटीटीपी एपीआई को Workflows से कैसे कनेक्ट करें.