১. সংক্ষিপ্ত বিবরণ
নিরাপত্তা উন্নত করার জন্য আপনি ক্লাউড রান-এ একটি পরিষেবা ডেপ্লয় করার ডিফল্ট ধাপগুলো পরিবর্তন করবেন এবং তারপর দেখবেন কীভাবে ডেপ্লয় করা অ্যাপটি নিরাপদে অ্যাক্সেস করা যায়। অ্যাপটি হলো সিম্বাল ইটস অ্যাপ্লিকেশনের একটি "পার্টনার রেজিস্ট্রেশন সার্ভিস", যা সিম্বাল ইটস-এর সাথে কাজ করা কোম্পানিগুলো খাবারের অর্ডার প্রসেস করার জন্য ব্যবহার করে।
আপনি যা শিখবেন
ক্লাউড রান-এ একটি অ্যাপ ডেপ্লয় করার জন্য ডিফল্ট ন্যূনতম ধাপগুলিতে কয়েকটি ছোট পরিবর্তন করে, আপনি এর নিরাপত্তা উল্লেখযোগ্যভাবে বাড়াতে পারেন। আপনি একটি বিদ্যমান অ্যাপ এবং ডেপ্লয়মেন্ট নির্দেশাবলী নেবেন এবং ডেপ্লয় করা অ্যাপটির নিরাপত্তা উন্নত করার জন্য ডেপ্লয়মেন্টের ধাপগুলি পরিবর্তন করবেন।
এরপর আপনি দেখতে পাবেন কীভাবে অ্যাপটিতে প্রবেশের অনুমতি দিতে হয় এবং অনুমোদিত অনুরোধ করতে হয়।
এটি অ্যাপ্লিকেশন ডেপ্লয়মেন্ট নিরাপত্তার একটি বিশদ আলোচনা নয়, বরং আপনার ভবিষ্যতের সমস্ত অ্যাপ ডেপ্লয়মেন্টে এমন কিছু পরিবর্তনের দিকে আলোকপাত করা হয়েছে যা খুব অল্প পরিশ্রমে সেগুলোর নিরাপত্তা উন্নত করবে।
২. সেটআপ এবং প্রয়োজনীয়তা
স্ব-গতিতে পরিবেশ সেটআপ
- Google Cloud Console- এ সাইন-ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। যদি আপনার আগে থেকে Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।



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

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

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

