ওয়ার্কফ্লো সহ সার্ভারহীন অর্কেস্ট্রেশনের ভূমিকা

1. ভূমিকা

c9b0cc839df0bb8f.png

সার্ভারবিহীন ওয়ার্কফ্লো তৈরি করতে আপনি ওয়ার্কফ্লো ব্যবহার করতে পারেন যা আপনার সংজ্ঞায়িত ক্রমানুসারে সার্ভারহীন কাজগুলির একটি সিরিজকে একসাথে লিঙ্ক করে। আপনি Google ক্লাউডের API এর শক্তি, ক্লাউড ফাংশন এবং ক্লাউড রানের মতো সার্ভারহীন পণ্য এবং নমনীয় সার্ভারহীন অ্যাপ্লিকেশন তৈরি করতে বাহ্যিক API তে কল করতে পারেন।

কর্মপ্রবাহের জন্য কোন অবকাঠামো ব্যবস্থাপনার প্রয়োজন হয় না এবং চাহিদার সাথে সীমাহীনভাবে স্কেল করা হয়, যার মধ্যে শূন্যে নামানো সহ। এটির প্রতি-ব্যবহার মূল্যের মডেলের সাথে, আপনি শুধুমাত্র কার্যকর করার সময়ের জন্য অর্থ প্রদান করেন।

এই কোডল্যাবে, আপনি শিখবেন কিভাবে বিভিন্ন Google ক্লাউড পরিষেবা এবং বাহ্যিক HTTP API-কে Workflows-এর সাথে সংযুক্ত করতে হয়। আরও নির্দিষ্টভাবে, আপনি দুটি পাবলিক ক্লাউড ফাংশন পরিষেবা, একটি ব্যক্তিগত ক্লাউড রান পরিষেবা এবং একটি বহিরাগত পাবলিক HTTP API একটি ওয়ার্কফ্লোতে সংযুক্ত করবেন৷

আপনি কি শিখবেন

  • কর্মপ্রবাহের বুনিয়াদি।
  • ওয়ার্কফ্লোসের সাথে পাবলিক ক্লাউড ফাংশনগুলিকে কীভাবে সংযুক্ত করবেন।
  • কর্মপ্রবাহের সাথে ব্যক্তিগত ক্লাউড রান পরিষেবাগুলিকে কীভাবে সংযুক্ত করবেন।
  • ওয়ার্কফ্লোগুলির সাথে বহিরাগত HTTP APIগুলিকে কীভাবে সংযুক্ত করবেন।

2. সেটআপ এবং প্রয়োজনীয়তা

স্ব-গতিসম্পন্ন পরিবেশ সেটআপ

  1. ক্লাউড কনসোলে সাইন ইন করুন এবং একটি নতুন প্রকল্প তৈরি করুন বা বিদ্যমান একটি পুনরায় ব্যবহার করুন৷ (যদি আপনার ইতিমধ্যেই একটি Gmail বা G Suite অ্যাকাউন্ট না থাকে তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।)

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfBsrB6VPaNEEfBsrB6VPaNEEfBQDWQLDWQTG

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0uZuZvZQH5-5

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3p3f3C519P3C3TX gQ

প্রজেক্ট আইডিটি মনে রাখবেন, সমস্ত Google ক্লাউড প্রকল্প জুড়ে একটি অনন্য নাম (উপরের নামটি ইতিমধ্যে নেওয়া হয়েছে এবং আপনার জন্য কাজ করবে না, দুঃখিত!)। এটি পরে এই কোডল্যাবে PROJECT_ID হিসাবে উল্লেখ করা হবে।

  1. এর পরে, Google ক্লাউড সংস্থানগুলি ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং সক্ষম করতে হবে৷

এই কোডল্যাবের মাধ্যমে চালানোর জন্য খুব বেশি খরচ করা উচিত নয়, যদি কিছু থাকে। "ক্লিনিং আপ" বিভাগে যে কোনও নির্দেশাবলী অনুসরণ করতে ভুলবেন না যা আপনাকে কীভাবে সংস্থানগুলি বন্ধ করতে হবে তা পরামর্শ দেয় যাতে আপনি এই টিউটোরিয়ালের বাইরে বিলিং করতে না পারেন৷ Google ক্লাউডের নতুন ব্যবহারকারীরা $300USD ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য৷

