1. ভূমিকা
পাইথন একটি জনপ্রিয় ওপেন সোর্স প্রোগ্রামিং ভাষা যা ডেটা বিজ্ঞানী, ওয়েব অ্যাপ্লিকেশন ডেভেলপার, সিস্টেম অ্যাডমিনিস্ট্রেটর এবং আরও অনেক কিছু দ্বারা ব্যবহৃত হয়।
ক্লাউড ফাংশন একটি ইভেন্ট-চালিত সার্ভারহীন গণনা প্ল্যাটফর্ম। ক্লাউড ফাংশন আপনাকে রিসোর্স সরবরাহ বা পরিবর্তনের প্রয়োজনীয়তাগুলি পরিচালনা করার জন্য স্কেলিং সম্পর্কে চিন্তা না করেই আপনার কোড লিখতে দেয়৷
ক্লাউড ফাংশন দুই ধরনের আছে:
- HTTP ফাংশন HTTP অনুরোধে সাড়া দেয়। আপনি এই কোডল্যাবে একটি দম্পতি তৈরি করবেন।
- ব্যাকগ্রাউন্ড ফাংশনগুলি ইভেন্টগুলির দ্বারা ট্রিগার হয়, যেমন ক্লাউড পাব/সাব -এ একটি বার্তা প্রকাশিত হওয়া বা ক্লাউড স্টোরেজে আপলোড করা ফাইল৷ আমরা এই ল্যাবে এটিকে সম্বোধন করি না, তবে আপনি ডকুমেন্টেশনে আরও পড়তে পারেন৷
এই কোডল্যাব আপনাকে পাইথনে আপনার নিজস্ব ক্লাউড ফাংশন তৈরি করার মাধ্যমে নিয়ে যাবে।
আপনি কি নির্মাণ করবেন
এই কোডল্যাবে, আপনি একটি ক্লাউড ফাংশন প্রকাশ করবেন যা, যখন HTTP এর মাধ্যমে আহ্বান করা হয়, তখন "পাইথন চালিত" লোগো প্রদর্শন করে:
আপনি কি শিখবেন
- কিভাবে একটি HTTP ক্লাউড ফাংশন লিখতে হয়।
- কিভাবে একটি HTTP ক্লাউড ফাংশন লিখতে হয় যা আর্গুমেন্ট নেয়।
- কীভাবে একটি HTTP ক্লাউড ফাংশন পরীক্ষা করবেন।
- ফাংশন চেষ্টা করার জন্য একটি স্থানীয় পাইথন HTTP সার্ভার কিভাবে চালানো যায়।
- কিভাবে একটি HTTP ক্লাউড ফাংশন লিখতে হয় যা একটি চিত্র প্রদান করে।
2. সেটআপ এবং প্রয়োজনীয়তা
স্ব-গতিসম্পন্ন পরিবেশ সেটআপ
- Google ক্লাউড কনসোলে সাইন-ইন করুন এবং একটি নতুন প্রকল্প তৈরি করুন বা বিদ্যমান একটি পুনরায় ব্যবহার করুন৷ আপনার যদি ইতিমধ্যেই একটি Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তাহলে আপনাকে অবশ্যই একটি তৈরি করতে হবে।
- প্রকল্পের নাম এই প্রকল্পের অংশগ্রহণকারীদের জন্য প্রদর্শনের নাম। এটি একটি অক্ষর স্ট্রিং যা Google API দ্বারা ব্যবহৃত হয় না। আপনি সবসময় এটি আপডেট করতে পারেন.
- প্রোজেক্ট আইডি সমস্ত Google ক্লাউড প্রোজেক্ট জুড়ে অনন্য এবং অপরিবর্তনীয় (সেট করার পরে পরিবর্তন করা যাবে না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত আপনি এটা কি যত্ন না. বেশিরভাগ কোডল্যাবে, আপনাকে আপনার প্রকল্প আইডি উল্লেখ করতে হবে (সাধারণত
PROJECT_ID
হিসাবে চিহ্নিত)। আপনি যদি জেনারেট করা আইডি পছন্দ না করেন, তাহলে আপনি অন্য একটি এলোমেলো আইডি তৈরি করতে পারেন। বিকল্পভাবে, আপনি নিজের চেষ্টা করতে পারেন, এবং এটি উপলব্ধ কিনা দেখতে পারেন। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রকল্পের সময়কালের জন্য থাকে। - আপনার তথ্যের জন্য, একটি তৃতীয় মান আছে, একটি প্রকল্প নম্বর , যা কিছু API ব্যবহার করে। ডকুমেন্টেশনে এই তিনটি মান সম্পর্কে আরও জানুন।
- এরপরে, ক্লাউড রিসোর্স/এপিআই ব্যবহার করতে আপনাকে ক্লাউড কনসোলে বিলিং সক্ষম করতে হবে। এই কোডল্যাবের মাধ্যমে চালানোর জন্য খুব বেশি খরচ হবে না, যদি কিছু হয়। এই টিউটোরিয়ালের বাইরে বিলিং এড়াতে সংস্থানগুলি বন্ধ করতে, আপনি আপনার তৈরি করা সংস্থানগুলি মুছতে বা প্রকল্প মুছতে পারেন। নতুন Google ক্লাউড ব্যবহারকারীরা $300 USD বিনামূল্যের ট্রায়াল প্রোগ্রামের জন্য যোগ্য৷
ক্লাউড শেল শুরু করুন
যদিও Google ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালিত হতে পারে, এই কোডল্যাবে আপনি ক্লাউড শেল ব্যবহার করবেন, ক্লাউডে চলমান একটি কমান্ড লাইন পরিবেশ।
ক্লাউড শেল সক্রিয় করুন
- ক্লাউড কনসোল থেকে, ক্লাউড শেল সক্রিয় করুন ক্লিক করুন .
যদি এটি আপনার প্রথমবার ক্লাউড শেল শুরু হয়, তাহলে এটি কী তা বর্ণনা করে আপনাকে একটি মধ্যবর্তী স্ক্রীন উপস্থাপন করা হবে। যদি আপনি একটি মধ্যবর্তী স্ক্রীনের সাথে উপস্থাপিত হন, তবে চালিয়ে যান ক্লিক করুন।
ক্লাউড শেলের সাথে সংযোগ করতে এবং সংযোগ করতে এটির মাত্র কয়েক মুহূর্ত লাগবে৷
এই ভার্চুয়াল মেশিনটি প্রয়োজনীয় সমস্ত বিকাশের সরঞ্জাম দিয়ে লোড করা হয়েছে। এটি একটি ক্রমাগত 5 GB হোম ডিরেক্টরি অফার করে এবং Google ক্লাউডে চলে, যা নেটওয়ার্ক কর্মক্ষমতা এবং প্রমাণীকরণকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার অনেক কাজ, যদি সব না হয়, ব্রাউজার দিয়ে করা যেতে পারে।
একবার ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, আপনি দেখতে পাবেন যে আপনি প্রমাণীকৃত হয়েছেন এবং প্রকল্পটি আপনার প্রকল্প আইডিতে সেট করা আছে।
- আপনি প্রমাণীকৃত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud auth list
কমান্ড আউটপুট
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- gcloud কমান্ড আপনার প্রকল্প সম্পর্কে জানে তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud config list project
কমান্ড আউটপুট
[core] project = <PROJECT_ID>
যদি এটি না হয়, আপনি এই কমান্ড দিয়ে এটি সেট করতে পারেন:
gcloud config set project <PROJECT_ID>
কমান্ড আউটপুট
Updated property [core/project].
ক্লাউড ফাংশন এবং ক্লাউড বিল্ড এপিআই সক্ষম করা আছে তা নিশ্চিত করুন
ক্লাউড ফাংশন এবং ক্লাউড বিল্ড এপিআই সক্ষম করা হয়েছে তা নিশ্চিত করতে ক্লাউড শেল থেকে নিম্নলিখিত কমান্ডটি চালান:
gcloud services enable \ cloudfunctions.googleapis.com \ cloudbuild.googleapis.com
দ্রষ্টব্য: ক্লাউড বিল্ডকে gcloud functions deploy
কমান্ড দ্বারা কল করা হবে এবং স্বয়ংক্রিয়ভাবে আপনার কোডটি একটি কন্টেইনার ছবিতে তৈরি করবে।
সোর্স কোড ডাউনলোড করুন
ক্লাউড শেল টার্মিনাল থেকে, নিম্নলিখিত কমান্ডগুলি চালান:
REPO_NAME="codelabs" REPO_URL="https://github.com/GoogleCloudPlatform/$REPO_NAME" SOURCE_DIR="cloud-functions-python-http" git clone --no-checkout --filter=blob:none --depth=1 $REPO_URL cd $REPO_NAME git sparse-checkout set $SOURCE_DIR git checkout cd $SOURCE_DIR
উৎস ডিরেক্টরির বিষয়বস্তু দেখুন:
ls
আপনার নিম্নলিখিত ফাইল থাকা উচিত:
main.py python-powered.png test_main.py web_app.py
3. HTTP ক্লাউড ফাংশন প্রবর্তন
পাইথনে HTTP ক্লাউড ফাংশনগুলি নিয়মিত পাইথন ফাংশন হিসাবে লেখা হয়। ফাংশনটিকে অবশ্যই একটি একক flask.Request
গ্রহণ করতে হবে৷ অনুরোধ আর্গুমেন্ট, যা সাধারণত request
নামে পরিচিত৷
main.py
import flask
def hello_world(request: flask.Request) -> flask.Response:
"""HTTP Cloud Function.
Returns:
- "Hello World! 👋"
"""
response = "Hello World! 👋"
return flask.Response(response, mimetype="text/plain")
# ...
আপনি আপনার পছন্দের কমান্ড লাইন সম্পাদক (ন্যানো, ভিম, বা ইমাক্স) দিয়ে ফাইলটি খুলতে পারেন। সোর্স ডিরেক্টরিটিকে ওয়ার্কস্পেস হিসাবে সেট করার পরে আপনি ক্লাউড শেল এডিটরে এটি খুলতে পারেন:
cloudshell open-workspace .
gcloud functions deploy
কমান্ড ব্যবহার করে একটি HTTP ক্লাউড ফাংশন হিসাবে এই ফাংশনটি স্থাপন করা যাক:
FUNCTION_NAME="hello_world" gcloud functions deploy $FUNCTION_NAME \ --runtime python312 \ --trigger-http \ --allow-unauthenticated
কমান্ড আউটপুট:
... Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 ... entryPoint: FUNCTION_NAME httpsTrigger: url: https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME ...
gcloud functions deploy
বিকল্পগুলি সম্পর্কে নোট:
-
--runtime
: এটি ভাষা রানটাইম নির্দিষ্ট করে। পাইথনের জন্য, এটি বর্তমানেpython37
,python38
,python39
,python310
, বাpython312
হতে পারে। রানটাইম দেখুন। -
--trigger-http
: ফাংশনটি একটি এন্ডপয়েন্ট বরাদ্দ করা হবে। এন্ডপয়েন্টে HTTP অনুরোধ (POST, PUT, GET, DELETE, এবং OPTIONS) ফাংশন এক্সিকিউশনকে ট্রিগার করবে। -
--allow-unauthenticated
: ফাংশনটি সর্বজনীন হবে, প্রমাণীকরণ পরীক্ষা না করেই সমস্ত কলারকে অনুমতি দেবে। - আরও জানতে, gcloud ফাংশন স্থাপন দেখুন।
ফাংশনটি পরীক্ষা করতে, আপনি উপরের কমান্ড আউটপুটে প্রদর্শিত httpsTrigger.url
URL-এ ক্লিক করতে পারেন। এছাড়াও আপনি প্রোগ্রাম্যাটিকভাবে URL পুনরুদ্ধার করতে পারেন এবং নিম্নলিখিত কমান্ডগুলির সাথে ফাংশনটি কল করতে পারেন:
URL=$(gcloud functions describe $FUNCTION_NAME --format "value(httpsTrigger.url)") curl -w "\n" $URL
আপনি নিম্নলিখিত ফলাফল পেতে হবে:
Hello World! 👋
4. একটি HTTP ক্লাউড ফাংশন লেখা যা আর্গুমেন্ট নেয়
যখন তারা যুক্তি গ্রহণ করে তখন ফাংশনগুলি আরও বহুমুখী হয়। আসুন একটি নতুন ফাংশন hello_name
সংজ্ঞায়িত করি যা একটি name
পরামিতি সমর্থন করে:
main.py
# ...
def hello_name(request: flask.Request) -> flask.Response:
"""HTTP Cloud Function.
Returns:
- "Hello {NAME}! 🚀" if "name=NAME" is defined in the GET request
- "Hello World! 🚀" otherwise
"""
name = request.args.get("name", "World")
response = f"Hello {name}! 🚀"
return flask.Response(response, mimetype="text/plain")
# ...
এই নতুন ফাংশন স্থাপন করা যাক:
FUNCTION_NAME="hello_name" gcloud functions deploy $FUNCTION_NAME \ --runtime python312 \ --trigger-http \ --allow-unauthenticated
কমান্ড আউটপুট:
... Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 ... entryPoint: FUNCTION_NAME httpsTrigger: url: https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME ...
ফাংশনটি পরীক্ষা করতে, আপনি উপরের কমান্ড আউটপুটে প্রদর্শিত httpsTrigger.url
URL-এ ক্লিক করতে পারেন। এছাড়াও আপনি প্রোগ্রাম্যাটিকভাবে URL পুনরুদ্ধার করতে পারেন এবং নিম্নলিখিত কমান্ডগুলির সাথে ফাংশনটি কল করতে পারেন:
URL=$(gcloud functions describe $FUNCTION_NAME --format "value(httpsTrigger.url)") curl -w "\n" $URL
আপনি ডিফল্ট ফলাফল পেতে হবে:
Hello World! 🚀
আপনি ডিফল্ট ফলাফল পাচ্ছেন কারণ name
যুক্তি সেট করা নেই৷ URL এ একটি প্যারামিটার যোগ করুন:
curl -w "\n" $URL?name=YOUR%20NAME
এই সময়, আপনি আপনার কাস্টম প্রতিক্রিয়া পাবেন:
Hello YOUR NAME! 🚀
সোর্স কোড আপডেট হয়ে গেলে আপনার ফাংশনগুলি উদ্দেশ্য অনুযায়ী কাজ করতে থাকে তা নিশ্চিত করার জন্য পরবর্তী ধাপ হল ইউনিট পরীক্ষা যোগ করা।
5. লেখার পরীক্ষা
পাইথনে HTTP ক্লাউড ফাংশনগুলি স্ট্যান্ডার্ড লাইব্রেরি থেকে unittest
মডিউল ব্যবহার করে পরীক্ষা করা হয়। আপনার ফাংশন পরীক্ষা করার জন্য একটি এমুলেটর বা অন্য সিমুলেশন চালানোর প্রয়োজন নেই - শুধুমাত্র সাধারণ পাইথন কোড।
hello_world
এবং hello_name
ফাংশনগুলির জন্য একটি পরীক্ষা কেমন দেখায় তা এখানে:
test_main.py
import unittest
import unittest.mock
import main
class TestHello(unittest.TestCase):
def test_hello_world(self):
request = unittest.mock.Mock()
response = main.hello_world(request)
assert response.status_code == 200
assert response.get_data(as_text=True) == "Hello World! 👋"
def test_hello_name_no_name(self):
request = unittest.mock.Mock(args={})
response = main.hello_name(request)
assert response.status_code == 200
assert response.get_data(as_text=True) == "Hello World! 🚀"
def test_hello_name_with_name(self):
name = "FirstName LastName"
request = unittest.mock.Mock(args={"name": name})
response = main.hello_name(request)
assert response.status_code == 200
assert response.get_data(as_text=True) == f"Hello {name}! 🚀"
- পাইথন পরীক্ষাগুলি অন্যান্য পাইথন ফাইলগুলির মতো একইভাবে লেখা হয়। তারা আমদানির একটি সেট দিয়ে শুরু করে, তারপর ক্লাস এবং ফাংশন সংজ্ঞায়িত করে।
- পরীক্ষার ঘোষণাটি
class TestHello(TestCase)
। এটি অবশ্যই এমন একটি শ্রেণী হতে হবে যাunittest.TestCase
থেকে উত্তরাধিকার সূত্রে প্রাপ্ত। - পরীক্ষার শ্রেণীতে পদ্ধতি রয়েছে, যার প্রতিটি অবশ্যই
test_
দিয়ে শুরু হবে, যা পৃথক পরীক্ষার ক্ষেত্রে প্রতিনিধিত্ব করে। - প্রতিটি টেস্ট কেস
request
প্যারামিটারকে উপহাস করে আমাদের একটি ফাংশন পরীক্ষা করে (অর্থাৎ পরীক্ষার জন্য প্রয়োজনীয় নির্দিষ্ট ডেটা দিয়ে একটি জাল বস্তু দিয়ে প্রতিস্থাপন করা)। - প্রতিটি ফাংশন আহ্বান করার পরে, পরীক্ষাটি HTTP প্রতিক্রিয়া পরীক্ষা করে নিশ্চিত হয় যে আমরা যা আশা করছিলাম তা ছিল।
main.py
যেহেতু flask
এর উপর নির্ভর করে, নিশ্চিত করুন যে আপনার পরীক্ষার পরিবেশে Flask ফ্রেমওয়ার্ক ইনস্টল করা আছে:
pip install flask
ফ্লাস্ক আউটপুট ইনস্টল করার ফলে নিম্নলিখিতগুলির অনুরূপ:
Collecting flask ... Successfully installed ... flask-3.0.2 ...
স্থানীয়ভাবে এই পরীক্ষাগুলি চালান:
python -m unittest
তিনটি ইউনিট পরীক্ষা পাস করা উচিত:
... ---------------------------------------------------------------------- Ran 3 tests in 0.001s OK
এর পরে, আপনি একটি নতুন ফাংশন তৈরি করবেন যা "পাইথন চালিত" লোগো প্রদান করবে।
6. "পাইথন চালিত" HTTP ক্লাউড ফাংশন লেখা
আসুন প্রতিটি অনুরোধের জন্য "পাইথন চালিত" চিত্রটি ফিরিয়ে দিয়ে একটি নতুন ফাংশনকে আরও বিনোদনমূলক করে তুলি:
নিম্নলিখিত তালিকা এটি ঘটতে কোড দেখায়:
main.py
# ...
def python_powered(request: flask.Request) -> flask.Response:
"""HTTP Cloud Function.
Returns:
- The official "Python Powered" logo
"""
return flask.send_file("python-powered.png")
একটি নতুন python_powered
ফাংশন স্থাপন করুন:
FUNCTION_NAME="python_powered" gcloud functions deploy $FUNCTION_NAME \ --runtime python312 \ --trigger-http \ --allow-unauthenticated
কমান্ড আউটপুট:
... Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 ... entryPoint: FUNCTION_NAME httpsTrigger: url: https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME ...
ফাংশনটি পরীক্ষা করতে, উপরের কমান্ড আউটপুটে প্রদর্শিত httpsTrigger.url
URL-এ ক্লিক করুন। সবকিছু সঠিকভাবে কাজ করলে, আপনি একটি নতুন ব্রাউজার ট্যাবে "পাইথন চালিত" লোগো দেখতে পাবেন!
এর পরে, আপনি একটি অ্যাপ তৈরি করবেন যাতে আপনি স্থাপনের আগে স্থানীয়ভাবে আপনার ফাংশন চালাতে এবং চেষ্টা করতে পারেন।
7. স্থানীয়ভাবে ফাংশন চালানো
আপনি একটি ওয়েব অ্যাপ তৈরি করে এবং একটি রুটে আপনার ফাংশন কল করে স্থানীয়ভাবে একটি HTTP ফাংশন চালাতে পারেন। আপনি আপনার ফাংশন হিসাবে একই ডিরেক্টরিতে এটি যোগ করতে পারেন। web_app.py
নামের ফাইলটিতে নিম্নলিখিত বিষয়বস্তু রয়েছে:
web_app.py
import flask
import main
app = flask.Flask(__name__)
@app.get("/")
def index():
return main.python_powered(flask.request)
if __name__ == "__main__":
# Local development only
# Run "python web_app.py" and open http://localhost:8080
app.run(host="localhost", port=8080, debug=True)
- এই ফাইলটি একটি ফ্লাস্ক অ্যাপ্লিকেশন তৈরি করে।
- এটি বেস ইউআরএলে একটি রুট নিবন্ধন করে যা
index()
নামে একটি ফাংশন দিয়ে পরিচালনা করা হয়। -
index()
ফাংশনটি তখন আমাদেরpython_powered
ফাংশনকে কল করে, এটি বর্তমান অনুরোধটি পাস করে।
আপনার উন্নয়ন পরিবেশে ফ্লাস্ক ফ্রেমওয়ার্ক ইনস্টল করা আছে তা নিশ্চিত করুন:
pip install flask
ফ্লাস্ক আউটপুট ইনস্টল করার ফলে নিম্নলিখিতগুলির অনুরূপ:
Collecting flask ... Successfully installed ... flask-3.0.2 ...
স্থানীয়ভাবে এই অ্যাপ্লিকেশনটি চালানোর জন্য, নিম্নলিখিত কমান্ডটি চালান:
python web_app.py
এখন আপনার ব্রাউজারে ওয়েব অ্যাপ পরীক্ষা করতে ক্লাউড শেল ওয়েব প্রিভিউ ব্যবহার করুন। ক্লাউড শেলে, "ওয়েব প্রিভিউ" বোতামে ক্লিক করুন এবং "পোর্ট 8080 এর পূর্বরূপ" নির্বাচন করুন:
ক্লাউড শেল একটি নতুন ব্রাউজার উইন্ডোতে তার প্রক্সি পরিষেবাতে পূর্বরূপ URL খোলে। ওয়েব প্রিভিউ শুধুমাত্র আপনার ব্যবহারকারীর অ্যাকাউন্টে HTTPS-এ অ্যাক্সেস সীমাবদ্ধ করে। সবকিছু সঠিকভাবে কাজ করলে, আপনার "পাইথন চালিত" লোগোটি দেখতে হবে!
8. অভিনন্দন!
আপনি এইচটিটিপি ক্লাউড ফাংশন স্থাপন করেছেন, ফ্লাস্ক ফ্রেমওয়ার্কের সাথে ওয়েব অনুরোধগুলি পরিচালনা করে এমন ইডিওম্যাটিক ফাংশন ব্যবহার করে৷
ক্লাউড ফাংশনগুলির মূল্য নির্ধারণ করা হয় আপনার ফাংশনটি কতবার আহ্বান করা হয়েছে তার উপর ভিত্তি করে, যার মধ্যে ফাংশনগুলির জন্য একটি বিনামূল্যের স্তর রয়েছে যা প্রায়শই চালানো হয় না৷ একবার আপনি আপনার ক্লাউড ফাংশনগুলি পরীক্ষা করার পরে, আপনি gcloud
ব্যবহার করে সেগুলি মুছতে পারেন:
gcloud functions delete hello_world --quiet gcloud functions delete hello_name --quiet gcloud functions delete python_powered --quiet
এছাড়াও আপনি Google ক্লাউড কনসোল থেকে ফাংশন মুছে ফেলতে পারেন।
আমরা আশা করি আপনি পাইথনে ক্লাউড ফাংশন ব্যবহার করে উপভোগ করবেন!