প্রতিদিনের ছবি: ল্যাব 5—ছবি মুছে ফেলার পরে পরিষ্কার করুন

1. ওভারভিউ

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

d93345bfc235f81e.png

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

  • ক্লাউড রান
  • ক্লাউড স্টোরেজ
  • ক্লাউড ফায়ারস্টোর
  • ইভেন্টর্ক

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

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

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • প্রকল্পের নাম এই প্রকল্পের অংশগ্রহণকারীদের জন্য প্রদর্শনের নাম। এটি একটি অক্ষর স্ট্রিং যা Google API দ্বারা ব্যবহৃত হয় না এবং আপনি যে কোনো সময় এটি আপডেট করতে পারেন।
  • সমস্ত Google ক্লাউড প্রজেক্ট জুড়ে প্রোজেক্ট আইডি অবশ্যই অনন্য হতে হবে এবং অপরিবর্তনীয় (সেট করার পরে পরিবর্তন করা যাবে না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত আপনি এটা কি যত্ন না. বেশিরভাগ কোডল্যাবে, আপনাকে প্রজেক্ট আইডি উল্লেখ করতে হবে (এবং এটি সাধারণত PROJECT_ID হিসাবে চিহ্নিত করা হয়), তাই আপনি যদি এটি পছন্দ না করেন তবে অন্য একটি এলোমেলো তৈরি করুন, অথবা, আপনি নিজের চেষ্টা করে দেখতে পারেন এটি উপলব্ধ কিনা। তারপর প্রকল্প তৈরি হওয়ার পরে এটি "হিমায়িত" হয়।
  • একটি তৃতীয় মান আছে, একটি প্রকল্প নম্বর যা কিছু API ব্যবহার করে। ডকুমেন্টেশনে এই তিনটি মান সম্পর্কে আরও জানুন।
  1. এরপরে, ক্লাউড রিসোর্স/এপিআই ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং সক্ষম করতে হবে। এই কোডল্যাবের মাধ্যমে চালানোর জন্য খুব বেশি খরচ করা উচিত নয়, যদি কিছু থাকে। রিসোর্স বন্ধ করতে যাতে আপনি এই টিউটোরিয়ালের বাইরে বিলিং করতে না পারেন, কোডল্যাবের শেষে পাওয়া যেকোনো "ক্লিন-আপ" নির্দেশাবলী অনুসরণ করুন। Google ক্লাউডের নতুন ব্যবহারকারীরা $300 USD বিনামূল্যের ট্রায়াল প্রোগ্রামের জন্য যোগ্য৷

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

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

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

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

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

3. ইভেন্টর্কের ভূমিকা

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

776ed63706ca9683.png

আপনি ক্লাউড পাব/সাব-এ Google ক্লাউড উত্স এবং কাস্টম অ্যাপ্লিকেশন প্রকাশনা থেকে ইভেন্টগুলি আঁকতে পারেন এবং সেগুলিকে Google ক্লাউড রান সিঙ্কগুলিতে বিতরণ করতে পারেন৷

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

ক্লাউড পাব/সাব-এ প্রকাশ করা কাস্টম অ্যাপ্লিকেশনগুলি যে কোনও ফর্ম্যাটে নির্দিষ্ট করা একটি পাব/সাব বিষয়ে বার্তা প্রকাশ করতে পারে।

ইভেন্ট ট্রিগার হল ফিল্টারিং মেকানিজম যা নির্দিষ্ট করে কোন ইভেন্ট কোন সিঙ্কে ডেলিভারি করতে হবে।

সমস্ত ইভেন্ট ক্রস সার্ভিস ইন্টারঅপারেবিলিটির জন্য CloudEvents v1.0 ফর্ম্যাটে বিতরণ করা হয়।

4. আপনি শুরু করার আগে

এপিআই সক্ষম করুন

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

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 ভূমিকা মঞ্জুর করুন৷ Eventarc ক্লাউড স্টোরেজ ট্রিগারের জন্য এটি প্রয়োজন:

SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)

gcloud projects add-iam-policy-binding $PROJECT_NUMBER \
    --member serviceAccount:$SERVICE_ACCOUNT \
    --role roles/pubsub.publisher

আপনি যদি 8 এপ্রিল, 2021 তারিখে বা তার আগে Pub/Sub পরিষেবা অ্যাকাউন্ট সক্রিয় করে থাকেন, তাহলে Pub/Sub পরিষেবা অ্যাকাউন্টে 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

5. কোড ক্লোন করুন

কোডটি ক্লোন করুন, যদি আপনি ইতিমধ্যে পূর্ববর্তী কোড ল্যাবে না থাকেন:

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

ফোল্ডারের ভিতরে, আপনার 3টি ফাইল আছে:

  • index.js Node.js কোড থাকে
  • package.json লাইব্রেরি নির্ভরতা সংজ্ঞায়িত করে

6. কোড অন্বেষণ করুন

নির্ভরতা

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"
  }
}

ক্লাউড স্টোরেজের মধ্যে থাকা ছবিগুলি মুছে ফেলার জন্য আমরা ক্লাউড স্টোরেজ লাইব্রেরির উপর নির্ভর করি। আমরা ক্লাউড ফায়ারস্টোরের উপর নির্ভরতা ঘোষণা করি, এছাড়াও আমরা পূর্বে সংরক্ষিত ছবির মেটাডেটা মুছে ফেলি। উপরন্তু, Eventarc-এর পাঠানো CloudEvents পড়ার জন্য আমরা CloudEvents SDK এবং Google ইভেন্ট লাইব্রেরির উপর নির্ভর করি। এক্সপ্রেস হল একটি জাভাস্ক্রিপ্ট/নোড ​​ওয়েব ফ্রেমওয়ার্ক। ব্লুবার্ড প্রতিশ্রুতি পরিচালনার জন্য ব্যবহৃত হয়।

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');

