ক্লাউড রানের মাধ্যমে তিনটি সহজ ধাপে প্রডাক

১. ভূমিকা

অ্যাপ্লিকেশন পরিচালনা করা এত কঠিন কেন?

এর একটি বড় কারণ হলো, ডেভেলপারদের প্রায়শই খণ্ডকালীন সিস্টেম অ্যাডমিনিস্ট্রেটর হিসেবে কাজ করতে হয়। একটি আধুনিক প্রোডাকশন-গ্রেড ওয়েব অ্যাপ্লিকেশন তৈরি, স্থাপন এবং পরিচালনা করার জন্য বিবেচ্য বিষয়গুলোর এই (আংশিক) তালিকাটি দেখুন:

4d018476b4a73b47.png

আপনার কথা জানি না, কিন্তু এই সব বিষয় নিয়ে আমি চিন্তা করতে চাই না! আমি আসলে আমার অ্যাপ্লিকেশন লজিক নিয়ে ভাবতে চাই:

6dfd143d20e5548b.png

সংক্ষেপে বলতে গেলে, ক্লাউড রান-এর মূল উদ্দেশ্য এটাই – আপনাকে আপনার অ্যাপের উপর মনোযোগ দেওয়ার সুযোগ করে দেওয়া এবং সমস্ত প্রশাসনিক ও রক্ষণাবেক্ষণের দায়িত্ব অন্য কারো উপর ছেড়ে দেওয়া, আর সেই দায়িত্ব হলো গুগল, যারা এই ক্ষেত্রে নিজেদের দক্ষতা পরিমার্জন ও নিখুঁত করতে লক্ষ লক্ষ ঘন্টা বিনিয়োগ করেছে।

উপরে উল্লিখিত প্রশাসনিক চ্যালেঞ্জগুলো ছাড়াও আপনাকে আরও যা মোকাবেলা করতে হবে:

  • নির্ভরশীলতা - আপনার অ্যাপটি যে পরিবেশে চলে, তা যথাসম্ভব, যে পরিবেশে এটি পরীক্ষা করা হয়েছিল তার সাথে হুবহু মিল থাকা উচিত। এর মধ্যে অপারেটিং সিস্টেম, সহায়ক লাইব্রেরি, ল্যাঙ্গুয়েজ ইন্টারপ্রেটার বা কম্পাইলার, হার্ডওয়্যার কনফিগারেশন এবং আরও অনেক বিষয় অন্তর্ভুক্ত থাকতে পারে।
  • বিতরণ - কোনো অ্যাপের স্থানীয় সংস্করণ থেকে ইন্টারনেটে ব্যাপকভাবে শেয়ার করা যায় এমন সংস্করণে যেতে প্রায়শই রানটাইম এনভায়রনমেন্ট পরিবর্তন, জটিলতার ক্ষেত্রে এক বিরাট উল্লম্ফন এবং শেখার জন্য একটি কঠিন প্রক্রিয়ার প্রয়োজন হয়।

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

আপনি যা করবেন...

  • আপনি একটি সাধারণ ওয়েব অ্যাপ তৈরি করবেন এবং আপনার ডেভেলপমেন্ট এনভায়রনমেন্টে সেটি প্রত্যাশিতভাবে চলে কিনা তা যাচাই করবেন।
  • এরপর আপনি একই অ্যাপটির একটি কন্টেইনারাইজড সংস্করণে চলে যাবেন। এই যাত্রাপথে, আপনি জানবেন কন্টেইনারাইজেশন বলতে কী বোঝায় এবং এটি কেন এত দরকারি।
  • অবশেষে, আপনি আপনার অ্যাপটি ক্লাউডে ডেপ্লয় করবেন এবং দেখতে পাবেন যে কমান্ড লাইন ও গুগল ক্লাউড কনসোল ব্যবহার করে আপনার ক্লাউড রান সার্ভিসটি পরিচালনা করা কতটা সহজ।

আপনি যা শিখবেন...

  • পাইথনে কীভাবে একটি সহজ ওয়েব সার্ভার অ্যাপ তৈরি করবেন
  • আপনার অ্যাপকে কীভাবে ডকার কন্টেইনারে প্যাকেজ করবেন যা যেকোনো জায়গা থেকে চালানো যায়
  • কীভাবে আপনার অ্যাপটি ক্লাউডে স্থাপন করবেন যাতে যে কেউ আপনার নতুন সৃষ্টিটি ব্যবহার করে দেখতে পারে।
  • বিল্ডপ্যাক ব্যবহার করে উপরের ধাপগুলোকে আরও সহজ করার উপায়
  • গুগল ক্লাউড কমান্ড লাইন টুল এবং ক্লাউড কনসোল ওয়েব UI কীভাবে ব্যবহার করবেন

আপনার যা যা লাগবে...

  • একটি ওয়েব ব্রাউজার
  • একটি গুগল অ্যাকাউন্ট

এই ল্যাবটি নতুনদের সহ সকল স্তরের ডেভেলপারদের জন্য তৈরি করা হয়েছে। যদিও আপনি পাইথন ব্যবহার করবেন, কী ঘটছে তা বোঝার জন্য আপনার পাইথন প্রোগ্রামিং সম্পর্কে পরিচিতি থাকার প্রয়োজন নেই, কারণ আপনার ব্যবহৃত সমস্ত কোড আমরা ব্যাখ্যা করে দেব।

২. প্রস্তুত হন

5110b5081a1e1c49.png

এই ল্যাবটি শুরু করার জন্য আপনার যা যা করা প্রয়োজন, তার সবকিছু এই বিভাগে আলোচনা করা হয়েছে।

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

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

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

  1. এরপরে, গুগল ক্লাউড রিসোর্স ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং চালু করতে হবে।

এই কোডল্যাবটি চালাতে খুব বেশি খরচ হওয়ার কথা নয়, এমনকি আদৌ কোনো খরচ নাও হতে পারে। "পরিষ্কার-পরিচ্ছন্নতা" (Cleaning up) বিভাগে দেওয়া নির্দেশাবলী অবশ্যই অনুসরণ করবেন, যেখানে রিসোর্স বন্ধ করার পরামর্শ দেওয়া হয়েছে, যাতে এই টিউটোরিয়ালের বাইরে আপনার কোনো বিল না আসে। গুগল ক্লাউডের নতুন ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।

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

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

704a7b7491bd157.png

ক্লাউড শেল সক্রিয় করুন

  1. ক্লাউড কনসোল থেকে, Activate Cloud Shell-এ ক্লিক করুন। 4292cbf4971c9786.png .

bce75f34b2c53987.png

আপনি যদি আগে কখনো ক্লাউড শেল চালু না করে থাকেন, তাহলে এটি কী তা বর্ণনা করে একটি মধ্যবর্তী স্ক্রিন (নিচে দেওয়া আছে) আপনার সামনে আসবে। যদি তাই হয়, তাহলে 'Continue'-তে ক্লিক করুন (এবং আপনি এটি আর কখনো দেখতে পাবেন না)। একবারের জন্য আসা সেই স্ক্রিনটি দেখতে এইরকম:

70f315d7b402b476.png

