প্রতিদিনের ছবি: ল্যাব 3—সবচেয়ে সাম্প্রতিক ছবিগুলির একটি কোলাজ তৈরি করুন৷

1. ওভারভিউ

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

df20f5d0402b54b4.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 cloudscheduler.googleapis.com

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

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

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

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

git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop

তারপরে আপনি পরিষেবা ধারণকারী ডিরেক্টরিতে যেতে পারেন:

cd serverless-photosharing-workshop/services/collage/nodejs

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

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

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

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

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

নির্ভরতা

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

{
  "name": "collage_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"
  }
}

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

ডকারফাইল

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/*

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

আমরা একটি হালকা Node 14 বেস ইমেজ ব্যবহার করছি। আমরা ইমেজ ম্যাজিক লাইব্রেরি ইনস্টল করছি। তারপরে আমরা আমাদের কোডের জন্য প্রয়োজনীয় এনপিএম মডিউলগুলি ইনস্টল করছি এবং আমরা এনপিএম স্টার্ট দিয়ে আমাদের নোড কোড চালাচ্ছি।

index.js

আসুন আমাদের 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');

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

const app = express();

app.get('/', async (req, res) => {
    try {
        console.log('Collage request');

        /* ... */

    } catch (err) {
        console.log(`Error: creating the collage: ${err}`);
        console.error(err);
        res.status(500).send(err);
    }
});

উপরে, আমাদের নোড হ্যান্ডলারের কাঠামো রয়েছে: আমাদের অ্যাপ HTTP GET অনুরোধগুলিতে সাড়া দেয়। এবং আমরা ত্রুটি হ্যান্ডলিং একটি বিট করছেন ক্ষেত্রে কিছু ভুল হয়ে যায়. এখন এই কাঠামোর ভিতরে কি আছে তা দেখে নেওয়া যাক।

const thumbnailFiles = [];
const pictureStore = new Firestore().collection('pictures');
const snapshot = await pictureStore
    .where('thumbnail', '==', true)
    .orderBy('created', 'desc')
    .limit(4).get();

if (snapshot.empty) {
    console.log('Empty collection, no collage to make');
    res.status(204).send("No collage created.");
} else {

    /* ... */

}

আমাদের কোলাজ পরিষেবাতে কমপক্ষে চারটি ছবি লাগবে (যার থাম্বনেল তৈরি করা হয়েছে), তাই প্রথমে 4টি ছবি আপলোড করতে ভুলবেন না।

আমরা ক্লাউড ফায়ারস্টোরে সংরক্ষিত মেটাডেটা থেকে আমাদের ব্যবহারকারীদের দ্বারা আপলোড করা 4টি সাম্প্রতিক ছবি পুনরুদ্ধার করি। আমরা ফলাফল সংগ্রহটি খালি কিনা তা পরীক্ষা করি এবং তারপরে আমাদের কোডের অন্য শাখায় আরও এগিয়ে যাই।

ফাইলের নামের তালিকা সংগ্রহ করা যাক:

snapshot.forEach(doc => {
    thumbnailFiles.push(doc.id);
});
console.log(`Picture file names: ${JSON.stringify(thumbnailFiles)}`);

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

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

await Promise.all(thumbnailFiles.map(async fileName => {
    const filePath = path.resolve('/tmp', fileName);
    await thumbBucket.file(fileName).download({
        destination: filePath
    });
}));
console.log('Downloaded all thumbnails');

সর্বশেষ থাম্বনেইলগুলি আপলোড হয়ে গেলে, আমরা সেই থাম্বনেইল ছবির একটি 4x4 গ্রিড তৈরি করতে ImageMagick লাইব্রেরি ব্যবহার করতে যাচ্ছি। আমরা ব্লুবার্ড লাইব্রেরি এবং এর প্রতিশ্রুতি বাস্তবায়ন ব্যবহার করি কলব্যাক-চালিত কোডটিকে async / await ফ্রেন্ডলি কোডে রূপান্তর করতে, তারপর আমরা সেই প্রতিশ্রুতির জন্য অপেক্ষা করি যা ইমেজ কোলাজ তৈরি করছে:

const collagePath = path.resolve('/tmp', 'collage.png');

const thumbnailPaths = thumbnailFiles.map(f => path.resolve('/tmp', f));
const convert = Promise.promisify(im.convert);
await convert([
    '(', ...thumbnailPaths.slice(0, 2), '+append', ')',
    '(', ...thumbnailPaths.slice(2), '+append', ')',
    '-size', '400x400', 'xc:none', '-background', 'none',  '-append',
    collagePath]);
console.log("Created local collage picture");

যেহেতু কোলাজ ছবি স্থানীয়ভাবে অস্থায়ী ফোল্ডারে ডিস্কে সংরক্ষণ করা হয়েছে, আমাদের এখন এটিকে ক্লাউড স্টোরেজে আপলোড করতে হবে, এবং তারপর একটি সফল প্রতিক্রিয়া ফেরত দিতে হবে (স্ট্যাটাস কোড 2xx):

await thumbBucket.upload(collagePath);
console.log("Uploaded collage to Cloud Storage bucket ${process.env.BUCKET_THUMBNAILS}");

res.status(204).send("Collage created.");

এখন আমাদের নোড স্ক্রিপ্ট ইনকামিং অনুরোধ শোনার সময়:

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

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

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

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

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

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

npm install; npm start

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