আমাদের প্রোগ্রাম চালানোর জন্য আমাদের বিভিন্ন নির্ভরতা প্রয়োজন: এক্সপ্রেস হল নোড ওয়েব ফ্রেমওয়ার্ক যা আমরা ব্যবহার করব, ব্লুবার্ড হল জাভাস্ক্রিপ্ট প্রতিশ্রুতিগুলি পরিচালনা করার জন্য একটি লাইব্রেরি, স্টোরেজ এবং ফায়ারস্টোর যথাক্রমে Google ক্লাউড স্টোরেজ (আমাদের ছবিগুলির বালতি) সাথে কাজ করার জন্য। এবং ক্লাউড ফায়ারস্টোর ডেটাস্টোর। উপরন্তু, CloudEvent-এর ক্লাউড স্টোরেজ ইভেন্ট বডি পড়ার জন্য Google ইভেন্ট লাইব্রেরি থেকে Eventarc StoreObjectData-এর পাঠানো CloudEvent পড়ার জন্য আমাদের 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 বডি পুনরুদ্ধার এবং পার্স করা এবং বস্তুর নাম পুনরুদ্ধার করা:

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}.`);
}

শেষ ধাপ হিসেবে, Firestore সংগ্রহ থেকে ছবির মেটাডেটাও মুছে দিন:

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}`);
});

7. স্থানীয়ভাবে পরীক্ষা করুন

ক্লাউডে স্থাপন করার আগে এটি কাজ করে তা নিশ্চিত করতে স্থানীয়ভাবে কোডটি পরীক্ষা করুন।

garbage-collector/nodejs ফোল্ডারের ভিতরে, এনপিএম নির্ভরতা ইনস্টল করুন এবং সার্ভার শুরু করুন:

export BUCKET_THUMBNAILS=thumbnails-$GOOGLE_CLOUD_PROJECT

npm install; npm start

সবকিছু ঠিকঠাক থাকলে, এটি পোর্ট 8080 এ সার্ভার শুরু করা উচিত:

Started service on port 8080

প্রস্থান করতে CTRL-C ব্যবহার করুন।

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

ক্লাউড রানে স্থাপন করার আগে, ক্লাউড রান অঞ্চলটিকে একটি সমর্থিত অঞ্চলে সেট করুন এবং 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 ক্লাউড বিল্ডপ্যাক ব্যবহার করে আপনার জন্য কন্টেইনার ইমেজ তৈরি করতে ক্লাউড রানের উপরও নির্ভর করতে পারেন।

Google Cloud Buildpack s ব্যবহার করে কন্টেইনার ইমেজ তৈরি করতে নিম্নলিখিত কমান্ডটি চালান এবং তারপর ক্লাউড রানে কন্টেইনার ইমেজ স্থাপন করুন:

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 ভূমিকা রয়েছে৷

9. একটি ট্রিগার তৈরি করুন

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

আপলোড করা ছবি বাকেটের মতো একই অঞ্চলে ট্রিগারের অবস্থান সেট করুন:

gcloud config set eventarc/location eu

storage.objects.delete ইভেন্টগুলির জন্য ফিল্টার করতে একটি AuditLog ট্রিগার তৈরি করুন এবং Cloud Run পরিষেবাতে পাঠান:

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

10. পরিষেবা পরীক্ষা করুন

পরিষেবাটি কাজ করছে কিনা তা পরীক্ষা করতে, uploaded-pictures বালতিতে যান এবং ছবিগুলির একটি মুছুন৷ আপনি পরিষেবার লগগুলিতে দেখতে পাবেন যে এটি thumbnails বাকেটের প্রাসঙ্গিক ছবি মুছে দিয়েছে এবং pictures Firestore সংগ্রহ থেকে এর নথিও মুছে দিয়েছে।

519abf90e7ea4d12.png

11. পরিষ্কার করুন (ঐচ্ছিক)

আপনি যদি সিরিজের অন্যান্য ল্যাবগুলির সাথে চালিয়ে যেতে চান না, তাহলে খরচ বাঁচাতে এবং সামগ্রিকভাবে ভাল ক্লাউড নাগরিক হতে আপনি সংস্থানগুলি পরিষ্কার করতে পারেন। আপনি নিম্নরূপ পৃথকভাবে সম্পদ পরিষ্কার করতে পারেন.

পরিষেবাটি মুছুন:

gcloud run services delete $SERVICE_NAME -q

Eventarc ট্রিগার মুছুন:

gcloud eventarc triggers delete trigger-$SERVICE_NAME -q

বিকল্পভাবে, আপনি পুরো প্রকল্প মুছে ফেলতে পারেন:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

12. অভিনন্দন!

অভিনন্দন! আপনি একটি ক্লাউড রান পরিষেবা তৈরি করেছেন, ইমেজ আবর্জনা সংগ্রহকারী, যেটি ক্লাউড রানে ইভেন্টগুলি গ্রহণের জন্য একটি নতুন পরিষেবা Eventarc দ্বারা ট্রিগার করা হয়েছে৷ যখন ছবি বাকেট থেকে একটি ছবি মুছে ফেলা হয়, পরিষেবাটি Eventarc থেকে একটি ইভেন্ট পায়। তারপর, এটি থাম্বনেইল বাকেট থেকে ছবিটি মুছে দেয় এবং এটি Firestore ছবির সংগ্রহ থেকেও সরিয়ে দেয়।

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

  • ক্লাউড রান
  • ক্লাউড স্টোরেজ
  • ক্লাউড ফায়ারস্টোর
  • ইভেন্টর্ক