ক্লাউড শেল প্রস্তুত করতে এবং এর সাথে সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগা উচিত।

fbe3a0674c982259.png

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

ক্লাউড শেলে সংযুক্ত হওয়ার পর আপনি দেখতে পাবেন যে, আপনাকে ইতিমধ্যেই প্রমাণীকৃত করা হয়েছে এবং প্রজেক্টটি আপনার প্রজেক্ট আইডিতে সেট করা আছে।

  1. আপনি প্রমাণীকৃত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud auth list

কমান্ড আউটপুট

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud কমান্ডটি আপনার প্রজেক্ট সম্পর্কে জানে কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud config list project

কমান্ড আউটপুট

[core]
project = <PROJECT_ID>

যদি তা না থাকে, তবে আপনি এই কমান্ডটি দিয়ে এটি সেট করতে পারেন:

gcloud config set project <PROJECT_ID>

কমান্ড আউটপুট

Updated property [core/project].

আপনার টার্মিনালে কিছু এনভায়রনমেন্ট ভেরিয়েবল সেট করুন যা পরবর্তী ধাপগুলোতে কাজকে সহজ করে তুলবে:

export PROJ=$GOOGLE_CLOUD_PROJECT 
export APP=hello 
export PORT=8080
export REGION="us-central1"
export TAG="gcr.io/$PROJ/$APP"

এপিআইগুলি সক্রিয় করুন

পরবর্তী ধাপগুলোতে আপনি দেখতে পাবেন এই সার্ভিসগুলো কোথায় (এবং কেন) প্রয়োজন, কিন্তু আপাতত, আপনার প্রোজেক্টকে Cloud Build, Container Registry, এবং Cloud Run সার্ভিসগুলোতে অ্যাক্সেস দেওয়ার জন্য এই কমান্ডটি চালান:

gcloud services enable cloudbuild.googleapis.com         \
                       containerregistry.googleapis.com  \
                       run.googleapis.com          

এর ফলে এইটির মতো একটি সফল বার্তা তৈরি হওয়া উচিত:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

৩. একটি সহজ ওয়েব অ্যাপ তৈরি করুন

eef530b56b8e93a3.png

আপনার ক্লাউড শেল প্যানেলের উপরের দিকে থাকা Open Editor বোতামটিতে ক্লিক করে শুরু করুন। এটি দেখতে এইরকম:

9b81c8a37a6bcdd8.png

এরপর আপনি ভিজ্যুয়াল স্টুডিও কোডের মতো একটি IDE পরিবেশে প্রবেশ করবেন, যেখানে আপনি প্রজেক্ট তৈরি করতে, সোর্স কোড সম্পাদনা করতে, আপনার প্রোগ্রাম চালাতে ইত্যাদি পারবেন। যদি আপনার স্ক্রিনটি খুব ছোট মনে হয়, তবে আপনি কনসোল এবং আপনার এডিট/টার্মিনাল উইন্ডোর মাঝের বিভাজন রেখাটি প্রসারিত বা সংকুচিত করতে পারেন। এর জন্য, এখানে হাইলাইট করা হরাইজন্টাল বারটি টেনে ধরুন:

8dea35450851af53.png

আপনি যথাক্রমে Open Editor এবং Open Terminal বোতামে ক্লিক করে এডিটর এবং টার্মিনালের মধ্যে আসা-যাওয়া করতে পারেন। এখন এই দুটি পরিবেশের মধ্যে আসা-যাওয়া করে দেখুন।

এরপর, এই ল্যাবের কাজ সংরক্ষণের জন্য একটি ফোল্ডার তৈরি করতে, File->New Folder নির্বাচন করুন, hello লিখুন এবং OK তে ক্লিক করুন। এই ল্যাবে আপনার তৈরি করা সমস্ত ফাইল এবং Cloud Shell-এ করা সমস্ত কাজ এই ফোল্ডারেই থাকবে।

এখন একটি requirements.txt ফাইল তৈরি করুন। এটি পাইথনকে বলে দেয় যে আপনার অ্যাপটি কোন কোন লাইব্রেরির উপর নির্ভরশীল। এই সাধারণ ওয়েব অ্যাপটির জন্য, আপনি Flask নামক ওয়েব সার্ভার তৈরির একটি জনপ্রিয় পাইথন মডিউল এবং gunicorn নামক একটি ওয়েব সার্ভার ফ্রেমওয়ার্ক ব্যবহার করবেন। ক্লাউড এডিটর উইন্ডোতে, একটি নতুন ফাইল তৈরি করতে File->New File মেনুতে ক্লিক করুন। নতুন ফাইলের নাম জানতে চাইলে requirements.txt লিখুন এবং OK বোতামটি চাপুন। নিশ্চিত করুন যে নতুন ফাইলটি hello প্রজেক্ট ফোল্ডারে তৈরি হয়।

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

Flask
gunicorn

আপনাকে এই ফাইলটি আলাদাভাবে সংরক্ষণ করার প্রয়োজন নেই, কারণ ক্লাউড এডিটর আপনার জন্য পরিবর্তনগুলো স্বয়ংক্রিয়ভাবে সংরক্ষণ করে নেবে।

সংস্করণ ১: হ্যালো ওয়ার্ল্ড!

একই পদ্ধতি ব্যবহার করে main.py নামে আরেকটি নতুন ফাইল তৈরি করুন। এটি হবে আপনার অ্যাপের প্রধান (এবং একমাত্র) পাইথন সোর্স ফাইল। আবারও, নিশ্চিত করুন যে নতুন ফাইলটি hello প্রজেক্ট ফোল্ডারে থাকে।

এই ফাইলে নিম্নলিখিত কোডটি সন্নিবেশ করুন:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from the environment.

# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
@app.route("/", methods=["GET"])
def say_hello():
    html = "<h1>Hello world!</h1>"
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

টার্মিনালে ফিরে যান এবং এই কমান্ডটি দিয়ে প্রজেক্ট ফোল্ডারে প্রবেশ করুন:

cd hello

আপনার প্রোজেক্টের ডিপেন্ডেন্সিগুলো ইনস্টল করতে নিম্নলিখিত কমান্ডটি চালান:

pip3 install -r requirements.txt

এখন টার্মিনালে এই কমান্ডটি চালিয়ে আপনার অ্যাপটি চালু করুন:

python3 main.py

এই মুহূর্তে, আপনার অ্যাপটি আপনার ক্লাউড শেল সেশনের জন্য নির্ধারিত ভার্চুয়াল মেশিনে চলছে। ক্লাউড শেলে একটি প্রক্সি ব্যবস্থা রয়েছে, যার মাধ্যমে আপনি বিশ্বের যেকোনো ইন্টারনেট থেকে আপনার ভার্চুয়াল মেশিনে চলমান ওয়েব সার্ভারগুলো (যেমনটি আপনি এইমাত্র চালু করেছেন) অ্যাক্সেস করতে পারেন।

এইভাবে web preview বোতামে ক্লিক করুন এবং তারপরে Preview on Port 8080 মেনু আইটেমটিতে ক্লিক করুন:

fe45e0192080efd6.png

এটি আপনার চলমান অ্যাপের একটি ওয়েব ব্রাউজার ট্যাব খুলবে, যা দেখতে অনেকটা এইরকম হবে:

b1f06501509aefb9.png

সংস্করণ ২: ইউআরএল পাথ প্রতিধ্বনিত করা

( Open Editor বাটনের মাধ্যমে) ক্লাউড এডিটরে ফিরে যান এবং আপনার main.py ফাইলটি নিম্নরূপভাবে আপডেট করে একটি ঐচ্ছিক URL সাফিক্স ইকো করার জন্য সমর্থন যোগ করুন:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.

# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"])     # ← NEW
def say_hello(name="world"):               # ← MODIFIED
    html = f"<h1>Hello {name}!</h1>"       # ← MODIFIED
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

টার্মিনালে ফিরে যান ( Open Terminal বাটনের মাধ্যমে) এবং আপনার চলমান অ্যাপটি বন্ধ করতে control-C (কন্ট্রোল কী চেপে ধরে 'C' চাপুন) চাপুন এবং তারপর এটি পুনরায় চালু করতে লিখুন:

python3 main.py

আবার, web preview বোতামে ক্লিক করুন এবং তারপরে আপনার চলমান অ্যাপটির একটি ওয়েব ব্রাউজার ট্যাব খুলতে Preview on Port 8080 মেনু আইটেমটিতে ক্লিক করুন। আপনি আবার "Hello world!" বার্তাটি দেখতে পাবেন, কিন্তু এখন স্ল্যাশ অক্ষরের পরের URL টেক্সটটি আপনার পছন্দের যেকোনো স্ট্রিং (যেমন /your-name ) দিয়ে প্রতিস্থাপন করুন এবং যাচাই করুন যে আপনি এইরকম কিছু দেখতে পাচ্ছেন:

93b87996f88fa370.png

সংস্করণ ৩: এলোমেলো রং

এখন, র‍্যান্ডম ব্যাকগ্রাউন্ড কালারের জন্য সাপোর্ট যোগ করতে ( Open Editor বাটনের মাধ্যমে) ক্লাউড এডিটরে ফিরে যান এবং আপনার main.py ফাইলটি নিম্নরূপভাবে আপডেট করুন:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from the environment.

# This function decides whether foreground text should be
# displayed in black or white, to maximize fg/bg contrast.
def set_text_color(rgb):                      # ← NEW
    sum = round(                              # ← NEW
        (int(rgb[0]) * 0.299)                 # ← NEW
        + (int(rgb[1]) * 0.587)               # ← NEW
        + (int(rgb[2]) * 0.114)               # ← NEW
    )                                         # ← NEW
    return "black" if sum > 186 else "white"  # ← NEW


# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
# To verify each new invocation of these requests, the HTML document
# includes CSS styling to produce a randomly colored background.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"])
def say_hello(name="world"):
    bg = random.sample(range(1, 255), 3)                       # ← NEW
    hex = (int(bg[0]) * 256) + (int(bg[1]) * 16) + int(bg[2])  # ← NEW
    fg_color = set_text_color(bg)                              # ← NEW
    bg_color = f"#{hex:06x}"                                   # ← NEW
    style = f"color:{fg_color}; background-color:{bg_color}"   # ← NEW
    html = f'<h1 style="{style}">Hello {name}!</h1>'           # ← MODIFIED
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

টার্মিনালে ফিরে যান ( Open Terminal বাটনের মাধ্যমে) এবং আপনার চলমান অ্যাপটি বন্ধ করতে control-C (কন্ট্রোল কী চেপে ধরে 'C' চাপুন) চাপুন এবং তারপর এটি পুনরায় চালু করতে লিখুন:

python3 main.py

আবার, web preview বোতামে ক্লিক করুন এবং তারপরে আপনার চলমান অ্যাপটির একটি ওয়েব ব্রাউজার ট্যাব খুলতে Preview on Port 8080 মেনু আইটেমটিতে ক্লিক করুন। আপনি তৈরি করা টেক্সটটি, যেকোনো নির্দিষ্ট সাফিক্স সহ অথবা ডিফল্ট "Hello world!" স্ট্রিংটি, একটি এলোমেলো রঙের ব্যাকগ্রাউন্ডের সামনে প্রদর্শিত হতে দেখবেন, ঠিক এইভাবে:

baf8d028f15ea7f4.png

পৃষ্ঠাটি কয়েকবার রিলোড করুন, তাহলেই দেখতে পাবেন যে প্রতিবার অ্যাপটি ভিজিট করার সময় র‍্যান্ডম ব্যাকগ্রাউন্ডের রঙটি পরিবর্তিত হচ্ছে।

এর সাথেই আপনার অ্যাপটি তৈরি হয়ে গেল - অভিনন্দন! পরবর্তী ধাপে, আপনি শিখবেন কীভাবে আপনার অ্যাপটিকে একটি কন্টেইনারে প্যাকেজ করতে হয় এবং কেন এটি একটি দরকারি কাজ।

৪. আপনার অ্যাপকে কন্টেইনারাইজ করুন

17cc234ec3325a8a.png

কন্টেইনার কী?

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

ডিপেন্ডেন্সির কথা বলতে গেলে, আগের একটি ধাপে, যখন আপনি আপনার অ্যাপটি ডেভেলপার এনভায়রনমেন্টে চালাচ্ছিলেন, তখন আপনাকে pip3 install -r requirements.txt চালাতে হয়েছিল এবং নিশ্চিত করতে হয়েছিল যে `requirements.txt` ফাইলটিতে আপনার সমস্ত ডিপেন্ডেন্ট লাইব্রেরি এবং তাদের সংশ্লিষ্ট ভার্সনগুলো রয়েছে। কন্টেইনারের ক্ষেত্রে, আপনি কন্টেইনার ইমেজ জেনারেট করার সময়েই সেই রিকোয়ারমেন্টগুলো ইনস্টল করে নেন, তাই কন্টেইনার ব্যবহারকারীকে কোনো কিছু ইনস্টল করার বিষয়ে চিন্তা করতে হয় না

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

কন্টেইনারগুলো আপনার অ্যাপ্লিকেশনগুলোকে তৈরি করতে সাহায্য করে:

  • পুনরুৎপাদনযোগ্য - পাত্রগুলি স্বয়ংসম্পূর্ণ এবং পূর্ণাঙ্গ
  • বহনযোগ্য - কন্টেইনারগুলি হল বিভিন্ন শিল্পক্ষেত্রে ব্যবহৃত মৌলিক উপাদান, যা বিভিন্ন ক্লাউড সরবরাহকারী এবং পরিবেশে অ্যাপ্লিকেশনের বহনযোগ্যতা সক্ষম করে।

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

অনেক কথা হলো - চলুন একটি কন্টেইনার তৈরি করি! কন্টেইনার তৈরির জন্য আপনি ডকার (Docker) নামক একটি বিশেষ প্রযুক্তি ব্যবহার করতে চলেছেন।

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

# Use an official lightweight Python image.
FROM python:3.9-slim

# Copy local code to the container image.
WORKDIR /app
COPY main.py .
COPY requirements.txt .

# Install dependencies into this container so there's no need to 
# install anything at container run time.
RUN pip install -r requirements.txt

