প্রতিদিনের ছবি: ল্যাব 2-ছবির থাম্বনেল তৈরি করুন

প্রতিদিনের ছবি:
ল্যাব 2-ছবির থাম্বনেল তৈরি করুন

এই কোডল্যাব সম্পর্কে

subjectনভে ১৪, ২০২১-এ শেষবার আপডেট করা হয়েছে
account_circleGuillaume Laforge, Mete Atamel-এর লেখা

1. ওভারভিউ

এই কোড ল্যাবে, আপনি আগের ল্যাব তৈরি করেন এবং একটি থাম্বনেইল পরিষেবা যোগ করেন। থাম্বনেইল পরিষেবা হল একটি ওয়েব কন্টেইনার যা বড় ছবি তোলে এবং তা থেকে থাম্বনেল তৈরি করে।

ক্লাউড স্টোরেজে ছবি আপলোড করার সাথে সাথে ক্লাউড পাব/সাবের মাধ্যমে একটি ক্লাউড রান ওয়েব কন্টেইনারে একটি বিজ্ঞপ্তি পাঠানো হয়, যা পরে ছবিগুলির আকার পরিবর্তন করে এবং ক্লাউড স্টোরেজের অন্য একটি বালতিতে সেগুলিকে আবার সংরক্ষণ করে৷

31fa4f8a294d90df.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. এপিআই সক্ষম করুন

এই ল্যাবে, কন্টেইনার ইমেজ তৈরি করতে আপনার ক্লাউড বিল্ড এবং কন্টেইনার স্থাপনের জন্য ক্লাউড রানের প্রয়োজন হবে।

ক্লাউড শেল থেকে উভয় API সক্রিয় করুন:

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

আপনি সফলভাবে শেষ করতে অপারেশন দেখতে হবে:

Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.

4. আরেকটি বালতি তৈরি করুন

আপনি আপলোড করা ছবিগুলির থাম্বনেইলগুলি অন্য একটি বালতিতে সংরক্ষণ করবেন৷ আসুন দ্বিতীয় বালতি তৈরি করতে gsutil ব্যবহার করি।

ক্লাউড শেলের ভিতরে, অনন্য বালতি নামের জন্য একটি পরিবর্তনশীল সেট করুন। ক্লাউড শেল ইতিমধ্যেই আপনার অনন্য প্রকল্প আইডিতে GOOGLE_CLOUD_PROJECT সেট করেছে৷ আপনি বালতি নামের সাথে যে যোগ করতে পারেন. তারপরে, ইউনিফর্ম লেভেল অ্যাক্সেস সহ ইউরোপে একটি পাবলিক মাল্টি-রিজিয়ন বাকেট তৈরি করুন:

BUCKET_THUMBNAILS=thumbnails-$GOOGLE_CLOUD_PROJECT
gsutil mb -l EU gs://$BUCKET_THUMBNAILS
gsutil uniformbucketlevelaccess set on gs://$BUCKET_THUMBNAILS
gsutil iam ch allUsers:objectViewer gs://$BUCKET_THUMBNAILS

শেষ পর্যন্ত, আপনার একটি নতুন পাবলিক বালতি থাকা উচিত:

8e75c8099938e972.png

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

কোডটি ক্লোন করুন এবং পরিষেবা ধারণকারী ডিরেক্টরিতে যান:

git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop
cd serverless-photosharing-workshop/services/thumbnails/nodejs

পরিষেবাটির জন্য আপনার কাছে নিম্নলিখিত ফাইল বিন্যাস থাকবে:

services
 |
 ├── thumbnails
      |
      ├── nodejs
           |
           ├── Dockerfile
           ├── index.js
           ├── package.json

thumbnails/nodejs ফোল্ডারের ভিতরে, আপনার কাছে 3টি ফাইল রয়েছে:

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

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

কোডটি অন্বেষণ করতে, আপনি ক্লাউড শেল উইন্ডোর উপরে Open Editor বোতামে ক্লিক করে বিল্ট-ইন টেক্সট এডিটর ব্যবহার করতে পারেন:

3d145fe299dd8b3e.png

আপনি আরও স্ক্রীন রিয়েল এস্টেটের জন্য একটি ডেডিকেটেড ব্রাউজার উইন্ডোতে সম্পাদক খুলতে পারেন।

নির্ভরতা

package.json ফাইল প্রয়োজনীয় লাইব্রেরি নির্ভরতা সংজ্ঞায়িত করে:

{
  "name": "thumbnail_service",
  "version": "0.0.1",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "bluebird": "^3.7.2",
    "express": "^4.17.1",
    "imagemagick": "^0.1.3",
    "@google-cloud/firestore": "^4.9.9",
    "@google-cloud/storage": "^5.8.3"
  }
}

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

ডকারফাইল

Dockerfile অ্যাপ্লিকেশনটির জন্য ধারক চিত্রটি সংজ্ঞায়িত করে:

FROM node:14-slim

# installing Imagemagick
RUN set -ex; \
  apt-get -y update; \
  apt-get -y install imagemagick; \
  rm -rf /var/lib/apt/lists/*; \
  mkdir /tmp/original; \
  mkdir /tmp/thumbnail;

WORKDIR /picadaily/services/thumbnails
COPY package*.json ./
RUN npm install --production
COPY . .
CMD [ "npm", "start" ]

বেস ইমেজ হল Node 14 এবং imagemagick লাইব্রেরি ইমেজ ম্যানিপুলেশনের জন্য ব্যবহার করা হয়। কিছু অস্থায়ী ডিরেক্টরি মূল এবং থাম্বনেইল ছবি ফাইল ধারণ করার জন্য তৈরি করা হয়। তারপরে npm start দিয়ে কোড শুরু করার আগে আমাদের কোডের জন্য প্রয়োজনীয় NPM মডিউলগুলি ইনস্টল করা হয়।

index.js

আসুন কোডটি টুকরো টুকরো করে অন্বেষণ করি, যাতে আমরা এই প্রোগ্রামটি কী করছে তা আরও ভালভাবে বুঝতে পারি।

const express = require('express');
const imageMagick = require('imagemagick');
const Promise = require("bluebird");
const path = require('path');
const {Storage} = require('@google-cloud/storage');
const Firestore = require('@google-cloud/firestore');

const app = express();
app.use(express.json());

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

app.post('/', async (req, res) => {
    try {
        // ...
    } catch (err) {
        console.log(`Error: creating the thumbnail: ${err}`);
        console.error(err);
        res.status(500).send(err);
    }
});

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

const pubSubMessage = req.body;
console.log(`PubSub message: ${JSON.stringify(pubSubMessage)}`);

const fileEvent = JSON.parse(Buffer.from(pubSubMessage.message.data, 'base64').toString().trim());
console.log(`Received thumbnail request for file ${fileEvent.name} from bucket ${fileEvent.bucket}`);

ক্লাউড রান প্ল্যাটফর্মে, Pub/Sub বার্তাগুলি HTTP POST অনুরোধের মাধ্যমে পাঠানো হয়, ফর্মের JSON পেলোড হিসাবে:

{
  "message": {
    "attributes": {
      "bucketId": "uploaded-pictures",
      "eventTime": "2020-02-27T09:22:43.255225Z",
      "eventType": "OBJECT_FINALIZE",
      "notificationConfig": "projects/_/buckets/uploaded-pictures/notificationConfigs/28",
      "objectGeneration": "1582795363255481",
      "objectId": "IMG_20200213_181159.jpg",
      "payloadFormat": "JSON_API_V1"
    },
    "data": "ewogICJraW5kIjogInN0b3JhZ2Ujb2JqZWN...FQUU9Igp9Cg==",
    "messageId": "1014308302773399",
    "message_id": "1014308302773399",
    "publishTime": "2020-02-27T09:22:43.973Z",
    "publish_time": "2020-02-27T09:22:43.973Z"
  },
  "subscription": "projects/serverless-picadaily/subscriptions/gcs-events-subscription"
}

কিন্তু এই JSON ডকুমেন্টে যেটা সত্যিই আকর্ষণীয় তা হল message.data অ্যাট্রিবিউটে যা আছে, যেটি শুধুমাত্র একটি স্ট্রিং কিন্তু এটি প্রকৃত পেলোডকে বেস 64-এ এনকোড করে। তাই আমাদের উপরের কোডটি এই অ্যাট্রিবিউটের বেস 64 বিষয়বস্তুকে ডিকোড করছে। . সেই data অ্যাট্রিবিউটে একবার ডিকোড করা হলে অন্য JSON ডকুমেন্ট থাকে যা ক্লাউড স্টোরেজ ইভেন্টের বিবরণ উপস্থাপন করে, যা অন্যান্য মেটাডেটার মধ্যে ফাইলের নাম এবং বাকেটের নাম নির্দেশ করে।

{
  "kind": "storage#object",
  "id": "uploaded-pictures/IMG_20200213_181159.jpg/1582795363255481",
  "selfLink": "https://www.googleapis.com/storage/v1/b/uploaded-pictures/o/IMG_20200213_181159.jpg",
  "name": "IMG_20200213_181159.jpg",
  "bucket": "uploaded-pictures",
  "generation": "1582795363255481",
  "metageneration": "1",
  "contentType": "image/jpeg",
  "timeCreated": "2020-02-27T09:22:43.255Z",
  "updated": "2020-02-27T09:22:43.255Z",
  "storageClass": "STANDARD",
  "timeStorageClassUpdated": "2020-02-27T09:22:43.255Z",
  "size": "4944335",
  "md5Hash": "QzBIoPJBV2EvqB1EVk1riw==",
  "mediaLink": "https://www.googleapis.com/download/storage/v1/b/uploaded-pictures/o/IMG_20200213_181159.jpg?generation=1582795363255481&alt=media",
  "crc32c": "hQ3uHg==",
  "etag": "CLmJhJu08ecCEAE="
}

আমরা ছবিটি এবং বালতির নামগুলিতে আগ্রহী, কারণ আমাদের কোডটি থাম্বনেইল চিকিত্সার জন্য বালতি থেকে ছবিটি আনতে যাচ্ছে:

const bucket = storage.bucket(fileEvent.bucket);
const thumbBucket = storage.bucket(process.env.BUCKET_THUMBNAILS);

const originalFile = path.resolve('/tmp/original', fileEvent.name);
const thumbFile = path.resolve('/tmp/thumbnail', fileEvent.name);

await bucket.file(fileEvent.name).download({
    destination: originalFile
});
console.log(`Downloaded picture into ${originalFile}`);

আমরা একটি পরিবেশ পরিবর্তনশীল থেকে আউটপুট স্টোরেজ বাকেটের নাম পুনরুদ্ধার করছি।

আমাদের কাছে অরিজিন বাকেট রয়েছে যার ফাইল তৈরির ফলে আমাদের ক্লাউড রান পরিষেবা ট্রিগার হয়েছে এবং গন্তব্য বাকেট যেখানে আমরা ফলস্বরূপ ছবি সংরক্ষণ করব। আমরা স্থানীয় ফাইল হ্যান্ডলিং করার জন্য path -ইন API ব্যবহার করছি, কারণ imagemagick লাইব্রেরি /tmp অস্থায়ী ডিরেক্টরিতে স্থানীয়ভাবে থাম্বনেইল তৈরি করবে। আপলোড করা ইমেজ ফাইলটি ডাউনলোড করার জন্য আমরা একটি অ্যাসিঙ্ক্রোনাস কলের জন্য await

const resizeCrop = Promise.promisify(im.crop);
await resizeCrop({
        srcPath: originalFile,
        dstPath: thumbFile,
        width: 400,
        height: 400        
});
console.log(`Created local thumbnail in ${thumbFile}`);

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

await thumbBucket.upload(thumbFile);
console.log(`Uploaded thumbnail to Cloud Storage bucket ${process.env.BUCKET_THUMBNAILS}`);

থাম্বনেইল ফাইলটি ক্লাউড স্টোরেজে আপলোড হয়ে গেলে, আমরা ক্লাউড ফায়ারস্টোরে একটি বুলিয়ান ফ্ল্যাগ যোগ করতে মেটাডেটাও আপডেট করব যা নির্দেশ করে যে এই ছবির থাম্বনেলটি প্রকৃতপক্ষে তৈরি হয়েছে:

const pictureStore = new Firestore().collection('pictures');
const doc = pictureStore.doc(fileEvent.name);
await doc.set({
    thumbnail: true
}, {merge: true});
console.log(`Updated Firestore about thumbnail creation for ${fileEvent.name}`);

res.status(204).send(`${fileEvent.name} processed`);

আমাদের অনুরোধ শেষ হয়ে গেলে, আমরা HTTP POST অনুরোধের উত্তর দিই যে ফাইলটি সঠিকভাবে প্রক্রিয়া করা হয়েছে।

const PORT = process.env.PORT || 8080;

app.listen(PORT, () => {
    console.log(`Started thumbnail generator on port ${PORT}`);
});

আমাদের সোর্স ফাইলের শেষে, আমাদের কাছে নির্দেশ রয়েছে যে এক্সপ্রেস আসলে 8080 ডিফল্ট পোর্টে আমাদের ওয়েব অ্যাপ্লিকেশন শুরু করতে পারে।

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

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

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

npm install; npm start

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

Started thumbnail generator on port 8080

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

8. কন্টেইনার ইমেজ তৈরি ও প্রকাশ করুন

ক্লাউড রান কন্টেইনার চালায় তবে আপনাকে প্রথমে কন্টেইনার ইমেজ তৈরি করতে হবে ( Dockerfile সংজ্ঞায়িত)। Google ক্লাউড বিল্ড কনটেইনার ইমেজ তৈরি করতে এবং তারপর Google কন্টেইনার রেজিস্ট্রিতে হোস্ট করতে ব্যবহার করা যেতে পারে।

thumbnails/nodejs ফোল্ডারের ভিতরে যেখানে Dockerfile রয়েছে, কন্টেইনার ইমেজ তৈরি করতে নিম্নলিখিত কমান্ডটি জারি করুন:

gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/thumbnail-service

এক বা দুই মিনিটের পরে, বিল্ডটি সফল হওয়া উচিত:

b354b3a9a3631097.png

ক্লাউড বিল্ড "ইতিহাস" বিভাগে সফল বিল্ডটিও দেখাতে হবে:

df00f198dd2bf6bf.png

বিস্তারিত ভিউ পেতে বিল্ড আইডিতে ক্লিক করলে, "বিল্ড আর্টিফ্যাক্টস" ট্যাবে আপনি দেখতে পাবেন যে কন্টেইনার ইমেজটি ক্লাউড রেজিস্ট্রিতে (GCR) আপলোড করা হয়েছে:

a4577ce0744f73e2.png

আপনি যদি চান, আপনি ক্লাউড শেল এ কন্টেইনার ইমেজ স্থানীয়ভাবে চলে কিনা তা দুবার চেক করতে পারেন:

docker run -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/thumbnail-service

এটি কনটেইনারে পোর্ট 8080 এ সার্ভার শুরু করা উচিত:

Started thumbnail generator on port 8080

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

9. ক্লাউড রানে স্থাপন করুন

ক্লাউড রানে স্থাপন করার আগে, ক্লাউড রান অঞ্চলটিকে একটি সমর্থিত অঞ্চলে সেট করুন এবং managed জন্য প্ল্যাটফর্ম:

gcloud config set run/region europe-west1
gcloud config set run/platform managed

আপনি কনফিগারেশন সেট করা আছে কিনা তা পরীক্ষা করতে পারেন:

gcloud config list

...
[run]
platform = managed
region = europe-west1

ক্লাউড রানে কন্টেইনার ইমেজ স্থাপন করতে নিম্নলিখিত কমান্ডটি চালান:

SERVICE_NAME=thumbnail-service
gcloud run deploy $SERVICE_NAME \
    --image gcr.io/$GOOGLE_CLOUD_PROJECT/thumbnail-service \
    --no-allow-unauthenticated \
    --update-env-vars BUCKET_THUMBNAILS=$BUCKET_THUMBNAILS

নোট করুন --no-allow-unauthenticated পতাকা। এটি ক্লাউড রান পরিষেবাকে একটি অভ্যন্তরীণ পরিষেবা করে তোলে যা শুধুমাত্র নির্দিষ্ট পরিষেবা অ্যাকাউন্টগুলির দ্বারা ট্রিগার করা হবে৷

স্থাপনা সফল হলে, আপনি নিম্নলিখিত আউটপুট দেখতে হবে:

c0f28e7d6de0024.png

আপনি যদি ক্লাউড কনসোল UI-তে যান, তাহলে আপনাকে দেখতে হবে যে পরিষেবাটি সফলভাবে স্থাপন করা হয়েছে:

9bfe48e3c8b597e5.png

10. পাব/সাবের মাধ্যমে ক্লাউড রানে ক্লাউড স্টোরেজ ইভেন্ট

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

যোগাযোগের পাইপলাইন হিসাবে একটি পাব/সাব বিষয় তৈরি করুন:

TOPIC_NAME=cloudstorage-cloudrun-topic
gcloud pubsub topics create $TOPIC_NAME

ফাইলগুলি বালতিতে সংরক্ষণ করা হলে পাব/সাব বিজ্ঞপ্তি তৈরি করুন:

BUCKET_PICTURES=uploaded-pictures-$GOOGLE_CLOUD_PROJECT
gsutil notification create -t $TOPIC_NAME -f json gs://$BUCKET_PICTURES

পাব/সাবস্ক্রিপশনের জন্য একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন যা আমরা পরে তৈরি করব:

SERVICE_ACCOUNT=$TOPIC_NAME-sa
gcloud iam service-accounts create $SERVICE_ACCOUNT \
     --display-name "Cloud Run Pub/Sub Invoker"

একটি ক্লাউড রান পরিষেবা চালু করার জন্য পরিষেবা অ্যাকাউন্টের অনুমতি দিন:

SERVICE_NAME=thumbnail-service
gcloud run services add-iam-policy-binding $SERVICE_NAME \
   --member=serviceAccount:$SERVICE_ACCOUNT@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
   --role=roles/run.invoker

আপনি যদি 8 এপ্রিল, 2021 তারিখে বা তার আগে Pub/Sub পরিষেবা অ্যাকাউন্ট সক্রিয় করে থাকেন, তাহলে Pub/Sub পরিষেবা অ্যাকাউন্টে iam.serviceAccountTokenCreator ভূমিকা প্রদান করুন:

PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format='value(projectNumber)')
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
     --member=serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
     --role=roles/iam.serviceAccountTokenCreator

IAM পরিবর্তনগুলি প্রচারিত হতে কয়েক মিনিট সময় লাগতে পারে৷

অবশেষে, পরিষেবা অ্যাকাউন্টের সাথে একটি পাব/সাবস্ক্রিপশন তৈরি করুন:

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --format 'value(status.url)')
gcloud pubsub subscriptions create $TOPIC_NAME-subscription --topic $TOPIC_NAME \
   --push-endpoint=$SERVICE_URL \
   --push-auth-service-account=$SERVICE_ACCOUNT@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com

আপনি একটি সাবস্ক্রিপশন তৈরি করা হয়েছে চেক করতে পারেন. কনসোলে পাব/সাব-এ যান, gcs-events বিষয় নির্বাচন করুন এবং নীচে, আপনাকে সদস্যতা দেখতে হবে:

e8ab86dccb8d890.png

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

সেটআপটি কাজ করছে কিনা তা পরীক্ষা করতে, uploaded-pictures বালতিতে একটি নতুন ছবি আপলোড করুন এবং thumbnails বাকেটটিতে চেক করুন যে নতুন আকারের ছবিগুলি প্রত্যাশিত হিসাবে প্রদর্শিত হবে৷

ক্লাউড রান পরিষেবার বিভিন্ন ধাপের মধ্য দিয়ে যাওয়া লগিং বার্তাগুলি দেখতে আপনি লগগুলিকে দুবার চেক করতে পারেন:

42c025e2d7d6ca3a.png

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

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

বালতি মুছুন:

gsutil rb gs://$BUCKET_THUMBNAILS

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

gcloud run services delete $SERVICE_NAME -q

পাব/সাব বিষয় মুছুন:

gcloud pubsub topics delete $TOPIC_NAME

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

gcloud projects delete $GOOGLE_CLOUD_PROJECT

13. অভিনন্দন!

সবকিছু এখন জায়গায় আছে:

  • ক্লাউড স্টোরেজে একটি বিজ্ঞপ্তি তৈরি করা হয়েছে যা একটি নতুন ছবি আপলোড করা হলে একটি বিষয়ে পাব/সাব বার্তা পাঠায়।
  • প্রয়োজনীয় IAM বাইন্ডিং এবং অ্যাকাউন্টগুলি সংজ্ঞায়িত করা হয়েছে (ক্লাউড ফাংশনগুলির বিপরীতে যেখানে এটি সমস্ত স্বয়ংক্রিয়, এটি এখানে ম্যানুয়ালি কনফিগার করা হয়েছে)।
  • একটি সাবস্ক্রিপশন তৈরি করা হয়েছে যাতে আমাদের ক্লাউড রান পরিষেবা পাব/সাব বার্তাগুলি পায়৷
  • যখনই বালতিতে একটি নতুন ছবি আপলোড করা হয়, নতুন ক্লাউড রান পরিষেবার জন্য ছবিটির আকার পরিবর্তন করা হয়৷

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

  • ক্লাউড রান
  • ক্লাউড স্টোরেজ
  • ক্লাউড পাব/সাব

পরবর্তী পদক্ষেপ