ক্লাউড শেল শুরু করুন

যদিও Google ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালিত হতে পারে, এই কোডল্যাবে আপনি Google ক্লাউড শেল ব্যবহার করবেন, একটি কমান্ড লাইন পরিবেশ যা ক্লাউডে চলছে।

GCP কনসোল থেকে উপরের ডানদিকে টুলবারে ক্লাউড শেল আইকনে ক্লিক করুন:

STgwiN06Y0s_gL7i9bTed8duc9tWOIaFw0z_4QOjc-jeOmuH2TBK8l4udei56CKPLoM_i1yEF6pn5Ga88eniJQoEh8cAiTH79gWUHJdKOfw0z_4QOjc UMJBQ

পরিবেশের ব্যবস্থা করতে এবং সংযোগ করতে এটি শুধুমাত্র কয়েক মুহূর্ত নিতে হবে। এটি সমাপ্ত হলে, আপনি এই মত কিছু দেখতে হবে:

r6WRHJDzL-GdB5VDxMWa67_cQxRR_x_xCG5xdt9Nilfuwe9fTGAwM9XSZbNPWvDSFtrZ7DDecKqR5_pIq2IJJ9puAMkC3Kt4JbN9jfnqdxMWH53Kt4JbN9jfqNqH5X5 ইউকেএনএ

এই ভার্চুয়াল মেশিনটি আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুল দিয়ে লোড করা হয়েছে। এটি একটি ক্রমাগত 5GB হোম ডিরেক্টরি অফার করে এবং Google ক্লাউডে চলে, যা নেটওয়ার্ক কর্মক্ষমতা এবং প্রমাণীকরণকে ব্যাপকভাবে উন্নত করে। এই ল্যাবে আপনার সমস্ত কাজ কেবল একটি ব্রাউজার দিয়ে করা যেতে পারে।

3. ওয়ার্কফ্লো ওভারভিউ

বেসিক

একটি ওয়ার্কফ্লো ওয়ার্কফ্লোস YAML-ভিত্তিক সিনট্যাক্স ব্যবহার করে বর্ণিত ধাপগুলির একটি সিরিজ নিয়ে গঠিত। এটি কর্মপ্রবাহের সংজ্ঞা। ওয়ার্কফ্লোস YAML সিনট্যাক্সের বিস্তারিত ব্যাখ্যার জন্য, সিনট্যাক্স রেফারেন্স পৃষ্ঠাটি দেখুন।

যখন একটি ওয়ার্কফ্লো তৈরি করা হয়, তখন এটি স্থাপন করা হয়, যা কার্যপ্রবাহকে কার্যকর করার জন্য প্রস্তুত করে। কার্যপ্রবাহের সংজ্ঞার মধ্যে থাকা যুক্তির একটি একক চালনা হল কার্য সম্পাদন। সমস্ত ওয়ার্কফ্লো এক্সিকিউশন স্বাধীন এবং প্রোডাক্টটি উচ্চ সংখ্যক সমসাময়িক এক্সিকিউশন সমর্থন করে।

পরিষেবাগুলি সক্ষম করুন৷

এই কোডল্যাবে, আপনি ক্লাউড ফাংশন, ক্লাউড রান পরিষেবাগুলিকে ওয়ার্কফ্লোগুলির সাথে সংযুক্ত করবেন। আপনি পরিষেবা তৈরির সময় ক্লাউড বিল্ড এবং ক্লাউড স্টোরেজ ব্যবহার করবেন।

সমস্ত প্রয়োজনীয় পরিষেবাগুলি সক্ষম করুন:

gcloud services enable \
  cloudfunctions.googleapis.com \
  run.googleapis.com \
  workflows.googleapis.com \
  cloudbuild.googleapis.com \
  storage.googleapis.com

পরবর্তী ধাপে, আপনি একটি ওয়ার্কফ্লোতে দুটি ক্লাউড ফাংশন একসাথে সংযুক্ত করবেন।

4. প্রথম ক্লাউড ফাংশন স্থাপন করুন

প্রথম ফাংশনটি পাইথনে একটি র্যান্ডম নম্বর জেনারেটর।

ফাংশন কোডের জন্য একটি ডিরেক্টরি তৈরি করুন এবং নেভিগেট করুন:

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)