# Service must listen to $PORT environment variable.
# This default value facilitates local development.
ENV PORT 8080

# Run the web service on container startup. Here you use the gunicorn
# server, with one worker process and 8 threads. For environments 
# with multiple CPU cores, increase the number of workers to match 
# the number of cores available.
CMD exec gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 main:app

ক্লাউড টার্মিনালে, ক্লাউড বিল্ড ব্যবহার করে নিম্নলিখিত কমান্ডটি চালিয়ে আপনার কন্টেইনার ইমেজ তৈরি করুন:

gcloud builds submit --tag $TAG

রেজিস্ট্রিতে পুশ করার পর, আপনি একটি SUCCESS মেসেজ দেখতে পাবেন, যেখানে ইমেজের নামটি থাকবে, যা দেখতে অনেকটা এইরকম হবে: gcr.io/<project-id>/hello hello। ইমেজটি এখন গুগল কন্টেইনার রেজিস্ট্রি-তে সংরক্ষিত আছে এবং আপনি যখন খুশি যেখানে খুশি এটি পুনরায় ব্যবহার করতে পারবেন।

এই কমান্ডটি ব্যবহার করে আপনি আপনার বর্তমান প্রোজেক্টের সাথে যুক্ত সমস্ত কন্টেইনার ইমেজ তালিকাভুক্ত করতে পারেন:

gcloud container images list

এখন ক্লাউড শেল থেকে এই docker কমান্ডগুলো ব্যবহার করে অ্যাপ্লিকেশনটি স্থানীয়ভাবে চালান এবং পরীক্ষা করুন:

docker run -p $PORT:$PORT -e PORT=$PORT $TAG

-p $PORT:$PORT অপশনটি ডকারকে নির্দেশ দেয় হোস্ট এনভায়রনমেন্টের এক্সটার্নাল পোর্ট $PORT (উপরে 8080 সেট করা) কে চলমান কন্টেইনারের ভেতরের একই পোর্ট নম্বরে ম্যাপ করতে। এটি কাজকে সহজ করে তোলে, কারণ আপনার লেখা সার্ভার কোড এবং অ্যাপ পরীক্ষা করার সময় আপনি যে এক্সটার্নাল পোর্ট নম্বরে সংযোগ করেন, তা একই (8080) হবে। তবে, আপনি চাইলেই -p অপশনটি ব্যবহার করে হোস্টের যেকোনো এক্সটার্নাল পোর্টকে কন্টেইনারের ভেতরের যেকোনো কাঙ্ক্ষিত ইন্টারনাল পোর্টে ম্যাপ করতে পারেন।

-e PORT=$PORT অপশনটি ডকারকে বলে দেয় যেন কন্টেইনারের ভেতরে চলমান আপনার অ্যাপের জন্য $PORT এনভায়রনমেন্ট ভেরিয়েবলটি (উপরে 8080 সেট করা) উপলব্ধ করা হয়।

এখন আপনি কন্টেইনারের ভিতরে চলমান পাইথন কোডটিতে একটি ওয়েব ব্রাউজার নিয়ে গিয়ে আপনার অ্যাপটি পরীক্ষা করার জন্য প্রস্তুত। ক্লাউড শেল উইন্ডোতে, "ওয়েব প্রিভিউ" আইকনে ক্লিক করুন এবং "পোর্ট ৮০৮০-এ প্রিভিউ" নির্বাচন করুন, যেমনটি আপনি আগের ধাপে করেছিলেন।

ফলাফলটি আপনার পরিচিত মনে হওয়া উচিত - আপনি একটি এলোমেলো রঙের পটভূমির সামনে তৈরি হওয়া লেখাটি দেখতে পাবেন, ঠিক যেমনটি আপনি আপনার ক্লাউড শেল টার্মিনালে সরাসরি অ্যাপটি চালানোর সময় দেখেছিলেন। পৃষ্ঠাটি কয়েকবার রিলোড করে দেখুন যে, প্রতিবার অ্যাপটি ভিজিট করার সময় পটভূমির এলোমেলো রঙটি পরিবর্তিত হচ্ছে।

অভিনন্দন! আপনি এখন আপনার অ্যাপের একটি কন্টেইনারাইজড সংস্করণ চালাতে পেরেছেন। পরবর্তী অংশে, কোডের একটি লাইনও পরিবর্তন না করে, আপনি আপনার কন্টেইনার ইমেজটিকে একটি প্রোডাকশন কোয়ালিটির ওয়েব অ্যাপে পরিণত করবেন

৫. ক্লাউডে...

1b0665d94750ded6.gif

এখন যেহেতু আপনি আপনার অ্যাপটিকে কন্টেইনারাইজ করেছেন, আপনি এই চমৎকার জিনিসটি বাকি বিশ্বের সাথে শেয়ার করতে চাইবেন, তাই এটিকে ক্লাউডে ডেপ্লয় করার সময় এসেছে। কিন্তু আপনি শুধু শেয়ার করার চেয়েও বেশি কিছু করতে চান। আপনি নিশ্চিত করতে চান যে এটি:

  • নির্ভরযোগ্যভাবে চলে - আপনার অ্যাপটি চালানো কোনো কম্পিউটার ক্র্যাশ করলে আপনি স্বয়ংক্রিয় ফল্ট টলারেন্স পাবেন।
  • স্বয়ংক্রিয়ভাবে স্কেল করে - আপনার অ্যাপ বিপুল পরিমাণ ট্র্যাফিকের সাথে তাল মিলিয়ে চলবে এবং অব্যবহৃত অবস্থায় স্বয়ংক্রিয়ভাবে এর ফুটপ্রিন্ট কমিয়ে আনবে।
  • এটি আপনার খরচ কমিয়ে আনে, কারণ আপনি যে রিসোর্স ব্যবহার করছেন না তার জন্য আপনাকে চার্জ করা হয় না — শুধুমাত্র ট্র্যাফিকের প্রতিক্রিয়া জানাতে ব্যবহৃত রিসোর্সের জন্যই আপনাকে চার্জ করা হয়।
  • একটি কাস্টম ডোমেইন নামের মাধ্যমে অ্যাক্সেসযোগ্য - আপনার পরিষেবাতে একটি কাস্টম ডোমেইন নাম নির্ধারণ করার জন্য আপনার কাছে একটি ওয়ান-ক্লিক সমাধান রয়েছে।
  • চমৎকার রেসপন্স টাইম দেয় - কোল্ড স্টার্ট বেশ দ্রুত হয়, তবে একটি ন্যূনতম ইনস্ট্যান্স কনফিগারেশন নির্দিষ্ট করে আপনি এটিকে আরও সূক্ষ্মভাবে নিয়ন্ত্রণ করতে পারেন।
  • স্ট্যান্ডার্ড SSL/TLS ওয়েব নিরাপত্তা ব্যবহার করে এন্ড-টু-এন্ড এনক্রিপশন সমর্থন করে - যখন আপনি কোনো পরিষেবা স্থাপন করেন, তখন আপনি বিনামূল্যে এবং স্বয়ংক্রিয়ভাবে স্ট্যান্ডার্ড ওয়েব এনক্রিপশন এবং এর জন্য প্রয়োজনীয় সার্টিফিকেটগুলো পেয়ে যান।