এই ভার্চুয়াল মেশিনটিতে আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুলস লোড করা আছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি প্রদান করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক পারফরম্যান্স ও অথেনটিকেশনকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার প্রায় সমস্ত কাজই শুধুমাত্র একটি ব্রাউজার বা আপনার ক্রোমবুক দিয়ে করা সম্ভব।
ক্লাউড শেলে সংযুক্ত হওয়ার পর আপনি দেখতে পাবেন যে, আপনাকে ইতিমধ্যেই প্রমাণীকৃত করা হয়েছে এবং প্রজেক্টটি আপনার প্রজেক্ট আইডিতে সেট করা আছে।
- আপনি প্রমাণীকৃত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
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].
পরিবেশ সেটআপ
এই ল্যাবের জন্য আপনাকে ক্লাউড শেল কমান্ড লাইনে কমান্ড চালাতে হবে। আপনি সাধারণত কমান্ডগুলো সরাসরি কপি করে পেস্ট করতে পারবেন, তবে কিছু ক্ষেত্রে আপনাকে প্লেসহোল্ডার ভ্যালুগুলো পরিবর্তন করে সঠিক ভ্যালু বসাতে হবে।
- পরবর্তী কমান্ডগুলিতে ব্যবহারের জন্য প্রজেক্ট আইডি-তে একটি এনভায়রনমেন্ট ভেরিয়েবল সেট করুন:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export SERVICE_NAME=partner-registration-service
- আপনার অ্যাপ চালানোর জন্য ক্লাউড রান সার্ভিস এপিআই, নোএসকিউএল ডেটা স্টোরেজ প্রদানের জন্য ফায়ারস্টোর এপিআই, ডিপ্লয়মেন্ট কমান্ড দ্বারা ব্যবহৃত ক্লাউড বিল্ড এপিআই, এবং বিল্ড করার পর অ্যাপ্লিকেশন কন্টেইনার ধারণ করার জন্য আর্টিফ্যাক্ট রেজিস্ট্রি সক্রিয় করুন:
gcloud services enable \
run.googleapis.com \
firestore.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com
- নেটিভ মোডে ফায়ারস্টোর ডাটাবেস ইনিশিয়ালাইজ করুন। এই কমান্ডটি অ্যাপ ইঞ্জিন এপিআই ব্যবহার করে, তাই এটিকে প্রথমে সক্রিয় করতে হবে।
কমান্ডটিতে অ্যাপ ইঞ্জিনের জন্য একটি অঞ্চল নির্দিষ্ট করতে হবে, যা আমরা ব্যবহার করব না কিন্তু ঐতিহাসিক কারণে তৈরি করতে হবে, এবং ডেটাবেসের জন্যও একটি অঞ্চল নির্দিষ্ট করতে হবে। আমরা অ্যাপ ইঞ্জিনের জন্য us-central এবং ডেটাবেসের জন্য nam5 ব্যবহার করব। nam5 হলো মার্কিন যুক্তরাষ্ট্রের মাল্টি-রিজিওন লোকেশন। মাল্টি-রিজিওন লোকেশন ডেটাবেসের প্রাপ্যতা এবং স্থায়িত্বকে সর্বোচ্চ করে তোলে।
gcloud services enable appengine.googleapis.com
gcloud app create --region=us-central
gcloud firestore databases create --region=nam5
- স্যাম্পল অ্যাপ রিপোজিটরিটি ক্লোন করুন এবং ডিরেক্টরিতে যান
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
cd cymbal-eats/partner-registration-service
৩. README পর্যালোচনা করুন।
এডিটরটি খুলুন এবং অ্যাপটি গঠনকারী ফাইলগুলো দেখুন। README.md ফাইলটি দেখুন, যেখানে এই অ্যাপটি ডেপ্লয় করার জন্য প্রয়োজনীয় ধাপগুলো বর্ণনা করা আছে। এই ধাপগুলোর কয়েকটিতে বিবেচনার জন্য অন্তর্নিহিত বা সুস্পষ্ট নিরাপত্তা সংক্রান্ত সিদ্ধান্ত জড়িত থাকতে পারে। আপনার ডেপ্লয় করা অ্যাপটির নিরাপত্তা উন্নত করার জন্য আপনি এই সিদ্ধান্তগুলোর কয়েকটি পরিবর্তন করবেন, যা এখানে বর্ণনা করা হয়েছে:
ধাপ ৩ - npm install চালান
একটি অ্যাপে ব্যবহৃত যেকোনো থার্ড-পার্টি সফটওয়্যারের উৎস এবং নির্ভরযোগ্যতা সম্পর্কে জানা গুরুত্বপূর্ণ। সফটওয়্যার সাপ্লাই চেইন নিরাপত্তা ব্যবস্থাপনা যেকোনো সফটওয়্যার তৈরির ক্ষেত্রেই প্রাসঙ্গিক, শুধু ক্লাউড রান-এ ডেপ্লয় করা অ্যাপের ক্ষেত্রেই নয়। এই ল্যাবটি ডেপ্লয়মেন্টের উপর আলোকপাত করেছে, তাই এই ক্ষেত্রটি নিয়ে আলোচনা করা হয়নি, তবে আপনি চাইলে বিষয়টি নিয়ে আলাদাভাবে গবেষণা করতে পারেন।
ধাপ ৪ এবং ৫ - deploy.sh সম্পাদনা করে চালান।
এই ধাপগুলো বেশিরভাগ অপশন ডিফল্ট অবস্থায় রেখে অ্যাপটিকে ক্লাউড রান-এ ডেপ্লয় করে। ডেপ্লয়মেন্টটিকে আরও সুরক্ষিত করার জন্য আপনি দুটি প্রধান উপায়ে এই ধাপটি পরিবর্তন করবেন:
- প্রমাণীকরণবিহীন প্রবেশাধিকার দেবেন না । অনুসন্ধানের সময় বিভিন্ন জিনিস পরীক্ষা করার জন্য এর অনুমতি দেওয়া সুবিধাজনক হতে পারে, কিন্তু এটি বাণিজ্যিক অংশীদারদের ব্যবহারের জন্য একটি ওয়েব পরিষেবা, এবং এর ব্যবহারকারীদের সর্বদা প্রমাণীকরণ করা উচিত।
- নির্দিষ্ট করুন যে অ্যাপ্লিকেশনটি একটি ডিফল্ট অ্যাকাউন্টের পরিবর্তে শুধুমাত্র প্রয়োজনীয় সুবিধাসহ একটি ডেডিকেটেড সার্ভিস অ্যাকাউন্ট ব্যবহার করবে; ডিফল্ট অ্যাকাউন্টের সম্ভবত প্রয়োজনের চেয়ে বেশি API এবং রিসোর্স অ্যাক্সেস থাকবে। এটি ‘সর্বনিম্ন সুবিধার নীতি’ (principle of least privilege) নামে পরিচিত এবং এটি অ্যাপ্লিকেশন নিরাপত্তার একটি মৌলিক ধারণা।
ধাপ ৬ থেকে ১১ - সঠিক আচরণ যাচাই করার জন্য নমুনা ওয়েব অনুরোধ তৈরি করুন।
যেহেতু অ্যাপ্লিকেশন ডেপ্লয়মেন্টের জন্য এখন অথেনটিকেশন প্রয়োজন, তাই এই অনুরোধগুলিতে এখন থেকে অনুরোধকারীর পরিচয়ের প্রমাণ অবশ্যই অন্তর্ভুক্ত করতে হবে। এই ফাইলগুলি পরিবর্তন করার পরিবর্তে, আপনি সরাসরি কমান্ড লাইন থেকে অনুরোধগুলি করবেন।
৪. পরিষেবাটি নিরাপদে স্থাপন করুন
deploy.sh স্ক্রিপ্টটিতে দুটি পরিবর্তন প্রয়োজন বলে চিহ্নিত করা হয়েছিল: প্রমাণীকরণবিহীন অ্যাক্সেসের অনুমতি না দেওয়া, এবং ন্যূনতম সুবিধাসহ একটি নির্দিষ্ট সার্ভিস অ্যাকাউন্ট ব্যবহার করা।
প্রথমে আপনাকে একটি নতুন সার্ভিস অ্যাকাউন্ট তৈরি করতে হবে, তারপর সেই সার্ভিস অ্যাকাউন্টটিকে রেফারেন্স করার জন্য এবং অননুমোদিত অ্যাক্সেস বন্ধ করার জন্য deploy.sh স্ক্রিপ্টটি সম্পাদনা করতে হবে, এবং সবশেষে সংশোধিত স্ক্রিপ্টটি চালিয়ে সার্ভিসটি ডিপ্লয় করতে হবে। এরপরই আমরা সংশোধিত deploy.sh স্ক্রিপ্টটি চালাতে পারব।
একটি সার্ভিস অ্যাকাউন্ট তৈরি করুন এবং এটিকে ফায়ারস্টোর/ডেটাস্টোরে প্রয়োজনীয় অ্যাক্সেস দিন।
gcloud iam service-accounts create partner-sa
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:partner-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
--role=roles/datastore.user
deploy.sh সম্পাদনা করুন
অপ্রমাণিত অ্যাক্সেস নিষিদ্ধ করতে (–no-allow-unauthenticated) এবং ডেপ্লয় করা অ্যাপের জন্য নতুন সার্ভিস অ্যাকাউন্ট (–service-account) নির্দিষ্ট করতে deploy.sh ফাইলটি পরিবর্তন করুন। GOOGLE_PROJECT_ID-কে আপনার নিজের প্রজেক্টের আইডি দিয়ে সংশোধন করুন।
আপনি প্রথম দুটি লাইন মুছে ফেলবেন এবং নিচে দেখানো অনুযায়ী অন্য তিনটি লাইন পরিবর্তন করবেন।
gcloud run deploy $SERVICE_NAME \
--source . \
--platform managed \
--region ${REGION} \
--no-allow-unauthenticated \
--project=$PROJECT_ID \
--service-account=partner-sa@${PROJECT_ID}.iam.gserviceaccount.com
পরিষেবাটি স্থাপন করুন
কমান্ড লাইন থেকে deploy.sh স্ক্রিপ্টটি চালান:
./deploy.sh
ডেপ্লয়মেন্ট সম্পূর্ণ হলে, কমান্ড আউটপুটের শেষ লাইনে নতুন অ্যাপটির সার্ভিস ইউআরএল (Service URL) দেখা যাবে। ইউআরএলটি একটি এনভায়রনমেন্ট ভেরিয়েবলে সংরক্ষণ করুন:
export SERVICE_URL=<URL from last line of command output>
এখন curl টুল ব্যবহার করে অ্যাপ থেকে একটি অর্ডার আনার চেষ্টা করুন:
curl -i -X GET $SERVICE_URL/partners
curl কমান্ডের -i ফ্ল্যাগটি আউটপুটে রেসপন্স হেডার অন্তর্ভুক্ত করতে নির্দেশ দেয়। আউটপুটের প্রথম লাইনটি হবে:
HTTP/2 403
অ্যাপটি প্রমাণীকরণবিহীন অনুরোধ প্রত্যাখ্যান করার বিকল্পসহ স্থাপন করা হয়েছিল। এই কার্ল (curl) কমান্ডটিতে কোনো প্রমাণীকরণ তথ্য নেই, তাই ক্লাউড রান (Cloud Run) এটি প্রত্যাখ্যান করে। প্রকৃত স্থাপিত অ্যাপ্লিকেশনটি এই অনুরোধ থেকে চলেই না বা কোনো ডেটাও গ্রহণ করে না।
৫. প্রমাণীকৃত অনুরোধ করুন
ডেপ্লয় করা অ্যাপটি ওয়েব রিকোয়েস্ট পাঠানোর মাধ্যমে চালু করা হয়, যেগুলোকে এখন ক্লাউড রানের অনুমোদনের জন্য অবশ্যই অথেন্টিকেট করতে হবে। ওয়েব রিকোয়েস্টগুলো অথেন্টিকেট করার জন্য নিম্নলিখিত ফর্ম্যাটের একটি Authorization হেডার অন্তর্ভুক্ত করা হয়:
Authorization: Bearer identity-token
আইডেন্টিটি-টোকেন হলো একটি স্বল্পমেয়াদী, ক্রিপ্টোগ্রাফিকভাবে স্বাক্ষরিত, এনকোডেড স্ট্রিং যা কোনো বিশ্বস্ত প্রমাণীকরণ প্রদানকারী দ্বারা ইস্যু করা হয়। এক্ষেত্রে, একটি মেয়াদোত্তীর্ণ নয় এমন ও বৈধ, গুগল-ইস্যুকৃত আইডেন্টিটি টোকেন প্রয়োজন।
আপনার ব্যবহারকারী অ্যাকাউন্ট হিসাবে একটি অনুরোধ করুন
গুগল ক্লাউড CLI টুলটি ডিফল্ট অথেনটিকেটেড ইউজারের জন্য একটি টোকেন প্রদান করতে পারে। আপনার নিজের অ্যাকাউন্টের জন্য একটি আইডেন্টিটি টোকেন পেতে এই কমান্ডটি চালান এবং এটি ID_TOKEN এনভায়রনমেন্ট ভেরিয়েবলে সেভ করুন:
export ID_TOKEN=$(gcloud auth print-identity-token)
ডিফল্টরূপে, গুগল কর্তৃক ইস্যুকৃত আইডেন্টিটি টোকেনগুলো এক ঘণ্টার জন্য বৈধ থাকে। পূর্বে অননুমোদিত হওয়ায় প্রত্যাখ্যাত হওয়া অনুরোধটি করার জন্য নিম্নলিখিত কার্ল (curl) কমান্ডটি চালান। এই কমান্ডটিতে প্রয়োজনীয় হেডার অন্তর্ভুক্ত থাকবে:
curl -i -X GET $SERVICE_URL/partners \
-H "Authorization: Bearer $ID_TOKEN"
কমান্ডের আউটপুট HTTP/2 200 দিয়ে শুরু হওয়া উচিত, যা নির্দেশ করে যে অনুরোধটি গ্রহণযোগ্য এবং তা কার্যকর করা হচ্ছে। (যদি আপনি এক ঘণ্টা অপেক্ষা করে আবার এই অনুরোধটি করার চেষ্টা করেন, তবে এটি ব্যর্থ হবে কারণ টোকেনটির মেয়াদ শেষ হয়ে যাবে।) প্রতিক্রিয়ার মূল অংশটি আউটপুটের শেষে, একটি ফাঁকা লাইনের পরে থাকে:
{"status":"success","data":[]}
এখনো কোনো অংশীদার নেই।
ডিরেক্টরিতে থাকা নমুনা JSON ডেটা ব্যবহার করে দুটি curl কমান্ডের মাধ্যমে পার্টনারদের রেজিস্টার করুন:
curl -X POST \
-H "Authorization: Bearer $ID_TOKEN" \
-H "Content-Type: application/json" \
-d "@example-partner.json" \
$SERVICE_URL/partner
এবং
curl -X POST \
-H "Authorization: Bearer $ID_TOKEN" \
-H "Content-Type: application/json" \
-d "@example-partner2.json" \
$SERVICE_URL/partner
এখন সকল নিবন্ধিত অংশীদারদের দেখতে আগের GET অনুরোধটি পুনরায় পাঠান:
curl -i -X GET $SERVICE_URL/partners \
-H "Authorization: Bearer $ID_TOKEN"
আপনি আরও অনেক বেশি বিষয়বস্তুসহ JSON ডেটা দেখতে পাবেন, যেখানে দুই নিবন্ধিত অংশীদার সম্পর্কে তথ্য থাকবে।
অননুমোদিত অ্যাকাউন্ট হিসেবে একটি অনুরোধ করুন
শেষ ধাপে করা প্রমাণীকৃত অনুরোধটি কেবল প্রমাণীকৃত হওয়ার কারণেই সফল হয়নি, বরং প্রমাণীকৃত ব্যবহারকারী (আপনার অ্যাকাউন্ট) অনুমোদিত হওয়ার কারণেও সফল হয়েছে। অর্থাৎ, অ্যাপটি চালু করার জন্য অ্যাকাউন্টটির অনুমতি ছিল। সব প্রমাণীকৃত অ্যাকাউন্টই এটি করার জন্য অনুমোদিত হবে না।
পূর্ববর্তী অনুরোধে ব্যবহৃত ডিফল্ট অ্যাকাউন্টটি অনুমোদিত ছিল, কারণ এই অ্যাকাউন্টটিই অ্যাপ-সহ প্রজেক্টটি তৈরি করেছিল এবং স্বাভাবিকভাবেই এটি অ্যাকাউন্টের যেকোনো ক্লাউড রান অ্যাপ্লিকেশন চালু করার অনুমতি দিয়েছিল। প্রয়োজনে সেই অনুমতি প্রত্যাহার করা যেতে পারে, যা একটি প্রোডাকশন অ্যাপ্লিকেশনের জন্য কাম্য। এখন তা না করে, আপনি কোনো প্রিভিলেজ বা রোল বরাদ্দ না করে একটি নতুন সার্ভিস অ্যাকাউন্ট তৈরি করবেন এবং সেটি ব্যবহার করে ডেপ্লয় করা অ্যাপটি অ্যাক্সেস করার চেষ্টা করবেন।
-
testerনামে একটি সার্ভিস অ্যাকাউন্ট তৈরি করুন।
gcloud iam service-accounts create tester
- আপনি এই নতুন অ্যাকাউন্টের জন্য ঠিক সেভাবেই একটি আইডেন্টিটি টোকেন পাবেন, যেভাবে আগে আপনার ডিফল্ট অ্যাকাউন্টের জন্য পেয়েছিলেন। তবে, এর জন্য আপনার ডিফল্ট অ্যাকাউন্টের সার্ভিস অ্যাকাউন্ট ছদ্মবেশ ধারণ করার অনুমতি থাকা প্রয়োজন। আপনার অ্যাকাউন্টকে এই অনুমতিটি দিন।
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="user:$USER_EMAIL" \
--role=roles/iam.serviceAccountTokenCreator
- এখন এই নতুন অ্যাকাউন্টের জন্য একটি আইডেন্টিটি টোকেন TEST_IDENTITY এনভায়রনমেন্ট ভেরিয়েবলে সংরক্ষণ করতে নিম্নলিখিত কমান্ডটি চালান। যদি কমান্ডটি কোনো ত্রুটির বার্তা দেখায়, তবে এক বা দুই মিনিট অপেক্ষা করে আবার চেষ্টা করুন।
export TEST_TOKEN=$( \
gcloud auth print-identity-token \
--impersonate-service-account \
"tester@$PROJECT_ID.iam.gserviceaccount.com" \
)
- আগের মতোই প্রমাণীকৃত ওয়েব অনুরোধটি করুন, কিন্তু এই পরিচয় টোকেনটি ব্যবহার করে:
curl -i -X GET $SERVICE_URL/partners \
-H "Authorization: Bearer $TEST_TOKEN"
কমান্ড আউটপুট আবার HTTP/2 403 দিয়ে শুরু হবে, কারণ অনুরোধটি প্রমাণীকৃত হওয়া সত্ত্বেও অনুমোদিত নয়। নতুন পরিষেবা অ্যাকাউন্টটির এই অ্যাপটি চালু করার অনুমতি নেই।
একটি অ্যাকাউন্ট অনুমোদন করা
কোনো ক্লাউড রান সার্ভিসে অনুরোধ পাঠানোর জন্য, একজন ব্যবহারকারী বা সার্ভিস অ্যাকাউন্টের অবশ্যই সেই সার্ভিসে ক্লাউড রান ইনভোকার (Cloud Run Invoker) রোলটি থাকতে হবে। নিম্নলিখিত কমান্ডের মাধ্যমে টেস্টার সার্ভিস অ্যাকাউন্টকে সেই রোলটি দিন:
export REGION=us-central1
gcloud run services add-iam-policy-binding ${SERVICE_NAME} \
--member="serviceAccount:tester@$PROJECT_ID.iam.gserviceaccount.com" \
--role=roles/run.invoker \
--region=${REGION}
নতুন রোলটি আপডেট হওয়ার জন্য এক বা দুই মিনিট অপেক্ষা করার পর, প্রমাণীকৃত অনুরোধটি পুনরায় করুন। যদি প্রথমবার সেভ করার পর এক ঘন্টা বা তার বেশি সময় হয়ে গিয়ে থাকে, তাহলে একটি নতুন TEST_TOKEN সেভ করুন।
curl -i -X GET $SERVICE_URL/partners \
-H "Authorization: Bearer $TEST_TOKEN"
কমান্ড আউটপুট এখন HTTP/1.1 200 OK দিয়ে শুরু হচ্ছে এবং শেষ লাইনে JSON রেসপন্সটি রয়েছে। এই অনুরোধটি ক্লাউড রান গ্রহণ করেছে এবং অ্যাপটি দ্বারা প্রসেস করা হয়েছে।
৬. প্রোগ্রাম প্রমাণীকরণ বনাম ব্যবহারকারী প্রমাণীকরণ
আপনি এখন পর্যন্ত যে প্রমাণীকৃত অনুরোধগুলো করেছেন, সেগুলোতে curl কমান্ড লাইন টুল ব্যবহার করা হয়েছে। এর পরিবর্তে অন্যান্য টুল এবং প্রোগ্রামিং ল্যাঙ্গুয়েজও ব্যবহার করা যেত। তবে, সাধারণ ওয়েব পেজসহ ওয়েব ব্রাউজার ব্যবহার করে প্রমাণীকৃত ক্লাউড রান (Cloud Run) অনুরোধ করা যায় না । যদি কোনো ব্যবহারকারী কোনো ওয়েব পেজে থাকা কোনো লিঙ্কে বা ফর্ম জমা দেওয়ার জন্য কোনো বাটনে ক্লিক করেন, তাহলে ব্রাউজারটি প্রমাণীকৃত অনুরোধের জন্য ক্লাউড রানের প্রয়োজনীয় Authorization হেডারটি যোগ করবে না।
ক্লাউড রানের অন্তর্নির্মিত প্রমাণীকরণ ব্যবস্থাটি প্রোগ্রাম ব্যবহারের জন্য তৈরি, সাধারণ ব্যবহারকারীদের জন্য নয়।
দ্রষ্টব্য:
ক্লাউড রান ব্যবহারকারী-মুখী ওয়েব অ্যাপ্লিকেশন হোস্ট করতে পারে, কিন্তু সেই ধরনের অ্যাপ্লিকেশনগুলোকে অবশ্যই ক্লাউড রানকে এমনভাবে সেট করতে হবে যাতে ব্যবহারকারীদের ওয়েব ব্রাউজার থেকে প্রমাণীকরণবিহীন অনুরোধের অনুমতি দেওয়া হয়। যদি অ্যাপ্লিকেশনগুলোর ব্যবহারকারী প্রমাণীকরণের প্রয়োজন হয়, তবে ক্লাউড রানকে না বলে অ্যাপ্লিকেশনটিকেই তা পরিচালনা করতে হবে। ক্লাউড রানের বাইরের ওয়েব অ্যাপ্লিকেশনগুলো যেভাবে এই কাজটি করে, অ্যাপ্লিকেশনটিও ঠিক সেভাবেই তা করতে পারে। কীভাবে তা করা হয়, তা এই কোডল্যাবের আওতার বাইরে।
আপনি হয়তো লক্ষ্য করেছেন যে, এখন পর্যন্ত উদাহরণ অনুরোধগুলোর প্রতিক্রিয়া ওয়েব পেজের পরিবর্তে JSON অবজেক্ট ছিল। এর কারণ হলো, এই পার্টনার রেজিস্ট্রেশন পরিষেবাটি প্রোগ্রাম ব্যবহারের জন্য তৈরি করা হয়েছে এবং JSON হলো তাদের ডেটা গ্রহণের জন্য একটি সুবিধাজনক মাধ্যম। এরপর, আপনি এই ডেটা গ্রহণ ও ব্যবহার করার জন্য একটি প্রোগ্রাম লিখবেন এবং চালাবেন।
একটি পাইথন প্রোগ্রাম থেকে প্রমাণীকৃত অনুরোধ
একটি প্রোগ্রাম স্ট্যান্ডার্ড HTTP ওয়েব অনুরোধের মাধ্যমে একটি Authorization হেডার অন্তর্ভুক্ত করে একটি সুরক্ষিত Cloud Run অ্যাপ্লিকেশনে প্রমাণীকৃত অনুরোধ পাঠাতে পারে। সেই প্রোগ্রামগুলির জন্য একমাত্র নতুন চ্যালেঞ্জ হলো সেই হেডারে রাখার জন্য একটি বৈধ, মেয়াদোত্তীর্ণ নয় এমন আইডেন্টিটি টোকেন সংগ্রহ করা। Cloud Run সেই টোকেনটি Google Cloud Identity and Access Management (IAM) ব্যবহার করে যাচাই করবে, তাই টোকেনটি অবশ্যই IAM দ্বারা স্বীকৃত কোনো কর্তৃপক্ষ দ্বারা ইস্যু এবং স্বাক্ষরিত হতে হবে। এই ধরনের টোকেন ইস্যু করার অনুরোধ জানাতে প্রোগ্রামগুলি ব্যবহার করতে পারে এমন অনেক ভাষায় ক্লায়েন্ট লাইব্রেরি উপলব্ধ রয়েছে। এই উদাহরণে যে ক্লায়েন্ট লাইব্রেরিটি ব্যবহার করা হবে তা হলো পাইথনের google.auth লাইব্রেরি। সাধারণভাবে ওয়েব অনুরোধ করার জন্য বেশ কয়েকটি পাইথন লাইব্রেরি রয়েছে; এই উদাহরণে জনপ্রিয় requests মডিউলটি ব্যবহার করা হয়েছে।
প্রথম ধাপ হলো দুটি ক্লায়েন্ট লাইব্রেরি ইনস্টল করা:
pip install google-auth
pip install requests
ডিফল্ট ব্যবহারকারীর জন্য একটি পরিচয় টোকেন অনুরোধ করার পাইথন কোডটি হলো:
credentials, _ = google.auth.default()
credentials.refresh(google.auth.transport.requests.Request())
identity_token = credentials.id_token
আপনি যদি ক্লাউড শেল-এর মতো কোনো কমান্ড শেল অথবা আপনার নিজের কম্পিউটারে স্ট্যান্ডার্ড টার্মিনাল শেল ব্যবহার করেন, তাহলে ডিফল্ট ইউজার হলেন তিনিই যিনি সেই শেলের ভেতরে অথেন্টিকেট করেছেন। ক্লাউড শেল-এর ক্ষেত্রে, তিনি সাধারণত সেই ইউজার যিনি গুগল-এ লগ ইন করেছেন। অন্যান্য ক্ষেত্রে, তিনি হলেন সেই ইউজার যিনি gcloud auth login বা অন্য কোনো gcloud কমান্ড দিয়ে অথেন্টিকেট করেছেন। যদি ইউজারটি কখনও লগ ইন না করে থাকেন, তাহলে কোনো ডিফল্ট ইউজার থাকবে না এবং এই কোডটি কাজ করবে না।
যখন কোনো প্রোগ্রাম অন্য কোনো প্রোগ্রামের কাছে অনুরোধ পাঠায়, তখন সাধারণত কোনো ব্যক্তির পরিচয় ব্যবহার না করে বরং অনুরোধকারী প্রোগ্রামটির পরিচয় ব্যবহার করাই শ্রেয়। সার্ভিস অ্যাকাউন্টগুলো এই কাজের জন্যই ব্যবহৃত হয়। আপনি ক্লাউড রান সার্ভিসটি একটি নির্দিষ্ট সার্ভিস অ্যাকাউন্ট দিয়ে স্থাপন করেছেন, যা ক্লাউড ফায়ারস্টোরের মতো এপিআই (API) অনুরোধ করার সময় ব্যবহৃত পরিচয়টি সরবরাহ করে। যখন কোনো প্রোগ্রাম গুগল ক্লাউড প্ল্যাটফর্মে চলে, তখন ক্লায়েন্ট লাইব্রেরিগুলো স্বয়ংক্রিয়ভাবে সেটিকে বরাদ্দ করা সার্ভিস অ্যাকাউন্টটিকে তার ডিফল্ট পরিচয় হিসেবে ব্যবহার করে, ফলে একই প্রোগ্রাম কোড উভয় ক্ষেত্রেই কাজ করে।
Authorization হেডার যুক্ত করে রিকোয়েস্ট করার পাইথন কোডটি হলো:
auth_header = {"Authorization": "Bearer " + identity_token}
response = requests.get(url, headers=auth_header)
নিম্নলিখিত সম্পূর্ণ পাইথন প্রোগ্রামটি ক্লাউড রান পরিষেবাতে একটি প্রমাণীকৃত অনুরোধ পাঠিয়ে সমস্ত নিবন্ধিত অংশীদারদের খুঁজে বের করবে এবং তারপর তাদের নাম ও নির্ধারিত আইডি প্রিন্ট করবে। এই কোডটি print_partners.py ফাইলে সংরক্ষণ করতে নিচের কমান্ডটি কপি করে রান করুন।
cat > ./print_partners.py << EOF
def print_partners():
import google.auth
import google.auth.transport.requests
import requests
credentials, _ = google.auth.default()
credentials.refresh(google.auth.transport.requests.Request())
identity_token = credentials.id_token
auth_header = {"Authorization": "Bearer " + identity_token}
response = requests.get("${SERVICE_URL}/partners", headers=auth_header)
parsed_response = response.json()
partners = parsed_response["data"]
for partner in partners:
print(f"{partner['partnerId']}: {partner['name']}")
print_partners()
EOF
আপনি এই প্রোগ্রামটি একটি শেল কমান্ডের মাধ্যমে চালাবেন। আপনাকে প্রথমে ডিফল্ট ব্যবহারকারী হিসাবে প্রমাণীকরণ করতে হবে, যাতে প্রোগ্রামটি সেই ক্রেডেনশিয়ালগুলি ব্যবহার করতে পারে। নিচের gcloud auth কমান্ডটি চালান:
gcloud auth application-default login
লগইন সম্পন্ন করতে নির্দেশাবলী অনুসরণ করুন। তারপর কমান্ড লাইন থেকে প্রোগ্রামটি চালান:
python print_partners.py
আউটপুটটি দেখতে নিচের মতো হবে:
10102: Zippy food delivery
67292: Foodful
প্রোগ্রামটির অনুরোধ ক্লাউড রান পরিষেবাতে পৌঁছেছে, কারণ এটি আপনার পরিচয় দিয়ে প্রমাণীকৃত হয়েছে, এবং আপনি এই প্রকল্পের মালিক হওয়ায় ডিফল্টরূপে এটি চালানোর জন্য অনুমোদিত। সাধারণত এই প্রোগ্রামটি একটি পরিষেবা অ্যাকাউন্টের পরিচয়ের অধীনে চলে। ক্লাউড রান বা অ্যাপ ইঞ্জিনের মতো বেশিরভাগ গুগল ক্লাউড পণ্যে চালানোর সময়, ডিফল্ট পরিচয়টি একটি পরিষেবা অ্যাকাউন্ট হয় এবং ব্যক্তিগত অ্যাকাউন্টের পরিবর্তে এটিই ব্যবহৃত হয়।
৭. অভিনন্দন!
অভিনন্দন, আপনি কোডল্যাবটি সম্পন্ন করেছেন!
এরপর কী:
Cymbal Eats-এর অন্যান্য কোডল্যাবগুলি অন্বেষণ করুন:
- ইভেন্টার্কের মাধ্যমে ক্লাউড ওয়ার্কফ্লো চালু করা
- ক্লাউড স্টোরেজ থেকে ইভেন্ট প্রসেসিং ট্রিগার করা
- ক্লাউড রান থেকে প্রাইভেট ক্লাউডএসকিউএল-এ সংযোগ করা
- ক্লাউড রান থেকে সম্পূর্ণ পরিচালিত ডেটাবেসগুলিতে সংযোগ স্থাপন
- আইডেন্টিটি অ্যাওয়্যার প্রক্সি (IAP) ব্যবহার করে সার্ভারলেস অ্যাপ্লিকেশন সুরক্ষিত করুন
- ক্লাউড শিডিউলারের মাধ্যমে ক্লাউড রান জব চালু করা
- ক্লাউড রান ইনগ্রেস ট্র্যাফিক সুরক্ষিত করা
- GKE অটোপাইলট থেকে ব্যক্তিগত AlloyDB-তে সংযোগ স্থাপন
পরিষ্কার করা
এই টিউটোরিয়ালে ব্যবহৃত রিসোর্সগুলোর জন্য আপনার গুগল ক্লাউড অ্যাকাউন্টে চার্জ হওয়া এড়াতে, হয় রিসোর্সগুলো যে প্রজেক্টে রয়েছে সেটি ডিলিট করে দিন, অথবা প্রজেক্টটি রেখে দিয়ে আলাদা আলাদা রিসোর্সগুলো ডিলিট করে দিন।
প্রকল্পটি মুছে ফেলা হচ্ছে
বিলিং বন্ধ করার সবচেয়ে সহজ উপায় হলো টিউটোরিয়ালের জন্য তৈরি করা প্রজেক্টটি ডিলিট করে দেওয়া।