Workflows की मदद से बिना सर्वर वाले ऑर्केस्ट्रेशन के बारे में

1. परिचय

c9b0cc839df0bb8f.png

बिना सर्वर वाले वर्कफ़्लो बनाने के लिए, वर्कफ़्लो का इस्तेमाल किया जा सकता है. ये बिना सर्वर वाले टास्क की सीरीज़ को आपके तय किए गए क्रम में एक साथ लिंक करते हैं. Google Cloud के एपीआई और Cloud Functions और Cloud Run जैसे बिना सर्वर वाले प्रॉडक्ट का इस्तेमाल किया जा सकता है. साथ ही, सर्वर के बिना इस्तेमाल किए जाने वाले सुविधाजनक ऐप्लिकेशन बनाने के लिए, बाहरी एपीआई को कॉल किया जा सकता है.

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

इस कोडलैब में, आपको Workflows के साथ Google Cloud की कई सेवाओं और बाहरी एचटीटीपी एपीआई को कनेक्ट करने का तरीका पता चलेगा. खास तौर पर, आपको वर्कफ़्लो में Cloud Functions की दो सार्वजनिक सेवाएं जोड़नी होंगी, एक निजी Cloud Run सेवा और बाहरी सार्वजनिक एचटीटीपी API.

आप इन चीज़ों के बारे में जानेंगे

  • वर्कफ़्लो से जुड़ी बुनियादी बातें.
  • सार्वजनिक Cloud Functions को, Workflows से कनेक्ट करने का तरीका.
  • Workflows के साथ Cloud Run की निजी सेवाओं को कनेक्ट करने का तरीका.
  • एक्सटर्नल एचटीटीपी एपीआई को Workflows से कैसे कनेक्ट करें.

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

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

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

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

प्रोजेक्ट आईडी याद रखें. यह Google Cloud के सभी प्रोजेक्ट के लिए एक खास नाम होता है (ऊपर दिया गया नाम पहले ही ले लिया गया है और यह आपके लिए काम नहीं करेगा!). बाद में, इस कोडलैब को इस कोडलैब में PROJECT_ID के तौर पर दिखाया जाएगा.

  1. इसके बाद, आपको Google Cloud के संसाधनों का इस्तेमाल करने के लिए, Cloud Console में बिलिंग की सुविधा चालू करनी होगी.

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

Cloud Shell शुरू करना

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

GCP कंसोल में, सबसे ऊपर दाईं ओर मौजूद टूलबार पर क्लाउड शेल आइकॉन पर क्लिक करें:

STgwiN06Y0s_gL7i9bTed8duc9tWOIaFw0z_4QOjc-jeOmuH2TBK8l4udei56CKPLoM_i1yEF6pn5Ga88eniJQoEh8cAiTH79gWUHJdKOw0oiBZfBpOdcEOl6p29i4mvPe_A6UMJBQ

प्रावधान करने और एनवायरमेंट से कनेक्ट होने में कुछ ही समय लगेगा. उसके पूरा हो जाने पर, आपको कुछ ऐसा दिखाई देगा:

r6WRHJDzL-GdB5VDxMWa67_cQxRR_x_xCG5xdt9Nilfuwe9fTGAwM9XSZbNPWvDSFtrZ7DDecKqR5_pIq2IJJ9puAMkC3Kt4JbN9jfMX3gAwTNHNqFmqOJ-3iIX5HSePO4dNVZUkNA

इस वर्चुअल मशीन में ऐसे सभी डेवलपमेंट टूल मौजूद हैं जिनकी आपको ज़रूरत पड़ेगी. यह पांच जीबी की स्थायी होम डायरेक्ट्री उपलब्ध कराता है और 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 को ढूंढें:

7608a7991b33bbb0.png

अपना वर्कफ़्लो ढूंढें और Definition टैब पर क्लिक करें:

f3c8c4d3ffa49b1b.png

वर्कफ़्लो की परिभाषा में बदलाव करें और 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 पर क्लिक करें. आपको प्रोग्राम चलाने से जुड़ी जानकारी दिखेगी:

b40c76ee43a1ce65.png

लॉग फ़ंक्शन के आउटपुट के साथ, स्टेटस कोड 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 से कैसे कनेक्ट करें.