যখন এটি একটি HTTP অনুরোধ গ্রহণ করে, তখন এই ফাংশনটি 1 থেকে 100 এর মধ্যে একটি র্যান্ডম নম্বর তৈরি করে এবং JSON ফর্ম্যাটে কলারের কাছে ফিরে আসে।

ফাংশনটি HTTP প্রক্রিয়াকরণের জন্য ফ্লাস্কের উপর নির্ভর করে এবং আমাদের এটি একটি নির্ভরতা হিসাবে যুক্ত করতে হবে। পাইথনের নির্ভরতাগুলি পিপ দিয়ে পরিচালিত হয় এবং requirements.txt নামে একটি মেটাডেটা ফাইলে প্রকাশ করা হয়।

নিম্নলিখিত বিষয়বস্তু সহ একই ডিরেক্টরিতে একটি requirements.txt ফাইল তৈরি করুন:

flask>=1.0.2

একটি HTTP ট্রিগার সহ ফাংশনটি স্থাপন করুন এবং এই কমান্ডের সাথে অনুমোদিত অননুমোদিত অনুরোধগুলির সাথে:

gcloud functions deploy randomgen \
    --runtime python37 \
    --trigger-http \
    --allow-unauthenticated

একবার ফাংশনটি স্থাপন করা হলে, আপনি কনসোলে প্রদর্শিত httpsTrigger.url বৈশিষ্ট্যের অধীনে ফাংশনের URL দেখতে পাবেন বা gcloud functions describe কমান্ডের সাথে প্রদর্শিত হবে।

এছাড়াও আপনি নিম্নলিখিত curl কমান্ডের সাহায্যে ফাংশনের সেই URLটি দেখতে পারেন:

curl $(gcloud functions describe randomgen --format='value(httpsTrigger.url)')

ফাংশন ওয়ার্কফ্লো জন্য প্রস্তুত.

5. দ্বিতীয় ক্লাউড ফাংশন স্থাপন করুন

দ্বিতীয় ফাংশন একটি গুণক. এটি প্রাপ্ত ইনপুটকে 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)

যখন এটি একটি HTTP অনুরোধ গ্রহণ করে, তখন এই ফাংশনটি JSON বডি থেকে input বের করে, এটিকে 2 দ্বারা গুণ করে এবং কলারের কাছে JSON ফর্ম্যাটে ফিরে আসে।

নিম্নলিখিত বিষয়বস্তু সহ একই ডিরেক্টরিতে একই requirements.txt ফাইল তৈরি করুন:

flask>=1.0.2

একটি HTTP ট্রিগার সহ ফাংশনটি স্থাপন করুন এবং এই কমান্ডের সাথে অনুমোদিত অননুমোদিত অনুরোধগুলির সাথে:

gcloud functions deploy multiply \
    --runtime python37 \
    --trigger-http \
    --allow-unauthenticated

একবার ফাংশনটি স্থাপন করা হলে, আপনি নিম্নলিখিত curl কমান্ডের সাথে ফাংশনের সেই URLটিও দেখতে পারেন:

curl $(gcloud functions describe multiply --format='value(httpsTrigger.url)') \
-X POST \
-H "content-type: application/json" \
-d '{"input": 5}'

ফাংশন ওয়ার্কফ্লো জন্য প্রস্তুত.

6. দুটি ক্লাউড ফাংশন সংযুক্ত করুন

প্রথম ওয়ার্কফ্লোতে, দুটি ফাংশন একসাথে সংযুক্ত করুন।

নিম্নলিখিত বিষয়বস্তু সহ একটি 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. একটি বহিরাগত HTTP API সংযুক্ত করুন৷

এর পরে, আপনি কর্মপ্রবাহে একটি বহিরাগত পরিষেবা হিসাবে math.js-কে সংযুক্ত করবেন।

math.js- এ, আপনি গাণিতিক অভিব্যক্তিকে এভাবে মূল্যায়ন করতে পারেন:

curl https://api.mathjs.org/v4/?'expr=log(56)'

এই সময়, আপনি আমাদের ওয়ার্কফ্লো আপডেট করতে ক্লাউড কনসোল ব্যবহার করবেন। Google ক্লাউড কনসোলে 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 এ লগ ফাংশন কলে ফিড করে।

