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

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

इस कोडलैब (कोड बनाना सीखने के लिए ट्यूटोरियल) के बारे में जानकारी

subjectपिछली बार मार्च 19, 2025 को अपडेट किया गया
account_circleatamel ने लिखा

1. परिचय

c9b0cc839df0bb8f.png

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

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

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

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

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

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 का इस्तेमाल करना होगा. यह Cloud में चलने वाला कमांड-लाइन एनवायरमेंट है.

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

STgwiN06Y0s_gL7i9bTed8duc9tWOIaFw0z_4QOjc-jeOmuH2TBK8l4udei56CKPLoM_i1yEF6pn5Ga88eniJQoEh8cAiTH79gWUHJdKOw0oiBZfBpOdcEOl6p29i4mvPe_A6UMJBQ

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

r6WRHJDzL-GdB5VDxMWa67_cQxRR_x_xCG5xdt9Nilfuwe9fTGAwM9XSZbNPWvDSFtrZ7DDecKqR5_pIq2IJJ9puAMkC3Kt4JbN9jfMX3gAwTNHNqFmqOJ-3iIX5HSePO4dNVZUkNA

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल लोड होते हैं. यह 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 ढूंढने के लिए:

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 निकालता है, 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 सेवाओं को वर्कफ़्लो से कनेक्ट करने का तरीका.
  • बाहरी एचटीटीपी एपीआई को वर्कफ़्लो से कनेक्ट करने का तरीका.