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

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



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

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

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

আপনি গুগল ক্লাউড সোর্স এবং ক্লাউড পাব/সাব-এ পাবলিশ করা কাস্টম অ্যাপ্লিকেশনগুলো থেকে ইভেন্ট সংগ্রহ করে সেগুলোকে গুগল ক্লাউড রান সিঙ্ক-এ পৌঁছে দিতে পারেন।
গুগল ক্লাউডের বিভিন্ন উৎস থেকে আসা ইভেন্টগুলো ক্লাউড অডিট লগ-এর মাধ্যমে সরবরাহ করা হয়। এই উৎসগুলো থেকে ইভেন্ট সরবরাহের লেটেন্সি এবং অ্যাভেইলেবিলিটি ক্লাউড অডিট লগ-এর সাথে সংযুক্ত। যখনই গুগল ক্লাউডের কোনো উৎস থেকে একটি ইভেন্ট সক্রিয় হয়, তখন একটি সংশ্লিষ্ট ক্লাউড অডিট লগ এন্ট্রি তৈরি করা হয়।
ক্লাউড পাব/সাব-এ প্রকাশকারী কাস্টম অ্যাপ্লিকেশনগুলি তাদের নির্দিষ্ট করা পাব/সাব টপিকে যেকোনো ফরম্যাটে বার্তা প্রকাশ করতে পারে।
ইভেন্ট ট্রিগার হলো এমন একটি ফিল্টারিং ব্যবস্থা, যার মাধ্যমে নির্দিষ্ট করা হয় কোন ইভেন্ট কোন সিঙ্কে পাঠানো হবে।
বিভিন্ন পরিষেবার মধ্যে আন্তঃকার্যক্ষমতা নিশ্চিত করার জন্য সমস্ত ইভেন্ট CloudEvents v1.0 ফরম্যাটে সরবরাহ করা হয়।
৪. শুরু করার আগে
এপিআই সক্ষম করুন
Cloud Run সার্ভিসটি চালু করার জন্য আপনার Eventarc সার্ভিসটির প্রয়োজন হবে। এটি সক্রিয় আছে কিনা তা নিশ্চিত করুন:
gcloud services enable eventarc.googleapis.com
অপারেশনটি সফলভাবে সম্পন্ন হতে দেখা উচিত:
Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.
পরিষেবা অ্যাকাউন্টগুলি কনফিগার করুন
ট্রিগারগুলিতে ডিফল্ট কম্পিউট সার্ভিস অ্যাকাউন্ট ব্যবহার করা হবে। ডিফল্ট কম্পিউট সার্ভিস অ্যাকাউন্টকে eventarc.eventReceiver রোলটি প্রদান করুন:
PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format='value(projectNumber)')
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
--role roles/eventarc.eventReceiver
ক্লাউড স্টোরেজ সার্ভিস অ্যাকাউন্টে pubsub.publisher রোলটি প্রদান করুন। ইভেন্টআর্ক ক্লাউড স্টোরেজ ট্রিগারের জন্য এটি প্রয়োজন:
SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)
gcloud projects add-iam-policy-binding $PROJECT_NUMBER \
--member serviceAccount:$SERVICE_ACCOUNT \
--role roles/pubsub.publisher
যদি আপনি ৮ই এপ্রিল, ২০২১ তারিখে বা তার আগে পাব/সাব সার্ভিস অ্যাকাউন্টটি সক্রিয় করে থাকেন, তাহলে পাব/সাব সার্ভিস অ্যাকাউন্টটিকে iam.serviceAccountTokenCreator রোলটি প্রদান করুন:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role roles/iam.serviceAccountTokenCreator
৫. কোডটি ক্লোন করুন
আগের কোড ল্যাবে যদি কোডটি ক্লোন না করে থাকেন, তবে এবার তা করুন:
git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop
এরপর আপনি সার্ভিসটি যে ডিরেক্টরিতে রয়েছে সেখানে যেতে পারেন:
cd serverless-photosharing-workshop/services/garbage-collector/nodejs
পরিষেবাটির জন্য আপনার কাছে নিম্নলিখিত ফাইল বিন্যাস থাকবে:
services
|
├── garbage-collector
|
├── nodejs
|
├── index.js
├── package.json
ফোল্ডারটির ভিতরে ৩টি ফাইল আছে:
-
index.jsNode.js কোড রয়েছে -
package.jsonলাইব্রেরির নির্ভরতাগুলো সংজ্ঞায়িত করে।
৬. কোডটি অন্বেষণ করুন
নির্ভরশীলতা
package.json ফাইলটি প্রয়োজনীয় লাইব্রেরি নির্ভরতাগুলো নির্ধারণ করে:
{
"name": "garbage_collector_service",
"version": "0.0.1",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"cloudevents": "^4.0.1",
"express": "^4.17.1",
"@google/events": "^3.1.0",
"@google-cloud/firestore": "^4.9.9",
"@google-cloud/storage": "^5.8.3"
}
}
ক্লাউড স্টোরেজের মধ্যে থাকা ছবি মুছে ফেলার জন্য আমরা ক্লাউড স্টোরেজ লাইব্রেরির উপর নির্ভর করি। পূর্বে সংরক্ষণ করা ছবির মেটাডেটা মুছে ফেলার জন্য আমরা ক্লাউড ফায়ারস্টোরের উপর একটি নির্ভরতা ঘোষণা করি। এছাড়াও, ইভেন্টআর্ক দ্বারা প্রেরিত ক্লাউডইভেন্টগুলো পড়ার জন্য আমরা ক্লাউডইভেন্টস এসডিকে এবং গুগল ইভেন্টস লাইব্রেরির উপর নির্ভর করি। এক্সপ্রেস হলো একটি জাভাস্ক্রিপ্ট / নোড ওয়েব ফ্রেমওয়ার্ক। প্রমিজ পরিচালনার জন্য ব্লুবার্ড ব্যবহৃত হয়।
index.js
চলুন আমাদের index.js কোডটি আরও ভালোভাবে দেখি:
const express = require('express');
const {Storage} = require('@google-cloud/storage');
const Firestore = require('@google-cloud/firestore');
const { HTTP } = require("cloudevents");
const {toStorageObjectData} = require('@google/events/cloud/storage/v1/StorageObjectData');
আমাদের প্রোগ্রামটি চালানোর জন্য বিভিন্ন ডিপেন্ডেন্সি প্রয়োজন: আমরা এক্সপ্রেস (Express) নামক নোড ওয়েব ফ্রেমওয়ার্কটি ব্যবহার করব, ব্লুবার্ড (Bluebird) হলো জাভাস্ক্রিপ্ট প্রমিজ (JavaScript promises) পরিচালনার জন্য একটি লাইব্রেরি, এবং স্টোরেজ (Storage) ও ফায়ারস্টোর (Firestore) যথাক্রমে গুগল ক্লাউড স্টোরেজ (আমাদের ছবির বাকেটগুলো) এবং ক্লাউড ফায়ারস্টোর ডেটাস্টোরের সাথে কাজ করার জন্য ব্যবহৃত হয়। এছাড়াও, গুগল ইভেন্টস লাইব্রেরি থেকে ইভেন্টআর্ক স্টোরঅবজেক্টডেটা (Eventarc StoreObjectData) দ্বারা প্রেরিত ক্লাউডইভেন্টটি পড়ার জন্য আমাদের ক্লাউডইভেন্ট (CloudEvent) প্রয়োজন, যা দিয়ে ক্লাউড স্টোরেজের ইভেন্ট বডি পড়া যায়।
const app = express();
app.use(express.json());
app.post('/', async (req, res) => {
try {
const cloudEvent = HTTP.toEvent({ headers: req.headers, body: req.body });
console.log(cloudEvent);
/* ... */
} catch (err) {
console.log(`Error: ${err}`);
res.status(500).send(err);
}
});
উপরে, আমাদের নোড হ্যান্ডলারের কাঠামোটি দেখানো হয়েছে: আমাদের অ্যাপটি HTTP POST অনুরোধের উত্তর দেয়। এটি HTTP অনুরোধ থেকে CloudEvent পড়ে এবং কোনো সমস্যা হলে তার জন্য আমরা কিছুটা এরর হ্যান্ডলিং-এর ব্যবস্থা রেখেছি। চলুন এখন দেখে নেওয়া যাক এই কাঠামোর ভেতরে কী আছে।
পরবর্তী ধাপ হলো CloudEvent বডি পুনরুদ্ধার ও পার্স করে অবজেক্টের নামটি বের করা:
const storageObjectData = toStorageObjectData(cloudEvent.data);
console.log(storageObjectData);
const objectName = storageObjectData.name;
একবার ছবির নাম জানা গেলে, আমরা থাম্বনেইল বাকেট থেকে এটি মুছে ফেলতে পারি:
try {
await storage.bucket(bucketThumbnails).file(objectName).delete();
console.log(`Deleted '${objectName}' from bucket '${bucketThumbnails}'.`);
}
catch(err) {
console.log(`Failed to delete '${objectName}' from bucket '${bucketThumbnails}': ${err}.`);
}
শেষ ধাপ হিসেবে, ফায়ারস্টোর কালেকশন থেকে ছবির মেটাডেটাও মুছে ফেলুন:
try {
const pictureStore = new Firestore().collection('pictures');
const docRef = pictureStore.doc(objectName);
await docRef.delete();
console.log(`Deleted '${objectName}' from Firestore collection 'pictures'`);
}
catch(err) {
console.log(`Failed to delete '${objectName}' from Firestore: ${err}.`);
}
res.status(200).send(`Processed '${objectName}'.`);
এখন আমাদের নোড স্ক্রিপ্টকে আগত অনুরোধ শোনার জন্য প্রস্তুত করার পালা। এছাড়াও, প্রয়োজনীয় এনভায়রনমেন্ট ভেরিয়েবলগুলো সেট করা আছে কিনা তা দেখে নিন:
app.listen(PORT, () => {
if (!bucketThumbnails) throw new Error("BUCKET_THUMBNAILS not set");
console.log(`Started service on port ${PORT}`);
});
৭. স্থানীয়ভাবে পরীক্ষা করুন
ক্লাউডে ডেপ্লয় করার আগে কোডটি ঠিকমতো কাজ করছে কিনা তা নিশ্চিত করতে আপনার লোকাল মেশিনে পরীক্ষা করে নিন।
garbage-collector/nodejs ফোল্ডারের ভিতরে, npm ডিপেন্ডেন্সিগুলো ইনস্টল করুন এবং সার্ভারটি চালু করুন:
export BUCKET_THUMBNAILS=thumbnails-$GOOGLE_CLOUD_PROJECT npm install; npm start
সবকিছু ঠিকঠাক থাকলে, সার্ভারটি ৮০৮০ পোর্টে চালু হয়ে যাবে:
Started service on port 8080
প্রস্থান করতে CTRL-C ব্যবহার করুন।
৮. ক্লাউড রান-এ বিল্ড এবং ডিপ্লয় করুন
Cloud Run-এ ডেপ্লয় করার আগে, Cloud Run-এর অঞ্চলটি সমর্থিত অঞ্চলগুলির মধ্যে একটিতে এবং প্ল্যাটফর্মটি managed এ সেট করুন।
REGION=europe-west1 gcloud config set run/region $REGION gcloud config set run/platform managed
আপনি যাচাই করে দেখতে পারেন যে কনফিগারেশনটি সেট করা আছে কিনা:
gcloud config list ... [run] platform = managed region = europe-west1
ম্যানুয়ালি ক্লাউড বিল্ড ব্যবহার করে কন্টেইনার ইমেজ তৈরি ও প্রকাশ করার পরিবর্তে, আপনি গুগল ক্লাউড বিল্ডপ্যাকস ব্যবহার করে আপনার জন্য কন্টেইনার ইমেজ তৈরি করতে ক্লাউড রানের উপরও নির্ভর করতে পারেন।
Google Cloud Buildpack ব্যবহার করে কন্টেইনার ইমেজ তৈরি করতে নিম্নলিখিত কমান্ডটি চালান এবং তারপর কন্টেইনার ইমেজটি Cloud Run-এ ডেপ্লয় করুন:
SERVICE_NAME=garbage-collector-service
gcloud run deploy $SERVICE_NAME \
--source . \
--no-allow-unauthenticated \
--update-env-vars BUCKET_THUMBNAILS=$BUCKET_THUMBNAILS
–-source ফ্ল্যাগটি লক্ষ্য করুন। এই ফ্ল্যাগটি ক্লাউড রানকে Dockerfile. --no-allow-unauthenticated ফ্ল্যাগটি ক্লাউড রান সার্ভিসকে একটি অভ্যন্তরীণ সার্ভিসে পরিণত করে, যা শুধুমাত্র নির্দিষ্ট সার্ভিস অ্যাকাউন্ট দ্বারাই চালু হবে। পরবর্তীতে, আপনি ডিফল্ট কম্পিউট সার্ভিস অ্যাকাউন্ট ব্যবহার করে একটি ট্রিগার তৈরি করবেন, যেটির run.invoker রোলটি রয়েছে, যাতে ক্লাউড রানের অভ্যন্তরীণ সার্ভিসগুলোকে কল করা যায়।
৯. একটি ট্রিগার তৈরি করুন
ইভেন্টার্কে, একটি ট্রিগার নির্ধারণ করে যে কোন সার্ভিস কোন ধরনের ইভেন্ট পাবে। এই ক্ষেত্রে, আপনি চান যে একটি বাকেট থেকে কোনো ফাইল ডিলিট করা হলে সার্ভিসটি যেন ইভেন্ট পায়।
আপলোড করা ছবির বাকেটের মতো একই অঞ্চলে ট্রিগারের অবস্থান নির্ধারণ করুন:
gcloud config set eventarc/location eu
storage.objects.delete ইভেন্টগুলো ফিল্টার করতে এবং ক্লাউড রান সার্ভিসে পাঠানোর জন্য একটি AuditLog ট্রিগার তৈরি করুন:
BUCKET_IMAGES=uploaded-pictures-$GOOGLE_CLOUD_PROJECT gcloud eventarc triggers create trigger-$SERVICE_NAME \ --destination-run-service=$SERVICE_NAME \ --destination-run-region=$REGION \ --event-filters="type=google.cloud.storage.object.v1.deleted" \ --event-filters="bucket=$BUCKET_IMAGES" \ --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
এই কমান্ডটি দিয়ে আপনি পুনরায় যাচাই করে নিতে পারেন যে ট্রিগারটি তৈরি হয়েছে কিনা:
gcloud eventarc triggers list
১০. পরিষেবাটি পরীক্ষা করুন
সার্ভিসটি কাজ করছে কিনা তা পরীক্ষা করতে, uploaded-pictures বাকেটে যান এবং ছবিগুলোর মধ্যে একটি ডিলিট করুন। আপনি সার্ভিসের লগ-এ দেখতে পাবেন যে এটি thumbnails বাকেট থেকে প্রাসঙ্গিক ছবিটি ডিলিট করেছে এবং pictures ফায়ারস্টোর কালেকশন থেকে এর ডকুমেন্টটিও ডিলিট করে দিয়েছে।