Started collage service on port 8080

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

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

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

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

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

gcloud config list

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

ক্লাউড বিল্ড ম্যানুয়ালি ব্যবহার করে কন্টেইনার ইমেজ তৈরি ও প্রকাশ করার পরিবর্তে, আপনি Google ক্লাউড বিল্ডপ্যাক ব্যবহার করে আপনার জন্য কন্টেইনার ইমেজ তৈরি করতে ক্লাউড রানের উপরও নির্ভর করতে পারেন।

কন্টেইনার ইমেজ তৈরি করতে নিম্নলিখিত কমান্ডটি চালান:

BUCKET_THUMBNAILS=thumbnails-$GOOGLE_CLOUD_PROJECT
SERVICE_NAME=collage-service
gcloud run deploy $SERVICE_NAME \
    --source . \
    --no-allow-unauthenticated \
    --update-env-vars BUCKET_THUMBNAILS=$BUCKET_THUMBNAILS

–-source পতাকা নোট করুন. এটি ক্লাউড রানে উত্স ভিত্তিক স্থাপনা । যদি একটি Dockerfile সোর্স কোড ডিরেক্টরিতে উপস্থিত থাকে, আপলোড করা সোর্স কোডটি সেই Dockerfile ব্যবহার করে তৈরি করা হয়। সোর্স কোড ডিরেক্টরিতে কোনো Dockerfile না থাকলে, Google ক্লাউড বিল্ডপ্যাকগুলি স্বয়ংক্রিয়ভাবে আপনি যে ভাষা ব্যবহার করছেন তা সনাক্ত করে এবং Google দ্বারা পরিচালিত একটি সুরক্ষিত বেস ইমেজ ব্যবহার করে একটি প্রোডাকশন-রেডি কন্টেইনার ইমেজ তৈরি করতে কোডের নির্ভরতা নিয়ে আসে। এটি Dockerfile সংজ্ঞায়িত কন্টেইনার ইমেজ তৈরি করতে Google ক্লাউড বিল্ডপ্যাক ব্যবহার করতে ক্লাউড রানকে পতাকাঙ্কিত করে।

এছাড়াও মনে রাখবেন যে উত্স ভিত্তিক স্থাপনা নির্মিত পাত্রে সংরক্ষণ করতে আর্টিফ্যাক্ট রেজিস্ট্রি ব্যবহার করে। আর্টিফ্যাক্ট রেজিস্ট্রি হল Google কন্টেইনার রেজিস্ট্রির একটি আধুনিক সংস্করণ। CLI এপিআই সক্ষম করার জন্য অনুরোধ করবে যদি এটি ইতিমধ্যেই প্রকল্পে সক্ষম না থাকে এবং আপনি যে অঞ্চলে স্থাপন করছেন সেখানে cloud-run-source-deploy নামে একটি সংগ্রহস্থল তৈরি করবে।

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

8. ক্লাউড শিডিউলার সেট আপ করুন

এখন যেহেতু ক্লাউড রান পরিষেবা প্রস্তুত এবং স্থাপন করা হয়েছে, এটি নিয়মিত সময়সূচী তৈরি করার, প্রতি মিনিটে পরিষেবাটি চালু করার সময়।

একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন:

SERVICE_ACCOUNT=collage-scheduler-sa
gcloud iam service-accounts create $SERVICE_ACCOUNT \
   --display-name "Collage Scheduler Service Account"

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

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

প্রতি 1 মিনিটে কার্যকর করার জন্য একটি ক্লাউড শিডিউলার কাজ তৈরি করুন:

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --format 'value(status.url)')
gcloud scheduler jobs create http $SERVICE_NAME-job --schedule "* * * * *" \
   --http-method=GET \
   --location=europe-west1 \
   --uri=$SERVICE_URL \
   --oidc-service-account-email=$SERVICE_ACCOUNT@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
   --oidc-token-audience=$SERVICE_URL

আপনি ক্লাউড কনসোলের ক্লাউড শিডিউলার বিভাগে যেতে পারেন যে এটি সেটআপ করা হয়েছে এবং ক্লাউড রান পরিষেবা url এর দিকে নির্দেশ করছে:

35119e28c1da53f3.png

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

সেটআপটি কাজ করছে কিনা তা পরীক্ষা করতে, কোলাজ চিত্রের জন্য thumbnails বাকেটটি পরীক্ষা করুন (যাকে বলা হয় collage.png )৷ আপনি পরিষেবার লগগুলিও পরীক্ষা করতে পারেন:

93922335a384be2e.png

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

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

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

gcloud run services delete $SERVICE_NAME -q

ক্লাউড শিডিউলার কাজ মুছুন:

gcloud scheduler jobs delete $SERVICE_NAME-job -q

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

gcloud projects delete $GOOGLE_CLOUD_PROJECT

11. অভিনন্দন!

অভিনন্দন! আপনি একটি নির্ধারিত পরিষেবা তৈরি করেছেন: ক্লাউড শিডিউলারকে ধন্যবাদ, যা একটি পাব/সাব বিষয়ে প্রতি মিনিটে একটি বার্তা পাঠায়, আপনার ক্লাউড রান কোলাজ পরিষেবাটি চালু করা হয়েছে এবং ফলস্বরূপ ছবি তৈরি করতে ছবিগুলি একসাথে যুক্ত করতে সক্ষম৷

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

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

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