UI আপনাকে কার্যপ্রবাহ সম্পাদনা এবং স্থাপন করতে গাইড করবে। একবার স্থাপন করা হলে, কার্যপ্রবাহ চালানোর জন্য Execute এ ক্লিক করুন। আপনি মৃত্যুদন্ডের বিশদ বিবরণ দেখতে পাবেন:

b40c76ee43a1ce65.png

স্ট্যাটাস কোড 200 এবং লগ ফাংশনের আউটপুট সহ একটি body লক্ষ্য করুন।

আপনি এইমাত্র আমাদের ওয়ার্কফ্লোতে একটি বাহ্যিক পরিষেবা সংহত করেছেন, দুর্দান্ত!

8. একটি ক্লাউড রান পরিষেবা স্থাপন করুন৷

শেষ অংশে, একটি প্রাইভেট ক্লাউড রান পরিষেবাতে কল দিয়ে কর্মপ্রবাহ চূড়ান্ত করুন৷ এর মানে হল যে ক্লাউড রান পরিষেবাতে কল করার জন্য ওয়ার্কফ্লোকে প্রমাণীকরণ করতে হবে।

ক্লাউড রান সার্ভিসটি পাস করা সংখ্যার 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)))

ক্লাউড রান কন্টেইনার স্থাপন করে, তাই আপনার একটি Dockerfile প্রয়োজন এবং আপনার কন্টেইনারকে 0.0.0.0 এবং PORT env ভেরিয়েবলের সাথে আবদ্ধ করতে হবে, তাই উপরের কোডটি।

যখন এটি একটি HTTP অনুরোধ গ্রহণ করে, তখন এই ফাংশনটি 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}

একবার কন্টেইনার তৈরি হয়ে গেলে, ক্লাউড রানে স্থাপন করুন। no-allow-unauthenticated পতাকা লক্ষ্য করুন। এটি নিশ্চিত করে যে পরিষেবাটি শুধুমাত্র প্রমাণীকৃত কলগুলি গ্রহণ করে:

gcloud run deploy ${SERVICE_NAME} \
  --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \
  --platform managed \
  --no-allow-unauthenticated

একবার স্থাপন করা হলে, পরিষেবাটি কর্মপ্রবাহের জন্য প্রস্তুত।

9. ক্লাউড রান পরিষেবা সংযুক্ত করুন৷

প্রাইভেট ক্লাউড রান পরিষেবাতে কল করার জন্য আপনি ওয়ার্কফ্লোস কনফিগার করার আগে, আপনাকে ওয়ার্কফ্লো ব্যবহার করার জন্য একটি পরিষেবা অ্যাকাউন্ট তৈরি করতে হবে:

export SERVICE_ACCOUNT=workflows-sa
gcloud iam service-accounts create ${SERVICE_ACCOUNT}

পরিষেবা অ্যাকাউন্টে run.invoker ভূমিকা মঞ্জুর করুন। এটি পরিষেবা অ্যাকাউন্টটিকে প্রমাণীকৃত ক্লাউড রান পরিষেবাগুলিতে কল করার অনুমতি দেবে:

gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member "serviceAccount:${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
    --role "roles/run.invoker"

ক্লাউড রান পরিষেবা অন্তর্ভুক্ত করতে workflow.yaml এ ওয়ার্কফ্লো সংজ্ঞা আপডেট করুন। ক্লাউড রান পরিষেবার কলগুলিতে প্রমাণীকরণ টোকেনে ওয়ার্কফ্লো পাস হয় তা নিশ্চিত করতে আপনি কীভাবে auth ক্ষেত্র অন্তর্ভুক্ত করছেন তা লক্ষ্য করুন:

- 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. অভিনন্দন!

কোডল্যাব সম্পূর্ণ করার জন্য অভিনন্দন।

আমরা কভার করেছি কি

  • কর্মপ্রবাহের বুনিয়াদি।
  • ওয়ার্কফ্লোসের সাথে পাবলিক ক্লাউড ফাংশনগুলিকে কীভাবে সংযুক্ত করবেন।
  • কর্মপ্রবাহের সাথে ব্যক্তিগত ক্লাউড রান পরিষেবাগুলিকে কীভাবে সংযুক্ত করবেন।
  • ওয়ার্কফ্লোগুলির সাথে বহিরাগত HTTP APIগুলিকে কীভাবে সংযুক্ত করবেন।