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

1. परिचय

c9b0cc839df0bb8f.png

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

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

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

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

  • Workflows की बुनियादी बातें.
  • सार्वजनिक Cloud Functions को Workflows से कनेक्ट करने का तरीका.
  • Cloud Run की निजी सेवाओं को Workflows से कनेक्ट करने का तरीका.
  • बाहरी एचटीटीपी एपीआई को 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 के नए उपयोगकर्ता, मुफ़्त में आज़माने के लिए 300 डॉलर के प्रोग्राम में शामिल हो सकते हैं.

Cloud Shell शुरू करें

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

GCP Console में, सबसे ऊपर दाईं ओर मौजूद टूलबार पर मौजूद Cloud Shell आइकॉन पर क्लिक करें:

STgwiN06Y0s_gL7i9bTed8duc9tWOIaFw0z_4QOjc-jeOmuH2TBK8l4udei56CKPLoM_i1yEF6pn5Ga88eniJQoEh8cAiTH79gWUHJdKOw0oiBZfBpOdcEOl6p29i4mvPe_A6UMJBQ

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

r6WRHJDzL-GdB5VDxMWa67_cQxRR_x_xCG5xdt9Nilfuwe9fTGAwM9XSZbNPWvDSFtrZ7DDecKqR5_pIq2IJJ9puAMkC3Kt4JbN9jfMX3gAwTNHNqFmqOJ-3iIX5HSePO4dNVZUkNA

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

3. वर्कफ़्लो के बारे में खास जानकारी

बुनियादी बातें

वर्कफ़्लो में कई चरण होते हैं. इन्हें Workflows के YAML-आधारित सिंटैक्स का इस्तेमाल करके बताया जाता है. यह वर्कफ़्लो की परिभाषा है. Workflows के 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 फ़ंक्शन को एक साथ कनेक्ट करना होगा.

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 फ़ंक्शन डिप्लॉय करना

दूसरा फ़ंक्शन, मल्टीप्लायर होता है. यह मिले हुए इनपुट को 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 को निकालता है. इसके बाद, इसे 2 से गुणा करता है और कॉलर को 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 ढूंढें:

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}

अब वर्कफ़्लो, multiply फ़ंक्शन के आउटपुट को math.js में log फ़ंक्शन कॉल में भेजता है.

यूज़र इंटरफ़ेस (यूआई) में, वर्कफ़्लो में बदलाव करने और उसे डिप्लॉय करने के बारे में जानकारी दी जाएगी. डिप्लॉय होने के बाद, वर्कफ़्लो को लागू करने के लिए 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 को निकालता है. इसके बाद, 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 की निजी सेवा को कॉल करने के लिए Workflows को कॉन्फ़िगर करने से पहले, आपको 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. बधाई हो!

कोडलैब पूरा करने के लिए बधाई.

हमने क्या-क्या बताया

  • Workflows की बुनियादी बातें.
  • सार्वजनिक Cloud Functions को Workflows से कनेक्ट करने का तरीका.
  • Cloud Run की निजी सेवाओं को Workflows से कनेक्ट करने का तरीका.
  • बाहरी एचटीटीपी एपीआई को Workflows से कनेक्ट करने का तरीका.