Google Cloud Run-এ আপনার অ্যাপ ডেপ্লয় করার মাধ্যমে আপনি উপরোক্ত সবকিছু এবং আরও অনেক কিছু পাবেন।

আপনার অ্যাপটি ক্লাউড রানে স্থাপন করুন

প্রথমে, আপনার অ্যাপটি এমনভাবে পরিবর্তন করুন যাতে আপনি নতুন সংস্করণটি পুরানোটি থেকে আলাদা করতে পারেন। এটি করার জন্য main.py ফাইলটি এমনভাবে পরিবর্তন করুন যাতে ডিফল্ট বার্তাটি "Hello world!" থেকে "Hello from Cloud Run!"-এ পরিবর্তিত হয়। অন্য কথায়, main.py ফাইলের এই লাইনটি পরিবর্তন করুন:

def say_hello(name="world"):

এই পর্যন্ত:

def say_hello(name="from Cloud Run"):

ক্লাউড রান আঞ্চলিক, যার অর্থ হলো আপনার ক্লাউড রান পরিষেবাগুলো যে পরিকাঠামোতে চলে, তা একটি নির্দিষ্ট অঞ্চলে অবস্থিত এবং গুগল দ্বারা পরিচালিত হয়, যাতে সেই অঞ্চলের সমস্ত জোনে এটি রিডান্ড্যান্টভাবে উপলব্ধ থাকে। উপরের "গেট সেট আপ" বিভাগে, আপনি REGION এনভায়রনমেন্ট ভেরিয়েবলের মাধ্যমে একটি ডিফল্ট অঞ্চল নির্ধারণ করেছেন।

নিম্নলিখিত কমান্ড ব্যবহার করে আপনার কন্টেইনার ইমেজটি পুনর্নির্মাণ করুন এবং আপনার কন্টেইনারাইজড অ্যাপ্লিকেশনটি ক্লাউড রান-এ স্থাপন করুন:

gcloud builds submit --tag $TAG
gcloud run deploy "$APP"   \
  --image "$TAG"           \
  --platform "managed"     \
  --region "$REGION"       \
  --allow-unauthenticated
  • এছাড়াও আপনি gcloud config set run/region $REGION মাধ্যমে একটি ডিফল্ট অঞ্চল নির্ধারণ করতে পারেন।
  • --allow-unauthenticated অপশনটি সার্ভিসটিকে সর্বজনীনভাবে উপলব্ধ করে তোলে। প্রমাণীকরণবিহীন অনুরোধ এড়াতে, এর পরিবর্তে --no-allow-unauthenticated ব্যবহার করুন।

এখানে উল্লেখিত ইমেজটি হলো সেই ডকার ইমেজ যা আপনি গত ধাপে বিল্ড করেছিলেন। ক্লাউড বিল্ড সার্ভিসটি গুগল কন্টেইনার রেজিস্ট্রি-তে তৈরি হওয়া ইমেজটি সংরক্ষণ করার ফলে, ক্লাউড রান সার্ভিসটি এটিকে খুঁজে বের করতে এবং আপনার জন্য ডেপ্লয় করতে পারে।

ডেপ্লয়মেন্ট সম্পূর্ণ হওয়া পর্যন্ত কিছুক্ষণ অপেক্ষা করুন। সফল হলে, কমান্ড লাইনে সার্ভিস URL-টি প্রদর্শিত হবে:

Deploying container to Cloud Run service [hello] in project [PROJECT_ID...
✓ Deploying new service... Done.                                   
  ✓ Creating Revision... Revision deployment finished. Waiting for health check...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [hello] revision [hello-...] has been deployed and is serving 100 percent of traffic.
Service URL: https://hello-....a.run.app

আপনি এই কমান্ডটি ব্যবহার করে আপনার সার্ভিস ইউআরএলও পুনরুদ্ধার করতে পারেন:

gcloud run services describe hello  \
  --platform managed                \
  --region $REGION                  \
  --format "value(status.url)"

এটি দেখতে অনেকটা এরকম হওয়া উচিত:

https://hello-....a.run.app

এই লিঙ্কটি আপনার ক্লাউড রান পরিষেবার জন্য টিএলএস নিরাপত্তা সহ একটি নির্দিষ্ট ইউআরএল। এই লিঙ্কটি স্থায়ী (যতক্ষণ না আপনি আপনার পরিষেবাটি নিষ্ক্রিয় করছেন) এবং ইন্টারনেটের যেকোনো জায়গায় ব্যবহারযোগ্য। এটি পূর্বে উল্লিখিত ক্লাউড শেলের প্রক্সি পদ্ধতি ব্যবহার করে না, যা একটি অস্থায়ী ভার্চুয়াল মেশিনের উপর নির্ভরশীল ছিল।

আপনার চলমান অ্যাপটির একটি ওয়েব ব্রাউজার ট্যাব খুলতে হাইলাইট করা Service URL টিতে ক্লিক করুন। এর ফলে একটি এলোমেলো রঙের ব্যাকগ্রাউন্ডের সামনে আপনার "Hello from Cloud Run!" বার্তাটি প্রদর্শিত হবে।

অভিনন্দন! আপনার অ্যাপটি এখন গুগলের ক্লাউডে চলছে। কোনো রকম চিন্তা ছাড়াই আপনার অ্যাপটি TLS (HTTPS) এনক্রিপশনসহ সর্বসাধারণের জন্য উপলব্ধ এবং এটি বিপুল পরিমাণ ট্র্যাফিকের জন্য স্বয়ংক্রিয়ভাবে স্কেল করে।

কিন্তু আমার মনে হয় এই প্রক্রিয়াটি আরও সহজ হতে পারে...

৬. স্বয়ংক্রিয়ভাবে কন্টেইনারটি তৈরি করুন

এই সবকিছুই বেশ চমৎকার, কিন্তু যদি আমি ডকারফাইল এবং কন্টেইনার নিয়ে ভাবতেই না চাই? যদি বেশিরভাগ ডেভেলপারের মতোই আমি শুধু আমার অ্যাপ্লিকেশন কোড লেখার উপর মনোযোগ দিতে চাই এবং এটিকে কন্টেইনারাইজ করার চিন্তা অন্য কারো উপর ছেড়ে দিতে চাই? তাহলে আপনার ভাগ্য ভালো, কারণ ক্লাউড রান বিল্ডপ্যাকস (Buildpacks) নামক একটি ওপেন সোর্স স্ট্যান্ডার্ড সমর্থন করে, যা ঠিক এই কারণেই তৈরি হয়েছে: একাধিক সোর্স ফাইল থেকে একটি কন্টেইনার তৈরির প্রক্রিয়াকে স্বয়ংক্রিয় করতে।

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

প্রথমে, আপনার অ্যাপটি এমনভাবে পরিবর্তন করুন যাতে আপনি নতুন সংস্করণটি পুরানোটি থেকে আলাদা করতে পারেন। এটি করার জন্য main.py ফাইলটি এমনভাবে পরিবর্তন করুন যাতে ডিফল্ট বার্তাটি "Hello from Cloud Run!" থেকে "Hello from Cloud Run with Buildpacks!"-এ পরিবর্তিত হয়। অন্য কথায়, main.py ফাইলের এই লাইনটি পরিবর্তন করুন:

def say_hello(name="from Cloud Run"):

এই পর্যন্ত:

def say_hello(name="from Cloud Run with Buildpacks"):

এখন Procfile নামের একটি নতুন ফাইল তৈরি করে বিল্ডপ্যাকগুলোর সুবিধা নেওয়া যাক। ক্লাউড এডিটরে ফাইলটি তৈরি করুন এবং এই এক লাইনের লেখাটি যোগ করুন:

web: python3 main.py

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

gcloud beta run deploy "$APP"  \
    --source .                 \
    --platform "managed"       \
    --region "$REGION"         \
    --allow-unauthenticated

এটি গত ধাপে আপনার অ্যাপ ডেপ্লয় করার জন্য চালানো কমান্ডের মতোই, তবে এবার আপনি --image অপশনটির পরিবর্তে --source . অপশনটি ব্যবহার করেছেন। এটি gcloud কমান্ডকে বলে দেয় যে, আপনি চান এটি বর্তমান ডিরেক্টরিতে ( --source . এর ভেতরের dot বর্তমান ডিরেক্টরির সংক্ষিপ্ত রূপ) খুঁজে পাওয়া সোর্স ফাইলগুলোর উপর ভিত্তি করে বিল্ডপ্যাক ব্যবহার করে আপনার কন্টেইনার ইমেজ তৈরি করুক। যেহেতু সার্ভিসটি স্বয়ংক্রিয়ভাবে কন্টেইনার ইমেজের বিষয়টি সামলে নেয়, তাই এই gcloud কমান্ডে আপনার কোনো ইমেজ নির্দিষ্ট করে দেওয়ার প্রয়োজন নেই।

এই ডিপ্লয়মেন্টটি কাজ করেছে কিনা তা পুনরায় যাচাই করতে, হাইলাইট করা Service URL টিতে ক্লিক করে আপনার চলমান অ্যাপটির একটি ওয়েব ব্রাউজার ট্যাব খুলুন এবং নিশ্চিত করুন যে আপনার সার্ভিসটি একটি এলোমেলো রঙের ব্যাকগ্রাউন্ডের সামনে "Hello from Cloud Run with Buildpacks!" বার্তাটি প্রদর্শন করছে।

লক্ষ্য করুন যে, বিল্ডপ্যাক ব্যবহার করে আপনার Dockerfile তৈরি করার মাধ্যমে আপনি মূলত তিনটি সহজ ধাপকে দুটি ধাপে কমিয়ে এনেছেন:

  1. আপনার ডেভেলপমেন্ট এনভায়রনমেন্টে একটি অ্যাপ তৈরি করুন।
  2. একটিমাত্র কমান্ডের মাধ্যমে হুবহু একই কোড ক্লাউডে ডেপ্লয় করুন।

৭. আমাকে কি কমান্ড লাইন ব্যবহার করতেই হবে?

না! প্রায় প্রতিটি গুগল ক্লাউড পরিষেবার মতোই, ক্লাউড রানের সাথে ইন্টারঅ্যাক্ট করার তিনটি উপায় রয়েছে:

  • gcloud কমান্ড লাইন টুলটি, যা আপনি এইমাত্র দেখেছেন।
  • ক্লাউড কনসোলের মাধ্যমে একটি সমৃদ্ধ ওয়েব ইউজার ইন্টারফেস, যা একটি স্বজ্ঞামূলক পয়েন্ট অ্যান্ড ক্লিক ইন্টারঅ্যাকশন শৈলী সমর্থন করে।
  • প্রোগ্রাম্যাটিকভাবে, জাভা, সি#, পাইথন, গো, জাভাস্ক্রিপ্ট, রুবি, সি/সি++ সহ অন্যান্য অনেক জনপ্রিয় ভাষার জন্য উপলব্ধ গুগল ক্লায়েন্ট লাইব্রেরি ব্যবহার করে।

চলুন কনসোল UI ব্যবহার করে আপনার ক্লাউড রান অ্যাপের একটি অতিরিক্ত ইনস্ট্যান্স ডেপ্লয় করি। উপরের-বামের মেনুর মাধ্যমে ক্লাউড রান সার্ভিস ল্যান্ডিং পেজে যান:

e2b4983b38c81796.png

এরপর আপনি আপনার ক্লাউড রান সার্ভিসগুলোর একটি সারাংশ দেখতে পাবেন, যা দেখতে এইরকম হবে:

b335e7bf0a3af845.png

ডেপ্লয়মেন্ট প্রক্রিয়া শুরু করতে 'Create Service' লিঙ্কে ক্লিক করুন:

51f61a8ddc7a4c0b.png

সার্ভিসের নাম হিসেবে 'hello-again' লিখুন, ডিফল্ট ডেপ্লয়মেন্ট প্ল্যাটফর্ম ও অঞ্চল নির্বাচন করুন এবং 'Next'-এ ক্লিক করুন।

8a17baa45336c4c9.png

কন্টেইনার ইমেজের জন্য এই URL-টি দিন: gcr.io/cloudrun/hello , যেটি গুগলের পরীক্ষার উদ্দেশ্যে তৈরি একটি কন্টেইনার, এবং আপনার জন্য উপলব্ধ অনেক কনফিগারেশন সেটিংসের কয়েকটি দেখতে "Advanced Settings" ড্রপ-ডাউনে ক্লিক করুন। কয়েকটি উল্লেখ করা হলো যা আপনি কাস্টমাইজ করতে পারেন:

  • পোর্ট নম্বর এবং কন্টেইনার এন্ট্রি পয়েন্ট (যা কন্টেইনার তৈরির সময় নির্দিষ্ট করা এন্ট্রি পয়েন্টকে বাতিল করবে)
  • হার্ডওয়্যার: মেমরি এবং সিপিইউ-এর সংখ্যা
  • স্কেলিং: সর্বনিম্ন এবং সর্বোচ্চ ইনস্ট্যান্স
  • পরিবেশগত ভেরিয়েবল
  • অন্যান্য: অনুরোধের সময়সীমা নির্ধারণ, প্রতি কন্টেইনারে সর্বোচ্চ অনুরোধের সংখ্যা, HTTP/2

ডায়ালগটি এগিয়ে নিতে "Next" বোতামে ক্লিক করুন। পরবর্তী ডায়ালগটি আপনাকে আপনার পরিষেবাটি কীভাবে চালু হবে তা নির্দিষ্ট করার সুযোগ দেবে। "Ingress"-এর জন্য "allow all traffic" নির্বাচন করুন, এবং "Authentication"-এর জন্য "Allow unauthenticated traffic" নির্বাচন করুন।

e78281d1cff3418.png

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

এখন আপনার ক্লাউড রান সার্ভিস তৈরি করতে Create ) বোতামে ক্লিক করুন। কয়েক সেকেন্ড পর, আপনি আপনার ক্লাউড রান সার্ভিসের সারসংক্ষেপ তালিকায় আপনার নতুন সার্ভিসটি দেখতে পাবেন। সারসংক্ষেপ লাইনটিতে কিছু গুরুত্বপূর্ণ কনফিগারেশন সেটিংস সহ সর্বশেষ ডেপ্লয়মেন্টের (তারিখ/সময় এবং কার দ্বারা) তথ্য থাকে। আপনার নতুন সার্ভিস সম্পর্কে বিস্তারিত জানতে সার্ভিসের নামের লিঙ্কে ক্লিক করুন।

