1. परिचय
Eventarc की मदद से, Cloud Run की सेवाओं को कई तरह के सोर्स के इवेंट से आसानी से कनेक्ट किया जा सकता है. इसकी मदद से, इवेंट के आधार पर काम करने वाले ऐसे आर्किटेक्चर बनाए जा सकते हैं जिनमें माइक्रोसेवाओं को शिफ़्ट किया जाता है और डिस्ट्रिब्यूट किया जाता है. यह आपके लिए इवेंट का डेटा डालने, डिलीवरी, सुरक्षा, अनुमति देने, और गड़बड़ियों को ठीक करने का काम करता है.
Workflows पूरी तरह से मैनेज किया गया ऑर्केस्ट्राशन प्लैटफ़ॉर्म है, जो सेवाओं को उस क्रम में चलाता है जिसे आपने तय किया है: वर्कफ़्लो. इन वर्कफ़्लो में Cloud Run या Cloud Functions पर होस्ट की गई सेवाएं, Cloud Vision AI और BigQuery जैसी Google Cloud सेवाएं, और किसी भी एचटीटीपी-आधारित एपीआई का इस्तेमाल किया जा सकता है.
इस कोडलैब में, इमेज प्रोसेस करने के लिए माइक्रोसेवाओं का इवेंट-ड्रिवन ऑर्केस्ट्रेशन तैयार किया जाएगा. Workflows की मदद से चार तरह की इमेज प्रोसेसिंग वाले Cloud Functions के ऑर्डर, इनपुट, और आउटपुट को व्यवस्थित किया जा सकता है. इसके बाद, Eventarc की मदद से Cloud Storage के इवेंट का जवाब देने के लिए, ऑर्केस्ट्रा की सुविधा चालू की जा सकती है.
आखिर में, आपको इमेज प्रोसेस करने के लिए, बिना सर्वर वाला ऐसा आर्किटेक्चर मिलेगा जिसमें ज़रूरत के हिसाब से बदलाव किए जा सकते हैं.
आप इन चीज़ों के बारे में जानेंगे
- Eventarc और Workflows के बारे में खास जानकारी
- Cloud Functions सेवाएं कैसे डिप्लॉय करें
- Workflows का इस्तेमाल करके सेवाओं को व्यवस्थित करने का तरीका
- Eventarc में Cloud Storage के इवेंट के लिए, Workflows को जवाब देने का तरीका
2. सेटअप और ज़रूरी शर्तें
अपने हिसाब से एनवायरमेंट सेटअप करें
- Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से Gmail या Google Workspace खाता नहीं है, तो आपको नया खाता बनाना होगा.
- प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों का डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करता. इसे कभी भी अपडेट किया जा सकता है.
- प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे बदला नहीं जा सकता. इसे सेट करने के बाद बदला नहीं जा सकता. Cloud Console, एक यूनीक स्ट्रिंग अपने-आप जनरेट करता है; आम तौर पर, आपको उसके होने की कोई परवाह नहीं होती. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना होगा. आम तौर पर, इसे
PROJECT_ID
के तौर पर पहचाना जाता है. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो किसी भी क्रम में एक और आईडी जनरेट किया जा सकता है. इसके अलावा, खुद भी आज़माया जा सकता है और देखें कि वह उपलब्ध है या नहीं. इस चरण के बाद इसे बदला नहीं जा सकता और प्रोजेक्ट के कुल समय तक बना रहेगा. - आपकी जानकारी के लिए, एक तीसरी वैल्यू यानी प्रोजेक्ट नंबर है. इसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
- इसके बाद, आपको क्लाउड संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. इस ट्यूटोरियल के अलावा, संसाधनों को बंद करने के लिए कि आपको बिलिंग न करनी पड़े. इसके लिए, अपने बनाए गए संसाधनों को मिटाएं या पूरा प्रोजेक्ट मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले प्रोग्राम में हिस्सा ले सकते हैं.
क्लाउड शेल शुरू करें
Google Cloud को आपके लैपटॉप से, कहीं से भी ऑपरेट किया जा सकता है. हालांकि, इस कोडलैब में Google Cloud Shell का इस्तेमाल किया जा रहा है. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.
Google Cloud Console में जाकर, सबसे ऊपर दाईं ओर मौजूद टूलबार पर क्लाउड शेल आइकॉन पर क्लिक करें:
प्रावधान करने और एनवायरमेंट से कनेक्ट होने में कुछ ही समय लगेगा. उसके पूरा हो जाने पर, आपको कुछ ऐसा दिखाई देगा:
इस वर्चुअल मशीन में ऐसे सभी डेवलपमेंट टूल मौजूद हैं जिनकी आपको ज़रूरत पड़ेगी. यह पांच जीबी की स्थायी होम डायरेक्ट्री उपलब्ध कराता है और Google Cloud पर चलता है. यह नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रक्रिया को बेहतर बनाता है. इस कोडलैब (कोड बनाना सीखना) में आपका सारा काम ब्राउज़र में किया जा सकता है. आपको कुछ भी इंस्टॉल करने की ज़रूरत नहीं है.
gcloud सेट अप करें
Cloud Shell में, अपना प्रोजेक्ट आईडी और वह इलाका सेट करें जहां आपको अपना ऐप्लिकेशन डिप्लॉय करना है. उन्हें PROJECT_ID
और REGION
वैरिएबल के तौर पर सेव करें. जिन इलाकों में यह सुविधा उपलब्ध है उनके बारे में जानने के लिए, Cloud Functions की जगह की जानकारी देखें.
PROJECT_ID=your-project-id gcloud config set project $PROJECT_ID
सोर्स कोड पाना
ऐप्लिकेशन का सोर्स कोड, eventarc-samples रेपो के processing-pipelines
फ़ोल्डर में है.
डेटा स्टोर करने की जगह का क्लोन बनाएं:
git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git
eventarc-samples/processing-pipelines
फ़ोल्डर पर जाएं:
cd eventarc-samples/processing-pipelines
3. आर्किटेक्चर की खास जानकारी
ऐप्लिकेशन का आर्किटेक्चर इस तरह है:
- इमेज को इनपुट बकेट में सेव किया जाता है, जो Cloud Storage में 'बनाएं' इवेंट जनरेट करता है.
- Cloud Storage बनाने वाले इवेंट को Eventarc, Cloud Storage ट्रिगर के ज़रिए पढ़ता है और CloudEvent के रूप में Workflows को पास करता है.
- वर्कफ़्लो के पहले चरण में, Cloud Function सेवा फ़िल्टर, Vision API का इस्तेमाल करके इमेज का पता लगाती है कि इमेज सुरक्षित है या नहीं. इमेज के सुरक्षित होने पर, वर्कफ़्लो अगले चरणों में जारी रहता है.
- वर्कफ़्लो के दूसरे चरण में, Cloud Function सेवा लेबलर, Vision API की मदद से इमेज के लेबल एक्सट्रैक्ट करता है और लेबल को आउटपुट बकेट में सेव करता है.
- तीसरे चरण में, एक और Cloud Function सेवा Resizer, ImageSharp का इस्तेमाल करके इमेज का साइज़ बदलता है. साथ ही, बदली गई इमेज को आउटपुट बकेट में सेव करता है.
- आखिरी चरण में, एक अन्य Cloud Function सेवा वॉटरमार्कर, ImageSharp का इस्तेमाल करके बदली गई इमेज में लेबलर से लेबल का वॉटरमार्क जोड़ता है. साथ ही, इमेज को आउटपुट बकेट में सेव करता है.
ऐप्लिकेशन, Cloud Storage के किसी इवेंट से ट्रिगर होता है. इसलिए, यह इवेंट के आधार पर काम करता है. इमेज की प्रोसेसिंग एक वर्कफ़्लो के मुताबिक होती है. इसलिए, इसे व्यवस्थित किया जाता है. आखिर में, यह इवेंट के आधार पर होने वाला ऑर्केस्ट्रेशन है. इसमें इमेज को प्रोसेस करने के लिए, ज़रूरत के हिसाब से लेकिन बिना सर्वर वाला स्ट्रक्चर तैयार किया गया है.
4. बकेट बनाना
उपयोगकर्ताओं के लिए एक इनपुट बकेट बनाएं, जिसमें इमेज अपलोड की जा सकें. साथ ही, प्रोसेस की गई इमेज को सेव करने के लिए इमेज प्रोसेसिंग पाइपलाइन के लिए आउटपुट बकेट बनाएं.
Cloud Shell में इन्हें चलाएं:
REGION=us-central1 BUCKET1=$PROJECT_ID-images-input BUCKET2=$PROJECT_ID-images-output gsutil mb -l $REGION gs://$BUCKET1 gsutil mb -l $REGION gs://$BUCKET2
5. फ़िल्टर सेवा डिप्लॉय करें
पहली सेवा को डिप्लॉय करने से शुरुआत करते हैं. यह Cloud Functions सेवा, बकेट और फ़ाइल की जानकारी हासिल करती है. साथ ही, यह तय करती है कि इमेज, Vision API की मदद से सुरक्षित है या नहीं. इसके बाद, नतीजा मिलता है.
सबसे पहले, Cloud Functions gen2 और Vision API के लिए ज़रूरी सेवाएं चालू करें:
gcloud services enable \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ cloudfunctions.googleapis.com \ run.googleapis.com \ vision.googleapis.com
टॉप लेवल processing-pipelines
फ़ोल्डर में, सेवा को डिप्लॉय करें:
SERVICE_NAME=filter gcloud functions deploy $SERVICE_NAME \ --gen2 \ --allow-unauthenticated \ --runtime dotnet3 \ --trigger-http \ --region=$REGION \ --entry-point Filter.Function \ --set-build-env-vars GOOGLE_BUILDABLE=image-v3/filter/csharp
फ़ंक्शन लागू होने के बाद, सेवा यूआरएल को किसी वैरिएबल में सेट करें. हमें इसकी बाद में ज़रूरत पड़ेगी:
FILTER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
6. लेबलर सेवा को डिप्लॉय करें
Cloud Functions की दूसरी सेवा को बकेट और फ़ाइल की जानकारी मिलती है. वह Vision API की मदद से इमेज के लेबल एक्सट्रैक्ट करती है और लेबल को आउटपुट बकेट में सेव करती है.
टॉप लेवल processing-pipelines
फ़ोल्डर में, सेवा को डिप्लॉय करें:
SERVICE_NAME=labeler gcloud functions deploy $SERVICE_NAME \ --gen2 \ --allow-unauthenticated \ --runtime dotnet3 \ --trigger-http \ --region=$REGION \ --set-env-vars BUCKET=$BUCKET2 \ --entry-point Labeler.Function \ --set-build-env-vars GOOGLE_BUILDABLE=image-v2/labeler/csharp
फ़ंक्शन लागू होने के बाद, सेवा यूआरएल को किसी वैरिएबल में सेट करें. हमें इसकी बाद में ज़रूरत पड़ेगी:
LABELER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
7. रीसाइज़र सेवा डिप्लॉय करें
यह Cloud Functions सेवा, बकेट और फ़ाइल की जानकारी लेती है. यह ImageSharp का इस्तेमाल करके इमेज का साइज़ बदलती है और इमेज को आउटपुट बकेट में सेव करती है.
टॉप लेवल processing-pipelines
फ़ोल्डर में, सेवा को डिप्लॉय करें:
SERVICE_NAME=resizer gcloud functions deploy $SERVICE_NAME \ --gen2 \ --allow-unauthenticated \ --runtime dotnet3 \ --trigger-http \ --region=$REGION \ --set-env-vars BUCKET=$BUCKET2 \ --entry-point Resizer.Function \ --set-build-env-vars GOOGLE_BUILDABLE=image-v2/resizer/csharp \ --timeout=120s
दो मिनट की timeout
वैल्यू नोट करें, ताकि साइज़ बदलने वाले फ़ंक्शन को प्रोसेसिंग में ज़्यादा समय लग सके.
फ़ंक्शन लागू होने के बाद, सेवा यूआरएल को किसी वैरिएबल में सेट करें. हमें इसकी बाद में ज़रूरत पड़ेगी:
RESIZER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
8. वॉटरमार्क वाली सेवा डिप्लॉय करें
यह Cloud Functions सेवा, बकेट, फ़ाइल, और लेबल की जानकारी हासिल करती है, फ़ाइल को पढ़ती है, और ImageSharp का इस्तेमाल करके इमेज में लेबल को वॉटरमार्क के तौर पर जोड़ती है. साथ ही, इमेज को आउटपुट बकेट में सेव करती है.
टॉप लेवल processing-pipelines
फ़ोल्डर में, सेवा को डिप्लॉय करें:
SERVICE_NAME=watermarker gcloud functions deploy $SERVICE_NAME \ --gen2 \ --allow-unauthenticated \ --runtime dotnet3 \ --trigger-http \ --region=$REGION \ --set-env-vars BUCKET=$BUCKET2 \ --entry-point Watermarker.Function \ --set-build-env-vars GOOGLE_BUILDABLE=image-v2/watermarker/csharp
फ़ंक्शन लागू होने के बाद, सेवा यूआरएल को किसी वैरिएबल में सेट करें. हमें इसकी बाद में ज़रूरत पड़ेगी:
WATERMARKER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
इस समय, सभी चार Cloud Functions डिप्लॉय हो जाने चाहिए और काम करने चाहिए:
9. वर्कफ़्लो तय करें और डिप्लॉय करें
वर्कफ़्लो में फ़िल्टर, लेबलर, रीसाइज़र, और वॉटरमार्क वाली सेवाओं को एक साथ लाने के लिए, Workflows का इस्तेमाल करें. वर्कफ़्लो, इन सेवाओं को उसी क्रम में और हमारे तय किए गए पैरामीटर के मुताबिक कॉल करेगा.
सबसे पहले, वर्कफ़्लो के लिए ज़रूरी सेवाएं चालू करें:
gcloud services enable \ workflows.googleapis.com \ workflowexecutions.googleapis.com
तय करें
वर्कफ़्लो को पैरामीटर के तौर पर CloudEvent मिलता है. जब हम ट्रिगर बना लेंगे, तब यह Eventarc से मिलेगा. पहले दो चरणों में, Workflows इवेंट को लॉग करता है और इवेंट से बकेट और फ़ाइल की जानकारी निकालता है:
main: params: [event] steps: - log_event: call: sys.log args: text: ${event} severity: INFO - extract_bucket_and_file: assign: - bucket: ${event.data.bucket} - file: ${event.data.name}
वर्कफ़्लो, फ़िल्टर करने वाली उस सेवा को कॉल करता है जिसे हमने पहले डिप्लॉय किया था. यह कॉल filter
चरण में किया जाता है. इसके बाद यह फ़ाइल की सुरक्षा को लॉग करता है और जांच करता है:
- filter: call: http.post args: url: FILTER_URL # TODO: Replace auth: type: OIDC body: bucket: ${bucket} file: ${file} result: filterResponse - log_safety: call: sys.log args: text: ${filterResponse.body.safe} severity: INFO - check_safety: switch: - condition: ${filterResponse.body.safe == true} next: label next: end
वर्कफ़्लो, label
चरण में लेबल करने वाली सेवा को कॉल करता है और जवाब को कैप्चर करता है (मुख्य तीन लेबल):
- label: call: http.post args: url: LABELER_URL # TODO: Replace auth: type: OIDC body: bucket: ${bucket} file: ${file} result: labelResponse
resize
चरण में, Workflows साइज़ बदलने वाली सेवा को कॉल करता है और रिस्पॉन्स (साइज़ बदली गई इमेज की बकेट और फ़ाइल) कैप्चर करता है:
- resize: call: http.post args: url: RESIZER_URL # TODO: Replace auth: type: OIDC body: bucket: ${bucket} file: ${file} result: resizeResponse
watermark
चरण में, वर्कफ़्लो, वॉटरमार्क वाली सेवा को साइज़ बदलने वाली इमेज और लेबल के साथ कॉल करता है. साथ ही, नतीजे (साइज़ बदलें और वॉटरमार्क वाली इमेज) कैप्चर करता है:
- watermark: call: http.post args: url: WATERMARKER_URL # TODO: Replace auth: type: OIDC body: bucket: ${resizeResponse.body.bucket} file: ${resizeResponse.body.file} labels: ${labelResponse.body.labels} result: watermarkResponse
वर्कफ़्लो, final
चरण में लेबलर, रीसाइज़र, और वॉटरमार्क करने वाली सेवाओं से एचटीटीपी स्टेटस कोड दिखाता है:
- final: return: label: ${labelResponse.code} resize: ${resizeResponse.code} watermark: ${watermarkResponse.code}
डिप्लॉय करें
वर्कफ़्लो को डिप्लॉय करने से पहले, पक्का करें कि सेवा के यूआरएल को मैन्युअल तरीके से या sed
का इस्तेमाल करके, डिप्लॉय किए गए फ़ंक्शन के यूआरएल से बदल दिया गया हो:
टॉप लेवल processing-pipelines
फ़ोल्डर में, image-v3
फ़ोल्डर पर जाएं, जहां workflows.yaml
फ़ाइल मौजूद है:
cd image-v3/
प्लेसहोल्डर यूआरएल को डिप्लॉय की गई सेवाओं के असली यूआरएल से बदलने के लिए, sed
चलाएं:
sed -i -e "s|FILTER_URL|${FILTER_URL}|" workflow.yaml sed -i -e "s|LABELER_URL|${LABELER_URL}|" workflow.yaml sed -i -e "s|RESIZER_URL|${RESIZER_URL}|" workflow.yaml sed -i -e "s|WATERMARKER_URL|${WATERMARKER_URL}|" workflow.yaml
वर्कफ़्लो को डिप्लॉय करें:
WORKFLOW_NAME=image-processing gcloud workflows deploy $WORKFLOW_NAME \ --source=workflow.yaml \ --location=$REGION
कुछ सेकंड में, आपको कंसोल में डिप्लॉय किया गया वर्कफ़्लो दिखेगा:
10. ट्रिगर बनाएं
वर्कफ़्लो लागू हो गया है. अब आखिरी चरण, इसे Eventarc ट्रिगर की मदद से Cloud Storage इवेंट से कनेक्ट करना है.
एक बार किया जाने वाला सेटअप
सबसे पहले, Eventarc के लिए ज़रूरी सेवाएं चालू करें:
gcloud services enable \ eventarc.googleapis.com
ऐसा सेवा खाता बनाएं जिसका इस्तेमाल आपको Eventarc ट्रिगर में करना है.
SERVICE_ACCOUNT=eventarc-trigger-imageproc-sa gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name="Eventarc trigger image processing service account"
workflows.invoker
की भूमिका दें, ताकि सेवा खाते का इस्तेमाल, Eventarc से वर्कफ़्लो शुरू करने के लिए किया जा सके:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --role roles/workflows.invoker \ --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
eventarc.eventReceiver
की भूमिका दें, क्योंकि सेवा खाते का इस्तेमाल
Cloud Storage ट्रिगर:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --role roles/eventarc.eventReceiver \ --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
Cloud Storage सेवा खाते को pubsub.publisher
की भूमिका दें. Eventarc के Cloud Storage ट्रिगर के लिए यह ज़रूरी है:
STORAGE_SERVICE_ACCOUNT="$(gsutil kms serviceaccount -p $PROJECT_ID)" gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$STORAGE_SERVICE_ACCOUNT \ --role roles/pubsub.publisher
बनाएं
ट्रिगर बनाने के लिए नीचे दिया गया तरीका अपनाएं. यह इनपुट Cloud Storage बकेट से नई फ़ाइल बनाने वाले इवेंट के लिए फ़िल्टर ट्रिगर करता है और उन्हें हमारे पहले बताए गए वर्कफ़्लो पर पास करता है:
TRIGGER_NAME=trigger-image-processing gcloud eventarc triggers create $TRIGGER_NAME \ --location=$REGION \ --destination-workflow=$WORKFLOW_NAME \ --destination-workflow-location=$REGION \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=$BUCKET1" \ --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
Cloud Console के Eventarc सेक्शन में यह देखा जा सकता है कि ट्रिगर बन गया है और तैयार है:
11. पाइपलाइन की जांच करना
इमेज प्रोसेसिंग पाइपलाइन, Cloud Storage से इवेंट पाने के लिए तैयार है. पाइपलाइन की जांच करने के लिए, इनपुट बकेट में एक इमेज अपलोड करें:
gsutil cp beach.jpg gs://$BUCKET1
चित्र अपलोड करते ही, आपको वर्कफ़्लो का निष्पादन सक्रिय स्थिति में दिखाई देगा:
एक-एक मिनट के बाद आपको प्रोजेक्ट पूरा दिखेगा. वर्कफ़्लो के इनपुट और आउटपुट भी देखे जा सकते हैं:
अगर आउटपुट बकेट की सामग्री सूची में शामिल की जाती है, तो आपको बदली गई इमेज, आकार में बदली गई और वॉटरमार्क वाली इमेज और इमेज के लेबल दिखाई देंगे:
gsutil ls gs://$BUCKET2 gs://$PROJECT_ID-images-output/beach-400x400-watermark.jpeg gs://$PROJECT_ID-images-output/beach-400x400.png gs://$PROJECT_ID-images-output/beach-labels.txt
नतीजे की दोबारा जांच करने के लिए, साइज़ और वॉटरमार्क वाली इमेज का इस्तेमाल करके, नतीजा देखा जा सकता है:
12. बधाई हो
बधाई हो, आपने कोडलैब पूरा कर लिया है!
हमने इन विषयों के बारे में बताया
- Eventarc और Workflows के बारे में खास जानकारी
- Cloud Functions सेवाएं कैसे डिप्लॉय करें
- Workflows का इस्तेमाल करके सेवाओं को व्यवस्थित करने का तरीका
- Eventarc में Cloud Storage के इवेंट के लिए, Workflows को जवाब देने का तरीका