১১. পরিষ্কার করা (ঐচ্ছিক)
আপনি যদি এই সিরিজের অন্য ল্যাবগুলো চালিয়ে যেতে না চান, তাহলে খরচ বাঁচাতে এবং সার্বিকভাবে একজন ভালো ক্লাউড ব্যবহারকারী হতে রিসোর্সগুলো পরিষ্কার করতে পারেন। আপনি নিম্নলিখিত উপায়ে একে একে রিসোর্সগুলো পরিষ্কার করতে পারেন।
পরিষেবাটি মুছে ফেলুন:
gcloud run services delete $SERVICE_NAME -q
Eventarc ট্রিগারটি মুছে ফেলুন:
gcloud eventarc triggers delete trigger-$SERVICE_NAME -q
বিকল্পভাবে, আপনি পুরো প্রজেক্টটি মুছে ফেলতে পারেন:
gcloud projects delete $GOOGLE_CLOUD_PROJECT
১২. অভিনন্দন!
অভিনন্দন! আপনি একটি ক্লাউড রান সার্ভিস, ইমেজ গার্বেজ কালেক্টর, তৈরি করেছেন, যা ক্লাউড রানে ইভেন্ট গ্রহণ করার জন্য একটি নতুন সার্ভিস ইভেন্টআর্ক (Eventarc) দ্বারা ট্রিগার হয়। যখন পিকচার্স বাকেট থেকে কোনো ছবি ডিলিট করা হয়, তখন সার্ভিসটি ইভেন্টআর্ক থেকে একটি ইভেন্ট গ্রহণ করে। এরপর, এটি থাম্বনেইলস বাকেট থেকে ছবিটি ডিলিট করে দেয় এবং ফায়ারস্টোর পিকচার্স কালেকশন থেকেও তা সরিয়ে ফেলে।
আমরা যা আলোচনা করেছি
- ক্লাউড রান
- ক্লাউড স্টোরেজ
- ক্লাউড ফায়ারস্টোর
- ইভেন্টার্ক