আপনার পরিষেবা যাচাই করতে, সারাংশ পৃষ্ঠার উপরের দিকে দেখানো URL-টিতে ক্লিক করুন, যেমনটি নীচের উদাহরণে হাইলাইট করা হয়েছে:

6c35cf0636dddc51.png

আপনার এইরকম কিছু দেখা উচিত:

3ba6ab4fe0da1f84.png

এখন যেহেতু আপনি একটি নতুন ক্লাউড রান পরিষেবা স্থাপন করেছেন, একাধিক স্থাপনা পরিচালনা করার কিছু উপায় দেখতে REVISIONS ট্যাবটি নির্বাচন করুন।

2351ee7ec4a356f0.png

কনসোল থেকে সরাসরি নতুন রিভিশনগুলো ডেপ্লয় করতে, আপনি EDIT & DEPLOY NEW REVISION বাটনটিতে ক্লিক করতে পারেন, যেমনটি নিচের উদাহরণ স্ক্রিনশটে হাইলাইট করা হয়েছে:

a599fa88d00d6776.png

নতুন রিভিশন তৈরি করতে এখন ঐ বাটনটি ক্লিক করুন। কন্টেইনার URL-এর কাছে, SELECT বাটনটি ক্লিক করুন, যেমনটি নিচে দেখানো হয়েছে:

5fd1b1f8e1f11d40.png

যে ডায়ালগ বক্সটি আসবে, সেখানে আগে বিল্ডপ্যাকস ব্যবহার করে ক্লাউড বিল্ড থেকে ডেপ্লয় করা সিম্পল ওয়েব অ্যাপটি খুঁজুন এবং তারপর সিলেক্ট-এ ক্লিক করুন। নিশ্চিত করুন যে আপনি কন্টেইনার ইমেজটি বেছে নিয়েছেন।

gcr.io/<project>/cloud-run-source-deploy

ফোল্ডার , এইরকম:

8a756c6157face3a.png

একবার নির্বাচিত হলে, একদম নিচে স্ক্রোল করুন এবং DEPLOY বোতামে ক্লিক করুন। আপনি এখন আপনার অ্যাপের একটি নতুন সংস্করণ ডেপ্লয় করেছেন। যাচাই করার জন্য, আবার আপনার সার্ভিস URL-এ যান এবং দেখুন যে আপনি এখন আপনার রঙিন "Hello from Cloud Run with Buildpacks!" ওয়েব অ্যাপটি দেখতে পাচ্ছেন কি না।

যেমনটি আপনি দেখতে পাচ্ছেন, রিভিশন ট্যাবটি আপনার ডেপ্লয় করা প্রতিটি রিভিশনের একটি সারাংশ প্রদান করে, এবং এখন আপনি এই সার্ভিসটির জন্য দুটি রিভিশন দেখতে পাবেন। আপনি রিভিশনের নামের বাম দিকের রেডিও বাটনে ক্লিক করে একটি নির্দিষ্ট রিভিশন নির্বাচন করতে পারেন, যা স্ক্রিনের ডানদিকে রিভিশনের বিস্তারিত তথ্যের একটি সারাংশ প্রদর্শন করবে। ওই বাটনগুলো নির্বাচন করে আপনি দেখতে পারেন যে, আপনার দুটি রিভিশন দুটি ভিন্ন কন্টেইনার ইমেজ থেকে এসেছে।

MANAGE TRAFFIC বাটনটি আপনাকে একটি নির্দিষ্ট রিভিশনে পাঠানো ইনকামিং রিকোয়েস্টের বণ্টন পরিবর্তন করার সুযোগ দেয়। একটি নির্দিষ্ট রিভিশনে কী পরিমাণ ট্র্যাফিক পাঠানো হবে তা সূক্ষ্মভাবে নিয়ন্ত্রণ করার এই ক্ষমতা বেশ কিছু মূল্যবান ব্যবহারের সুযোগ তৈরি করে:

  • আগত ট্রাফিকের একটি ক্ষুদ্র অংশ ব্যবহার করে আপনার অ্যাপের নতুন সংস্করণ ক্যানারি টেস্টিং করা।
  • একটি সমস্যাযুক্ত রিলিজ থেকে ট্র্যাফিককে পূর্ববর্তী সংস্করণে ফিরিয়ে আনা
  • এ/বি টেস্টিং

MANAGE TRAFFIC বাটনটি এখানে খুঁজুন:

519d3c22ae028287.png

আপনার দুটি রিভিশনের মধ্যে ৫০/৫০ ট্র্যাফিক বিভাজন কনফিগার করতে, এইভাবে ৫০/৫০ ট্র্যাফিক স্প্লিট উল্লেখ করুন:

8c37d4f115d9ded4.png

এখন সেভ (SAVE) বোতামে ক্লিক করুন এবং আপনার সার্ভিসের ইউআরএল (URL)-এ বারবার গিয়ে পরীক্ষা করে দেখুন যে, গড়ে আপনার অনুরোধগুলোর অর্ধেক বর্তমান সংস্করণ ("Hello from Cloud Run with Buildpacks!") এবং বাকি অর্ধেক পূর্ববর্তী সংস্করণ ("It's running!") দ্বারা পরিবেশিত হচ্ছে।

সার্ভিস ডিটেইলস পেজের অন্যান্য ট্যাবগুলো পারফরম্যান্স, ট্র্যাফিক এবং লগ নিরীক্ষণ করার সুযোগ দেয়, যা আপনার সার্ভিসটি কতটা ভালোভাবে এবং কতটা দক্ষতার সাথে কাজ করছে সে সম্পর্কে মূল্যবান ধারণা দেয়। এছাড়াও, 'পারমিশনস' ট্যাবের মাধ্যমে আপনি আপনার সার্ভিসে অ্যাক্সেস সূক্ষ্মভাবে নিয়ন্ত্রণ করতে পারেন। এখানে উপলব্ধ সুবিধাগুলো সম্পর্কে ধারণা পেতে এই পেজের ট্যাবগুলো ঘুরে দেখতে কিছুক্ষণ সময় নিন।

প্রোগ্রাম্যাটিক ইন্টারফেস

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

৮. আপনার অ্যাপটি পরীক্ষা করুন

198ada162d1f0bf1.png

এই চূড়ান্ত ধাপে, আপনি আপনার অ্যাপের স্ট্রেস টেস্ট করার জন্য একটি কৃত্রিম লোড টেস্ট চালাবেন এবং দেখবেন যে আগত চাহিদার সাথে এটি কীভাবে খাপ খায়। আপনি 'hey' নামক একটি টুল ব্যবহার করবেন, যা ক্লাউড শেলে আগে থেকেই ইনস্টল করা থাকে এবং আমাদের লোড টেস্ট চালানো ও ফলাফল উপস্থাপন করার ক্ষমতা দেয়।

