1. ওভারভিউ
পূর্ববর্তী ল্যাবগুলিতে, আপনি Pic-a-Daily অ্যাপের একটি ইভেন্ট-চালিত সংস্করণ তৈরি করেছেন যা চিত্র বিশ্লেষণ পরিষেবার জন্য একটি Google ক্লাউড স্টোরেজ ট্রিগার ক্লাউড ফাংশন ব্যবহার করে, থাম্বনেইল পরিষেবার জন্য Pub/Sub-এর মাধ্যমে একটি GCS ট্রিগার ক্লাউড রান কন্টেইনার এবং ক্লাউড রানে ইমেজ গারবেজ কালেক্টর পরিষেবা ট্রিগার করতে Eventarc। এছাড়াও একটি ক্লাউড শিডিউলার ট্রিগার করা কোলাজ পরিষেবা ছিল:

এই ল্যাবে, আপনি অ্যাপটির একটি অর্কেস্ট্রেটেড সংস্করণ তৈরি করবেন। সিস্টেমের মধ্য দিয়ে প্রবাহিত বিভিন্ন ধরণের ইভেন্টের পরিবর্তে, আপনি নিম্নোক্তভাবে অর্কেস্ট্রেট এবং কল করার জন্য ওয়ার্কফ্লো ব্যবহার করবেন:

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



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

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

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

সার্ভারবিহীন ওয়ার্কফ্লো তৈরি করতে আপনি ওয়ার্কফ্লো ব্যবহার করতে পারেন যা আপনার সংজ্ঞায়িত ক্রমানুসারে সার্ভারহীন কাজগুলির একটি সিরিজকে একসাথে লিঙ্ক করে। আপনি Google ক্লাউডের API এর শক্তি, ক্লাউড ফাংশন এবং ক্লাউড রানের মতো সার্ভারহীন পণ্য এবং নমনীয় সার্ভারহীন অ্যাপ্লিকেশন তৈরি করতে বাহ্যিক API তে কল করতে পারেন।
আপনি একজন অর্কেস্ট্রেটরের কাছ থেকে আশা করতে পারেন, ওয়ার্কফ্লো আপনাকে YAML/JSON ভিত্তিক ওয়ার্কফ্লো সংজ্ঞা ভাষায় আপনার ব্যবসার যুক্তির প্রবাহকে সংজ্ঞায়িত করতে দেয় এবং সেই প্রবাহগুলিকে ট্রিগার করার জন্য একটি Workflows Execution API এবং Workflows UI প্রদান করে।
এটি এই অন্তর্নির্মিত এবং কনফিগারযোগ্য বৈশিষ্ট্যগুলির সাথে একটি নিছক অর্কেস্ট্রেটরের চেয়ে বেশি:
- নমনীয় পুনঃপ্রচেষ্টা এবং পদক্ষেপগুলির নির্ভরযোগ্য সম্পাদনের জন্য ধাপগুলির মধ্যে ত্রুটি পরিচালনা।
- আঠালো-কোড এড়ানোর জন্য JSON পার্সিং এবং ভেরিয়েবল ধাপের মধ্যে পাসিং।
- সিদ্ধান্তের জন্য অভিব্যক্তি সূত্র শর্তসাপেক্ষ পদক্ষেপ কার্যকর করার অনুমতি দেয়।
- মডুলার এবং পুনরায় ব্যবহারযোগ্য ওয়ার্কফ্লোগুলির জন্য সাবওয়ার্কফ্লো।
- বাহ্যিক পরিষেবাগুলির জন্য সমর্থন Google ক্লাউডের বাইরে পরিষেবাগুলির অর্কেস্ট্রেশনের অনুমতি দেয়৷
- Google ক্লাউড এবং নিরাপদ পদক্ষেপ সম্পাদনের জন্য বহিরাগত পরিষেবাগুলির জন্য প্রমাণীকরণ সমর্থন।
- Google ক্লাউড পরিষেবাগুলির সংযোগকারীগুলি যেমন Pub/Sub, Firestore, Tasks, সিক্রেট ম্যানেজার সহজে একীকরণের জন্য৷
উল্লেখ করার মতো নয়, ওয়ার্কফ্লোস একটি সম্পূর্ণরূপে পরিচালিত সার্ভারবিহীন পণ্য। কনফিগার বা স্কেল করার জন্য কোনও সার্ভার নেই এবং আপনি যা ব্যবহার করেন তার জন্য আপনি কেবল অর্থ প্রদান করেন।
4. APIs সক্ষম করুন৷
এই ল্যাবে, আপনি ক্লাউড ফাংশন এবং ক্লাউড রান পরিষেবাগুলিকে ওয়ার্কফ্লোগুলির সাথে সংযুক্ত করবেন৷ আপনি অ্যাপ ইঞ্জিন, ক্লাউড বিল্ড, ভিশন API এবং অন্যান্য পরিষেবাগুলিও ব্যবহার করবেন৷
ক্লাউড শেল-এ, নিশ্চিত করুন যে সমস্ত প্রয়োজনীয় পরিষেবা সক্রিয় আছে:
gcloud services enable \ appengine.googleapis.com \ cloudbuild.googleapis.com \ cloudfunctions.googleapis.com \ compute.googleapis.com \ firestore.googleapis.com \ run.googleapis.com \ vision.googleapis.com \ workflows.googleapis.com \
কিছু সময় পরে, আপনি সফলভাবে অপারেশন শেষ দেখতে হবে:
Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.
5. কোড পান
কোডটি পান, যদি আপনি ইতিমধ্যে পূর্ববর্তী কোড ল্যাবগুলিতে না থাকেন:
git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop
আপনার কাছে নিম্নলিখিত ফোল্ডার কাঠামো থাকবে যা এই ল্যাবের জন্য প্রাসঙ্গিক:
frontend | workflows | ├── functions ├── |── trigger-workflow ├── |── vision-data-transform ├── services ├── |── collage ├── |── thumbnails ├── workflows.yaml
এই প্রাসঙ্গিক ফোল্ডার:
-
frontendঅ্যাপ ইঞ্জিন ফ্রন্টএন্ড রয়েছে যা আমরা ল্যাব 4 থেকে পুনরায় ব্যবহার করব। -
functionsজন্য তৈরি করা ক্লাউড ফাংশনগুলি রয়েছে৷ -
servicesওয়ার্কফ্লো-এর জন্য পরিবর্তিত ক্লাউড রান পরিষেবা রয়েছে৷ -
workflows.yamlহল ওয়ার্কফ্লো সংজ্ঞা ফাইল।
6. ওয়ার্কফ্লোস YAML অন্বেষণ করুন
workflows.yaml একাধিক ধাপে ওয়ার্কফ্লোকে সংজ্ঞায়িত করে। এটি আরও ভালভাবে বোঝার জন্য এর মধ্য দিয়ে যাওয়া যাক।
ওয়ার্কফ্লো শুরুতে, কিছু প্যারামিটার আছে যেগুলো পাস করা হয়। সেগুলো দুটি ক্লাউড ফাংশন দ্বারা পাস করা হবে যা ওয়ার্কফ্লোকে ট্রিগার করবে। আমরা পরে এই ফাংশনগুলিতে পৌঁছব তবে ওয়ার্কফ্লোগুলি এভাবে শুরু হয়:

YAML-এ, আপনি দেখতে পাচ্ছেন যে এই প্যারামিটারগুলি init ধাপে ভেরিয়েবলগুলিতে বরাদ্দ করা হয়েছে যেমন ফাইল এবং বাকেটের নামগুলি ইভেন্টটিকে ট্রিগার করে এবং কিছু ক্লাউড ফাংশন এবং ক্লাউড রান পরিষেবাগুলির URL যা ওয়ার্কফ্লো কল করবে:
main:
params: [args]
steps:
- init:
assign:
- file: ${args.file}
- bucket: ${args.bucket}
- gsUri: ${"gs://" + bucket + "/" + file}
- projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
- urls: ${args.urls}
এর পরে, ওয়ার্কফ্লো ইভেন্টের ধরন পরীক্ষা করে। এখানে 2টি ইভেন্টের ধরন সমর্থিত: object.finalize (ক্লাউড স্টোরেজ বালতিতে একটি ফাইল সংরক্ষণ করা হলে নির্গত হয়) এবং object.delete (ফাইল মুছে ফেলা হলে নির্গত হয়)। অন্য কিছু এমন একটি ঘটনা উত্থাপন করবে যা সমর্থিত ব্যতিক্রম নয়।

YAML ওয়ার্কফ্লো সংজ্ঞায় এই ধাপটি, যেখানে আমরা ফাইল স্টোরেজ ইভেন্টের ধরন পরীক্ষা করি:
- eventTypeSwitch:
switch:
- condition: ${args.eventType == "google.storage.object.finalize"}
next: imageAnalysisCall
- condition: ${args.eventType == "google.storage.object.delete"}
next: pictureGarbageCollectionGCS
- eventTypeNotSupported:
raise: ${"eventType " + args.eventType + " is not supported"}
next: end
লক্ষ্য করুন কিভাবে ওয়ার্কফ্লোস সুইচের বিবৃতি এবং ব্যতিক্রম হ্যান্ডলিংকে সমর্থন করে, সুইচ নির্দেশনা এবং এর বিভিন্ন শর্ত সহ, এবং ইভেন্টটি স্বীকৃত না হলে একটি ত্রুটি উত্থাপন করার নির্দেশনা বৃদ্ধি করে।
এর পরে, আসুন imageAnalysisCall দেখে নেওয়া যাক। এটি চিত্র বিশ্লেষণ করার জন্য Vision API-কে কল করতে, ছবিতে স্বীকৃত জিনিসগুলির লেবেলগুলি সাজানোর জন্য Vision API প্রতিক্রিয়া ডেটা রূপান্তর করতে, প্রভাবশালী রঙগুলি বেছে নিতে, ছবিটি প্রদর্শনের জন্য নিরাপদ কিনা তা পরীক্ষা করতে ওয়ার্কফ্লোস থেকে কলের একটি সিরিজ। তারপর মেটাডেটা ক্লাউড ফায়ারস্টোরে সংরক্ষণ করুন।
মনে রাখবেন যে ভিশন ট্রান্সফর্ম ক্লাউড ফাংশনগুলি (যা আমরা পরে স্থাপন করব) ছাড়া ওয়ার্কফ্লোতে সবকিছু করা হয়:

YAML-এ পদক্ষেপগুলি এইভাবে দেখায়:
- imageAnalysisCall:
call: http.post
args:
url: https://vision.googleapis.com/v1/images:annotate
headers:
Content-Type: application/json
auth:
type: OAuth2
body:
requests:
- image:
source:
gcsImageUri: ${gsUri}
features:
- type: LABEL_DETECTION
- type: SAFE_SEARCH_DETECTION
- type: IMAGE_PROPERTIES
result: imageAnalysisResponse
- transformImageAnalysisData:
call: http.post
args:
url: ${urls.VISION_DATA_TRANSFORM_URL}
auth:
type: OIDC
body: ${imageAnalysisResponse.body}
result: imageMetadata
- checkSafety:
switch:
- condition: ${imageMetadata.body.safe == true}
next: storeMetadata
next: end
- storeMetadata:
call: http.request
args:
url: ${"https://firestore.googleapis.com/v1/projects/" + projectId + "/databases/(default)/documents/pictures/" + file + "?updateMask.fieldPaths=color&updateMask.fieldPaths=labels&updateMask.fieldPaths=created"}
auth:
type: OAuth2
method: PATCH
body:
name: ${"projects/" + projectId + "/databases/(default)/documents/pictures/" + file}
fields:
color:
stringValue: ${imageMetadata.body.color}
created:
timestampValue: ${imageMetadata.body.created}
labels:
arrayValue:
values: ${imageMetadata.body.labels}
result: storeMetadataResponse
একবার ইমেজ বিশ্লেষণ করা হলে, পরবর্তী দুটি ধাপ হল ইমেজের থাম্বনেইল এবং সাম্প্রতিক ইমেজের একটি কোলাজ তৈরি করা। এটি 2টি ক্লাউড রান পরিষেবা স্থাপন করে এবং thumbnailCall এবং collageCall ধাপ থেকে তাদের কল করার মাধ্যমে করা হয়:

YAML-এ পদক্ষেপ:
- thumbnailCall:
call: http.post
args:
url: ${urls.THUMBNAILS_URL}
auth:
type: OIDC
body:
gcsImageUri: ${gsUri}
result: thumbnailResponse
- collageCall:
call: http.get
args:
url: ${urls.COLLAGE_URL}
auth:
type: OIDC
result: collageResponse
finalizeCompleted ধাপে প্রতিটি পরিষেবা থেকে স্ট্যাটাস কোড ফেরত দিয়ে সম্পাদনের এই শাখাটি শেষ হয়:
- finalizeCompleted:
return:
imageAnalysis: ${imageAnalysisResponse.code}
storeMetadata: ${storeMetadataResponse.code}
thumbnail: ${thumbnailResponse.code}
collage: ${collageResponse.code}
এক্সিকিউশনের অন্য শাখাটি হল যখন একটি ফাইল প্রধান স্টোরেজ বালতি থেকে মুছে ফেলা হয়, যাতে ছবিগুলির উচ্চ-রেজোলিউশন সংস্করণ থাকে। এই শাখায়, আমরা থাম্বনেইল সম্বলিত বালতিতে ছবির থাম্বনেইল মুছে ফেলতে চাই এবং Firestore থেকে এর মেটাডেটা মুছে ফেলতে চাই। এই দুটিই ওয়ার্কফ্লো থেকে HTTP কলগুলির সাথে করা হয়:

YAML-এ পদক্ষেপ:
- pictureGarbageCollectionGCS:
try:
call: http.request
args:
url: ${"https://storage.googleapis.com/storage/v1/b/thumbnails-" + projectId + "/o/" + file}
auth:
type: OAuth2
method: DELETE
result: gcsDeletionResult
except:
as: e
steps:
- dummyResultInOutVar:
assign:
- gcsDeletionResult:
code: 200
body: "Workaround for empty body response"
- pictureGarbageCollectionFirestore:
call: http.request
args:
url: ${"https://firestore.googleapis.com/v1/projects/" + projectId + "/databases/(default)/documents/pictures/" + file}
auth:
type: OAuth2
method: DELETE
result: firestoreDeletionResult
প্রতিটি ধাপ থেকে ফলাফল/কোড ফেরত দিয়ে মুছে ফেলা শাখা শেষ হয়:
- deleteCompleted:
return:
gcsDeletion: ${gcsDeletionResult}
firestoreDeletion: ${firestoreDeletionResult.code}
নিম্নলিখিত ধাপে, আমরা ওয়ার্কফ্লোগুলির সমস্ত বাহ্যিক নির্ভরতা তৈরি করব: বালতি, ক্লাউড ফাংশন, ক্লাউড রান পরিষেবা এবং ফায়ারস্টোর ডাটাবেস৷
7. বালতি তৈরি করুন
ছবিগুলির জন্য আপনার 2টি বালতি প্রয়োজন: 1টি আসল উচ্চ-রেজোলিউশনের ছবিগুলি সংরক্ষণ করতে এবং 1টি ছবির থাম্বনেলগুলি সংরক্ষণ করতে৷
gsutil টুল ব্যবহার করে ব্যবহারকারীদের ছবি আপলোড করার জন্য অভিন্ন অ্যাক্সেস সহ একটি পাবলিক আঞ্চলিক (এই ক্ষেত্রে ইউরোপে) বালতি তৈরি করুন:
export BUCKET_PICTURES=uploaded-pictures-${GOOGLE_CLOUD_PROJECT}
gsutil mb -l EU gs://${BUCKET_PICTURES}
gsutil uniformbucketlevelaccess set on gs://${BUCKET_PICTURES}
gsutil iam ch allUsers:objectViewer gs://${BUCKET_PICTURES}
থাম্বনেইলের জন্য অন্য পাবলিক আঞ্চলিক বালতি তৈরি করুন:
export 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}
আপনি ক্লাউড কনসোলের ক্লাউড স্টোরেজ বিভাগে গিয়ে বালতি তৈরি এবং সর্বজনীন কিনা তা দুবার চেক করতে পারেন:

8. ভিশন ডেটা ট্রান্সফর্ম (ক্লাউড ফাংশন)
Workflows.yaml শুরু হয় init , eventTypeSwitch , eventTypeNotSupported ধাপ দিয়ে। এগুলি নিশ্চিত করে যে বালতি থেকে আগত ইভেন্টগুলি সঠিক পদক্ষেপে রুট করা হয়েছে৷
object.finalize ইভেন্টের জন্য, imageAnalysisCall ধাপটি তৈরি করা ছবির মেটাডেটা বের করতে Vision API-কে একটি কল করে। এই সমস্ত পদক্ষেপ কর্মপ্রবাহের মধ্যে সম্পন্ন করা হয়:

এর পরে, আমরা Firestore-এ সংরক্ষণ করতে পারার আগে, Vision API থেকে ফিরে আসা ডেটাকে রূপান্তর করতে হবে। আরও নির্দিষ্টভাবে, আমাদের প্রয়োজন:
- ছবির জন্য ফিরে আসা লেবেল তালিকা করুন.
- ছবির প্রভাবশালী রঙ পুনরুদ্ধার করুন.
- ছবি নিরাপদ কিনা তা নির্ধারণ করুন।
এটি একটি ক্লাউড ফাংশনের কোডে করা হয় এবং ওয়ার্কফ্লোগুলি কেবল এই ফাংশনটিকে কল করে:

কোড অন্বেষণ
ক্লাউড ফাংশনকে vision-data-transform বলা হয়। আপনি index.js- এ এর সম্পূর্ণ কোড চেক করতে পারেন। আপনি দেখতে পাচ্ছেন, এই ফাংশনের একমাত্র উদ্দেশ্য হল JSON থেকে JSON রূপান্তর করা, যাতে Firestore-এ ছবির মেটাডেটা সুবিধাজনকভাবে সংরক্ষণ করা যায়।
ক্লাউড ফাংশনে স্থাপন করুন
ফোল্ডারে নেভিগেট করুন:
cd workflows/functions/vision-data-transform/nodejs
আপনার পছন্দের অঞ্চল সেট করুন:
export REGION=europe-west1
gcloud config set functions/region ${REGION}
এর সাথে ফাংশনটি স্থাপন করুন:
export SERVICE_NAME=vision-data-transform
gcloud functions deploy ${SERVICE_NAME} \
--source=. \
--runtime nodejs10 \
--entry-point=vision_data_transform \
--trigger-http \
--allow-unauthenticated
একবার ফাংশনটি স্থাপন করা হলে, Workflows transformImageAnalysisData ধাপটি Vision API ডেটা ট্রান্সফরমেশন করতে এই ফাংশনটিকে কল করতে সক্ষম হবে।
9. ডাটাবেস প্রস্তুত করুন
ওয়ার্কফ্লোতে পরবর্তীটি হল ইমেজ ডেটা থেকে ছবির নিরাপত্তা পরীক্ষা করা এবং তারপরে ক্লাউড ফায়ারস্টোর ডাটাবেসে ভিশন এপিআই দ্বারা প্রত্যাবর্তিত ছবি সম্পর্কিত তথ্য সংরক্ষণ করা, একটি দ্রুত, সম্পূর্ণরূপে পরিচালিত, সার্ভারহীন, ক্লাউড-নেটিভ NoSQL ডকুমেন্ট ডাটাবেস:

এই দুটিই ওয়ার্কফ্লোতে করা হয় কিন্তু কাজ করার জন্য আপনাকে মেটাডেটা স্টোরেজের জন্য Firestore ডাটাবেস তৈরি করতে হবে।
প্রথমে, আপনি যে অঞ্চলে ফায়ারস্টোর ডাটাবেস চান সেখানে একটি অ্যাপ ইঞ্জিন অ্যাপ তৈরি করুন (ফায়ারস্টোরের জন্য একটি প্রয়োজনীয়তা):
export REGION_FIRESTORE=europe-west2
gcloud app create --region=${REGION_FIRESTORE}
এরপরে, একই অঞ্চলে ফায়ারস্টোর ডাটাবেস তৈরি করুন:
gcloud firestore databases create --region=${REGION_FIRESTORE}
নথিগুলি আমাদের সংগ্রহে প্রোগ্রাম্যাটিকভাবে তৈরি করা হবে এবং এতে 4টি ক্ষেত্র থাকবে:
- নাম (স্ট্রিং): আপলোড করা ছবির ফাইলের নাম, যা নথির কীও
- লেবেল (স্ট্রিংগুলির অ্যারে): ভিশন API দ্বারা স্বীকৃত আইটেমগুলির লেবেল৷
- রঙ (স্ট্রিং): প্রভাবশালী রঙের হেক্সাডেসিমেল রঙের কোড (যেমন #ab12ef)
- তৈরি করা হয়েছে (তারিখ): এই ছবির মেটাডেটা কখন সংরক্ষণ করা হয়েছিল তার টাইমস্ট্যাম্প
- থাম্বনেইল (বুলিয়ান): একটি ঐচ্ছিক ক্ষেত্র যা উপস্থিত থাকবে এবং এই ছবির জন্য একটি থাম্বনেইল চিত্র তৈরি করা হলে তা সত্য হবে
থাম্বনেইল উপলব্ধ ছবিগুলি খুঁজে পেতে এবং তৈরির তারিখ বরাবর সাজানোর জন্য আমরা Firestore-এ অনুসন্ধান করব, আমাদের একটি অনুসন্ধান সূচক তৈরি করতে হবে। আপনি নিম্নলিখিত কমান্ড দিয়ে সূচক তৈরি করতে পারেন:
gcloud firestore indexes composite create --collection-group=pictures \ --field-config field-path=thumbnail,order=descending \ --field-config field-path=created,order=descending
নোট করুন যে সূচক তৈরি হতে 10 মিনিট বা তার বেশি সময় লাগতে পারে।
একবার সূচী তৈরি হয়ে গেলে, আপনি এটি ক্লাউড কনসোলে দেখতে পারেন:

ওয়ার্কফ্লো storeMetadata স্টেপ এখন ফায়ারস্টোরে ইমেজ মেটাডেটা সংরক্ষণ করতে সক্ষম হবে।
10. থাম্বনেইল পরিষেবা (ক্লাউড রান)
শৃঙ্খলে পরবর্তী একটি চিত্রের থাম্বনেইল তৈরি করা হয়। এটি একটি ক্লাউড রান পরিষেবার কোডে করা হয় এবং ওয়ার্কফ্লো এই পরিষেবাটিকে thumbnailCall ধাপে কল করে:

কোড অন্বেষণ
ক্লাউড রান পরিষেবাটিকে thumbnails বলা হয়। আপনি index.js- এ এর সম্পূর্ণ কোড চেক করতে পারেন।
কন্টেইনার ইমেজ তৈরি ও প্রকাশ করুন
ক্লাউড রান কন্টেইনার চালায় তবে আপনাকে প্রথমে কন্টেইনার ইমেজ তৈরি করতে হবে ( Dockerfile সংজ্ঞায়িত)। Google ক্লাউড বিল্ড কনটেইনার ইমেজ তৈরি করতে এবং তারপর Google কন্টেইনার রেজিস্ট্রিতে হোস্ট করতে ব্যবহার করা যেতে পারে।
ফোল্ডারে নেভিগেট করুন:
cd workflows/services/thumbnails/nodejs
নির্মাণ:
export SERVICE_SRC=thumbnails
export SERVICE_NAME=${SERVICE_SRC}-service
gcloud builds submit \
. \
--tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}
এক বা দুই মিনিট পরে, বিল্ডটি সফল হওয়া উচিত এবং কন্টেইনারটি Google কন্টেইনার রেজিস্ট্রিতে স্থাপন করা হবে৷
ক্লাউড রানে স্থাপন করুন
কিছু প্রয়োজনীয় ভেরিয়েবল এবং কনফিগারেশন সেট করুন:
export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT}
export REGION=europe-west1
gcloud config set run/region ${REGION}
gcloud config set run/platform managed
নিম্নলিখিত কমান্ড দিয়ে স্থাপন করুন:
gcloud run deploy ${SERVICE_NAME} \
--image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \
--no-allow-unauthenticated \
--memory=1Gi \
--update-env-vars BUCKET_THUMBNAILS=${BUCKET_THUMBNAILS}
একবার পরিষেবাটি স্থাপন করা হলে, ওয়ার্কফ্লোস thumbnailCall ধাপ এই পরিষেবাটিকে কল করতে সক্ষম হবে।
11. কোলাজ পরিষেবা (ক্লাউড রান)
চেইনের পরেরটি হল সাম্প্রতিকতম ছবিগুলি থেকে একটি কোলাজ তৈরি করা৷ এটি একটি ক্লাউড রান পরিষেবার কোডে করা হয় এবং Workflows এই পরিষেবাটিকে collageCall ধাপে কল করে:

কোড অন্বেষণ
ক্লাউড রান পরিষেবাকে collage বলা হয়। আপনি index.js- এ এর সম্পূর্ণ কোড চেক করতে পারেন।
কন্টেইনার ইমেজ তৈরি ও প্রকাশ করুন
ক্লাউড রান কন্টেইনার চালায় তবে আপনাকে প্রথমে কন্টেইনার ইমেজ তৈরি করতে হবে ( Dockerfile সংজ্ঞায়িত)। Google ক্লাউড বিল্ড কনটেইনার ইমেজ তৈরি করতে এবং তারপর Google কন্টেইনার রেজিস্ট্রিতে হোস্ট করতে ব্যবহার করা যেতে পারে।
ফোল্ডারে নেভিগেট করুন:
cd services/collage/nodejs
নির্মাণ:
export SERVICE_SRC=collage
export SERVICE_NAME=${SERVICE_SRC}-service
gcloud builds submit \
. \
--tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}
এক বা দুই মিনিট পরে, বিল্ডটি সফল হওয়া উচিত এবং কন্টেইনারটি Google কন্টেইনার রেজিস্ট্রিতে স্থাপন করা হবে৷
ক্লাউড রানে স্থাপন করুন
কিছু প্রয়োজনীয় ভেরিয়েবল এবং কনফিগারেশন সেট করুন:
export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT}
export REGION=europe-west1
gcloud config set run/region ${REGION}
gcloud config set run/platform managed
স্থাপন:
gcloud run deploy ${SERVICE_NAME} \
--image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \
--no-allow-unauthenticated \
--memory=1Gi \
--update-env-vars BUCKET_THUMBNAILS=${BUCKET_THUMBNAILS}
একবার পরিষেবাটি স্থাপন করা হলে, আপনি উভয় পরিষেবাই ক্লাউড কনসোলের ক্লাউড রান বিভাগের অধীনে চলছে তা পরীক্ষা করতে পারেন এবং ওয়ার্কফ্লোস collageCall ধাপ এই পরিষেবাটিকে কল করতে সক্ষম হবে:

12. কর্মপ্রবাহ স্থাপন
আমরা কর্মপ্রবাহের সমস্ত বাহ্যিক নির্ভরতা স্থাপন করেছি। বাকি সব ধাপ ( finalizeCompleted , pictureGarbageCollectionGCS , pictureGarbageCollectionFirestore , deleteCompleted ) ওয়ার্কফ্লোস নিজেই সম্পন্ন করতে পারে।
এটা ওয়ার্কফ্লো স্থাপন করার সময়!
যে ফোল্ডারটিতে workflows.yaml ফাইল রয়েছে সেখানে নেভিগেট করুন এবং এটির সাথে স্থাপন করুন:
export WORKFLOW_REGION=europe-west4
export WORKFLOW_NAME=picadaily-workflows
gcloud workflows deploy ${WORKFLOW_NAME} \
--source=workflows.yaml \
--location=${WORKFLOW_REGION}
কয়েক সেকেন্ডের মধ্যে, ওয়ার্কফ্লো স্থাপন করা উচিত এবং আপনি এটি ক্লাউড কনসোলের ওয়ার্কফ্লো বিভাগে দেখতে পারেন:

আপনি যদি চান ওয়ার্কফ্লোতে ক্লিক করুন এবং এটি সম্পাদনা করতে পারেন। সম্পাদনার সময়, আপনি ওয়ার্কফ্লোটির একটি সুন্দর ভিজ্যুয়াল উপস্থাপনা পাবেন:

আপনি সঠিক পরামিতি সহ ক্লাউড কনসোল থেকে ম্যানুয়ালি ওয়ার্কফ্লো চালাতে পারেন। পরিবর্তে, আমরা পরবর্তী ধাপে ক্লাউড স্টোরেজ ইভেন্টগুলির প্রতিক্রিয়া হিসাবে এটি স্বয়ংক্রিয়ভাবে কার্যকর করব।
13. ওয়ার্কফ্লো ট্রিগার (ক্লাউড ফাংশন)
কর্মপ্রবাহ স্থাপন এবং প্রস্তুত করা হয়. এখন, ক্লাউড স্টোরেজ বালতিতে একটি ফাইল তৈরি বা মুছে ফেলা হলে আমাদের ওয়ার্কফ্লো ট্রিগার করতে হবে। এগুলো যথাক্রমে storage.object.finalize এবং storage.object.delete ইভেন্ট।
ওয়ার্কফ্লোতে আপনি ব্যবহার করতে পারেন এমন ওয়ার্কফ্লো তৈরি, পরিচালনা এবং কার্যকর করার জন্য API এবং ক্লায়েন্ট লাইব্রেরি রয়েছে। এই ক্ষেত্রে, আপনি Workflows Execution API এবং আরও নির্দিষ্টভাবে এর Node.js ক্লায়েন্ট লাইব্রেরি ব্যবহার করবেন ওয়ার্কফ্লোকে ট্রিগার করতে।
আপনি ক্লাউড স্টোরেজ ইভেন্টগুলি শুনে ক্লাউড ফাংশন থেকে ওয়ার্কফ্লো ট্রিগার করবেন। যেহেতু একটি ক্লাউড ফাংশন শুধুমাত্র একটি ইভেন্টের প্রকারের জন্য শুনতে পারে, তাই আপনি দুটি ক্লাউড ফাংশন স্থাপন করবেন ইভেন্ট তৈরি এবং মুছে ফেলার জন্য শোনার জন্য:

কোড অন্বেষণ
ক্লাউড ফাংশনকে trigger-workflow বলা হয়। আপনি index.js- এ এর সম্পূর্ণ কোড চেক করতে পারেন।
ক্লাউড ফাংশনে স্থাপন করুন
ফোল্ডারে নেভিগেট করুন:
cd workflows/functions/trigger-workflow/nodejs
কিছু প্রয়োজনীয় ভেরিয়েবল এবং কনফিগারেশন সেট করুন:
export BUCKET_PICTURES=uploaded-pictures-${GOOGLE_CLOUD_PROJECT}
export REGION=europe-west1
export WORKFLOW_NAME=picadaily-workflows
export WORKFLOW_REGION=europe-west4
export COLLAGE_URL=$(gcloud run services describe collage-service --format 'value(status.url)')
export THUMBNAILS_URL=$(gcloud run services describe thumbnails-service --format 'value(status.url)')
export VISION_DATA_TRANSFORM_URL=$(gcloud functions describe vision-data-transform --format 'value(httpsTrigger.url)')
gcloud config set functions/region ${REGION}
ইভেন্টগুলি চূড়ান্ত করার জন্য সাড়া ফাংশন স্থাপন করুন:
export SERVICE_NAME=trigger-workflow-on-finalize
gcloud functions deploy ${SERVICE_NAME} \
--source=. \
--runtime nodejs10 \
--entry-point=trigger_workflow \
--trigger-resource=${BUCKET_PICTURES} \
--trigger-event=google.storage.object.finalize \
--allow-unauthenticated \
--set-env-vars GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT},WORKFLOW_REGION=${WORKFLOW_REGION},WORKFLOW_NAME=${WORKFLOW_NAME},THUMBNAILS_URL=${THUMBNAILS_URL},COLLAGE_URL=${COLLAGE_URL},VISION_DATA_TRANSFORM_URL=${VISION_DATA_TRANSFORM_URL}
ইভেন্টগুলি মুছে ফেলার প্রতিক্রিয়া জানিয়ে দ্বিতীয় ফাংশন স্থাপন করুন:
export SERVICE_NAME=trigger-workflow-on-delete
gcloud functions deploy ${SERVICE_NAME} \
--source=. \
--runtime nodejs10 \
--entry-point=trigger_workflow \
--trigger-resource=${BUCKET_PICTURES} \
--trigger-event=google.storage.object.delete \
--allow-unauthenticated \
--set-env-vars GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT},WORKFLOW_REGION=${WORKFLOW_REGION},WORKFLOW_NAME=${WORKFLOW_NAME},THUMBNAILS_URL=${THUMBNAILS_URL},COLLAGE_URL=${COLLAGE_URL},VISION_DATA_TRANSFORM_URL=${VISION_DATA_TRANSFORM_URL}
যখন স্থাপনা সম্পূর্ণ হয়, আপনি ক্লাউড কনসোলে উভয় ফাংশন দেখতে পাবেন:

14. ফ্রন্টেন্ড (অ্যাপ ইঞ্জিন)
এই ধাপে, আপনি পিক-এ-ডেইলি থেকে Google অ্যাপ ইঞ্জিনে একটি ওয়েব ফ্রন্টএন্ড তৈরি করুন: ল্যাব 4—একটি ওয়েব ফ্রন্টএন্ড তৈরি করুন যা ব্যবহারকারীদের ওয়েব অ্যাপ্লিকেশন থেকে ছবি আপলোড করতে দেয়, সেইসাথে আপলোড করা ছবি এবং তাদের থাম্বনেইলগুলি ব্রাউজ করতে দেয়৷

আপনি অ্যাপ ইঞ্জিন সম্পর্কে আরও জানতে পারেন এবং Pic-a-Daily-এ কোডের বিবরণ পড়তে পারেন: ল্যাব 4—একটি ওয়েব ফ্রন্টএন্ড তৈরি করুন ।
কোড অন্বেষণ
অ্যাপ ইঞ্জিন অ্যাপটিকে frontend বলা হয়। আপনি index.js- এ এর সম্পূর্ণ কোড চেক করতে পারেন।
অ্যাপ ইঞ্জিনে স্থাপন করুন
ফোল্ডারে নেভিগেট করুন:
cd frontend
আপনার পছন্দের অঞ্চলটি সেট করুন এবং আপনার প্রকৃত প্রকল্প আইডি দিয়ে app.yaml-এ GOOGLE_CLOUD_PROJECT প্রতিস্থাপন করুন:
export REGION=europe-west1
gcloud config set compute/region ${REGION}
sed -i -e "s/GOOGLE_CLOUD_PROJECT/${GOOGLE_CLOUD_PROJECT}/" app.yaml
স্থাপন:
gcloud app deploy app.yaml -q
এক বা দুই মিনিট পরে, আপনাকে বলা হবে যে অ্যাপ্লিকেশনটি ট্র্যাফিক পরিবেশন করছে:
Beginning deployment of service [default]... ╔════════════════════════════════════════════════════════════╗ ╠═ Uploading 8 files to Google Cloud Storage ═╣ ╚════════════════════════════════════════════════════════════╝ File upload done. Updating service [default]...done. Setting traffic split for service [default]...done. Deployed service [default] to [https://GOOGLE_CLOUD_PROJECT.appspot.com] You can stream logs from the command line by running: $ gcloud app logs tail -s default To view your application in the web browser run: $ gcloud app browse
আপনি ক্লাউড কনসোলের অ্যাপ ইঞ্জিন বিভাগে গিয়ে দেখতে পারেন যে অ্যাপটি স্থাপন করা হয়েছে এবং অ্যাপ ইঞ্জিনের বৈশিষ্ট্যগুলি যেমন সংস্করণ এবং ট্রাফিক বিভাজন অন্বেষণ করুন:

15. ওয়ার্কফ্লো পরীক্ষা করুন
পরীক্ষা করতে, অ্যাপটির ডিফল্ট অ্যাপ ইঞ্জিন URL-এ যান ( https://<YOUR_PROJECT_ID>.appspot.com/ ) অ্যাপ এবং আপনি ফ্রন্টএন্ড UI আপ এবং চলমান দেখতে পাবেন!

একটি ছবি আপলোড করুন. এটি ওয়ার্কফ্লোগুলিকে ট্রিগার করবে এবং আপনি ক্লাউড কনসোলে Active অবস্থায় ওয়ার্কফ্লো এক্সিকিউশন দেখতে পাবেন:

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

আরো 3টি ছবি আপলোড করুন। আপনি ক্লাউড স্টোরেজ বালতি এবং অ্যাপ ইঞ্জিন ফ্রন্টএন্ড আপডেট করা চিত্রগুলির থাম্বনেইল এবং কোলাজ দেখতে পাবেন:

16. পরিষ্কার করুন (ঐচ্ছিক)
আপনি যদি অ্যাপটি রাখতে না চান, তাহলে আপনি খরচ বাঁচাতে এবং পুরো প্রকল্পটি মুছে দিয়ে সামগ্রিকভাবে ভালো ক্লাউড নাগরিক হতে সম্পদ পরিষ্কার করতে পারেন:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}
17. অভিনন্দন!
আপনি অর্কেস্ট্রেট এবং কল পরিষেবাদির জন্য ওয়ার্কফ্লো ব্যবহার করে অ্যাপের একটি অর্কেস্ট্রেটেড সংস্করণ তৈরি করেছেন৷
আমরা কভার করেছি কি
- অ্যাপ ইঞ্জিন
- ক্লাউড ফায়ারস্টোর
- ক্লাউড ফাংশন
- ক্লাউড রান
- কর্মপ্রবাহ