পরীক্ষাটি চালান

ক্লাউড শেল টার্মিনালে, লোড টেস্ট চালানোর জন্য এই কমান্ডটি চালান:

hey -q 1000 -c 200 -z 30s https://hello-...run.app

কমান্ড আর্গুমেন্টগুলো নিম্নরূপভাবে ব্যাখ্যা করা হয়:

  • -q 1000 - প্রতি সেকেন্ডে প্রায় ১,০০০ অনুরোধের হারে লোড চালনা করার চেষ্টা করুন
  • -c 200 - ২০০টি সমান্তরাল কর্মী বরাদ্দ করুন
  • -z 30s - ৩০ সেকেন্ডের জন্য লোড টেস্ট চালান
  • এই কমান্ড লাইনে আপনার সার্ভিস ইউআরএলটি শেষ আর্গুমেন্ট হিসেবে ব্যবহার করতে ভুলবেন না।

আপনার পরীক্ষার ফলাফল দেখতে অনেকটা এইরকম হবে:

 Summary:
 Total:        30.2767 secs
 Slowest:      3.3633 secs
 Fastest:      0.1071 secs
 Average:      0.1828 secs
 Requests/sec: 1087.2387
 Total data:   3028456 bytes
 Size/request: 92 bytes

Response time histogram:
 0.107 [1]     |
 0.433 [31346] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
 0.758 [1472]  |■■
 1.084 [82]    |
 1.410 [4]     |
...

Latency distribution:
...
 50% in 0.1528 secs
 75% in 0.1949 secs
 90% in 0.2442 secs
 95% in 0.4052 secs
 99% in 0.7062 secs

Details (average, fastest, slowest):
...
 req write:    0.0000 secs, 0.0000 secs, 0.0232 secs
 resp wait:    0.1824 secs, 0.1070 secs, 3.2953 secs
 resp read:    0.0000 secs, 0.0000 secs, 0.0010 secs
Status code distribution:
 [200] 32918 responses

এই সারসংক্ষেপটি আমাদের কয়েকটি গুরুত্বপূর্ণ বিষয় জানায়:

  • ৩০ সেকেন্ড ধরে প্রতি সেকেন্ডে প্রায় ১ হাজার হারে ৩২,৯১৮টি অনুরোধ পাঠানো হয়েছিল।
  • কোনো ত্রুটি ছিল না (শুধুমাত্র 200 HTTP প্রতিক্রিয়া ছিল)।
  • গড় লেটেন্সি ছিল ১৮০ মিলিসেকেন্ড।
  • সর্বনিম্ন ল্যাটেন্সি ছিল ১০৭ মিলিসেকেন্ড, এবং সবচেয়ে খারাপ ক্ষেত্রে ছিল ৩.৩ সেকেন্ড।
  • ৯০তম পার্সেন্টাইল লেটেন্সি ছিল ২৪৪ মিলিসেকেন্ড।

আপনি যদি ক্লাউড রান কনসোলের METRICS ট্যাবটি দেখেন, তাহলে পারফরম্যান্সের সার্ভার-সংক্রান্ত চিত্রটি দেখতে পাবেন:

e635c6831c468dd3.png

৯. পরিষ্কার করা

পরিষেবাটি ব্যবহার না করা হলে ক্লাউড রান কোনো চার্জ না নিলেও, বিল্ড করা কন্টেইনার ইমেজটি সংরক্ষণের জন্য আপনাকে চার্জ করা হতে পারে।

চার্জ এড়ানোর জন্য আপনি আপনার GCP প্রজেক্টটি ডিলিট করে দিতে পারেন, যার ফলে ওই প্রজেক্টে ব্যবহৃত সমস্ত রিসোর্সের বিলিং বন্ধ হয়ে যাবে, অথবা এই কমান্ডটি ব্যবহার করে আপনার কন্টেইনার ইমেজটি ডিলিট করে দিতে পারেন:

gcloud container images delete $TAG

আপনার ক্লাউড রান পরিষেবাগুলি মুছে ফেলতে, এই কমান্ডগুলি ব্যবহার করুন:

gcloud run services delete hello --platform managed --region $REGION --quiet
gcloud run services delete hello-again --platform managed --region $REGION --quiet

১০. তুমি পেরেছ!

9a31f4fdbbf1ddcb.png

অভিনন্দন - আপনি সফলভাবে একটি প্রোডাকশন ক্লাউড রান অ্যাপ তৈরি এবং ডেপ্লয় করেছেন। এই প্রক্রিয়ার মধ্যে, আপনি কন্টেইনার এবং কীভাবে নিজের কন্টেইনার তৈরি করতে হয় সে সম্পর্কে শিখেছেন। এবং আপনি দেখেছেন যে, gcloud কমান্ড লাইন টুল এবং ক্লাউড কনসোল উভয়ই ব্যবহার করে ক্লাউড রানের মাধ্যমে আপনার অ্যাপ ডেপ্লয় করা কতটা সহজ। এখন আপনি জানেন কীভাবে আপনার এই চমৎকার সৃষ্টিগুলো সারা বিশ্বের সাথে শেয়ার করতে হয়!

আমি আপনাদের জন্য একটি গুরুত্বপূর্ণ প্রশ্ন রেখে যেতে চাই:

আপনার ডেভেলপার এনভায়রনমেন্টে অ্যাপটি চালু করার পর, ক্লাউড রানের দেওয়া সমস্ত প্রোডাকশন-গ্রেড বৈশিষ্ট্যসহ ক্লাউডে এটি ডেপ্লয় করতে আপনাকে কত লাইন কোড পরিবর্তন করতে হয়েছিল?

উত্তরটা অবশ্যই শূন্য। :)

দেখে নেওয়ার মতো কোডল্যাবস...

অন্বেষণ করার মতো আরও আকর্ষণীয় বৈশিষ্ট্য...

রেফারেন্স ডকুমেন্ট...

১১. পদক্ষেপ গ্রহণের আহ্বান

গুগল ক্লাউড লোগো

আপনি যদি এই কোডল্যাবটি উপভোগ করে থাকেন এবং গুগল ক্লাউডের সাথে হাতে-কলমে আরও সময় কাটাতে আগ্রহী হন, তাহলে আজই গুগল ক্লাউড ইনোভেটরস-এ যোগদান করুন !

উদ্ভাবকদের সাধারণ সদস্য ব্যাজ লোগো

গুগল ক্লাউড ইনোভেটরস বিনামূল্যে এবং এতে অন্তর্ভুক্ত রয়েছে:

  • গুগল কর্মীদের কাছ থেকে সরাসরি সর্বশেষ তথ্য জানতে লাইভ আলোচনা , এএমএ (AMA), এবং রোডম্যাপ সেশনে অংশ নিন।
  • গুগল ক্লাউডের সর্বশেষ খবর সরাসরি আপনার ইনবক্সে।
  • ডিজিটাল ব্যাজ এবং ভিডিও কনফারেন্সের পটভূমি
  • স্কিলস বুস্ট-এ ৫০০ ক্রেডিটের ল্যাব ও লার্নিং

নিবন্ধন করতে এখানে ক্লিক করুন!