1. परिचय

Eventarc की मदद से, Cloud Run सेवाओं को अलग-अलग सोर्स से मिलने वाले इवेंट से आसानी से कनेक्ट किया जा सकता है. इसकी मदद से, इवेंट पर आधारित आर्किटेक्चर बनाए जा सकते हैं. इनमें माइक्रोसेवाएं, एक-दूसरे से कम जुड़ी होती हैं और डिस्ट्रिब्यूट की जाती हैं. यह इवेंट को इकट्ठा करने, उन्हें डिलीवर करने, उनकी सुरक्षा करने, उन्हें अनुमति देने, और गड़बड़ियों को ठीक करने का काम करता है.
Workflows, पूरी तरह से मैनेज किया जाने वाला ऑर्केस्ट्रेशन प्लैटफ़ॉर्म है. यह आपकी तय की गई क्रम में सेवाओं को लागू करता है: एक वर्कफ़्लो. इन वर्कफ़्लो में, Cloud Run या Cloud Functions पर होस्ट की गई सेवाओं, Google Cloud की सेवाओं (जैसे, Cloud Vision AI और BigQuery) के साथ-साथ, एचटीटीपी पर आधारित किसी भी एपीआई को शामिल किया जा सकता है.
इस कोडलैब में, इमेज प्रोसेस करने के लिए इवेंट-ड्रिवन ऑर्केस्ट्रेशन ऑफ़ माइक्रोसेवाएं बनाई जाएंगी. आपको इमेज प्रोसेसिंग के लिए, चार Cloud Functions के ऑर्डर, इनपुट, और आउटपुट को व्यवस्थित करने के लिए Workflows का इस्तेमाल करना होगा. इसके बाद, आपको ऑर्केस्ट्रेशन की सुविधा चालू करनी होगी, ताकि 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 में बिलिंग चालू करनी होगी, ताकि Cloud संसाधनों/एपीआई का इस्तेमाल किया जा सके. इस कोडलैब को पूरा करने में ज़्यादा समय नहीं लगेगा. इस ट्यूटोरियल के बाद बिलिंग से बचने के लिए, संसाधनों को बंद किया जा सकता है. इसके लिए, बनाए गए संसाधनों को मिटाएं या प्रोजेक्ट को मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त में आज़माने के प्रोग्राम के लिए ज़रूरी शर्तें पूरी करते हैं.
Cloud Shell शुरू करना
Google Cloud को अपने लैपटॉप से रिमोटली ऐक्सेस किया जा सकता है. हालांकि, इस कोडलैब में Google Cloud Shell का इस्तेमाल किया जाएगा. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.
Google Cloud Console में, सबसे ऊपर दाएं कोने में मौजूद टूलबार पर, Cloud Shell आइकॉन पर क्लिक करें:

इसे चालू करने और एनवायरमेंट से कनेक्ट करने में सिर्फ़ कुछ सेकंड लगेंगे. यह प्रोसेस पूरी होने के बाद, आपको कुछ ऐसा दिखेगा:

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल पहले से मौजूद हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है. साथ ही, यह 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 में फ़ाइल बनाने का इवेंट, Cloud Storage ट्रिगर के ज़रिए Eventarc पढ़ता है. इसके बाद, इसे CloudEvent के तौर पर Workflows को पास कर देता है.
- वर्कफ़्लो के पहले चरण, फ़िल्टर में, Cloud Functions सेवा, Vision API का इस्तेमाल करके यह पता लगाती है कि इमेज सुरक्षित है या नहीं. अगर इमेज सुरक्षित है, तो Workflows अगले चरणों पर आगे बढ़ता है.
- वर्कफ़्लो के दूसरे चरण में, लेबलर, Cloud Functions सेवा, Vision API की मदद से इमेज के लेबल निकालती है और उन लेबल को आउटपुट बकेट में सेव करती है.
- तीसरे चरण में, Resizer, Cloud Functions की एक और सेवा है. यह ImageSharp का इस्तेमाल करके इमेज का साइज़ बदलती है और बदली गई इमेज को आउटपुट बकेट में सेव करती है.
- आखिरी चरण में, Watermarker, Cloud Functions की एक अन्य सेवा है. यह ImageSharp का इस्तेमाल करके, बदली गई साइज़ की इमेज में Labeler से मिले लेबल का वॉटरमार्क जोड़ती है. इसके बाद, इमेज को आउटपुट बकेट में सेव करती है.
यह ऐप्लिकेशन, Cloud Storage इवेंट से ट्रिगर होता है. इसलिए, यह इवेंट-ड्रिवन है. इमेज को प्रोसेस करने का काम एक वर्कफ़्लो में होता है. इसलिए, इसे ऑर्केस्ट्रेशन कहा जाता है. आखिर में, यह इमेज को प्रोसेस करने के लिए, इवेंट-ड्रिवन ऑर्केस्ट्रेशन है. यह सर्वरलेस आर्किटेक्चर को फ़्लेक्सिबल और स्ट्रक्चर्ड बनाता है.
4. बकेट बनाना
उपयोगकर्ताओं के लिए एक इनपुट बकेट बनाएं, ताकि वे उसमें इमेज अपलोड कर सकें. साथ ही, इमेज प्रोसेसिंग पाइपलाइन के लिए एक आउटपुट बकेट बनाएं, ताकि प्रोसेस की गई इमेज को सेव किया जा सके.
Cloud Shell में यह कमांड चलाएं:
REGION=us-central1 BUCKET1=$PROJECT_ID-images-input-$RANDOM BUCKET2=$PROJECT_ID-images-output-$RANDOM 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
तय करें
Workflows को 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 चरण में, Workflows उस फ़िल्टर सेवा को कॉल करता है जिसे हमने पहले डिप्लॉय किया था. इसके बाद, यह फ़ाइल की सुरक्षा की स्थिति को लॉग करता है और उसकी जाँच करता है:
- 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 चरण में, Workflows, लेबल लगाने वाली सेवा को कॉल करता है और जवाब कैप्चर करता है (पहले तीन लेबल):
- 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 चरण में, Workflows, वॉटरमार्कर सेवा को बदली गई इमेज और लेबल के साथ कॉल करता है. साथ ही, नतीजे (बदली गई और वॉटरमार्क वाली इमेज) को कैप्चर करता है:
- 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 चरण में, Workflows, लेबलर, रिसाइज़र, और वॉटरमार्कर सेवाओं से एचटीटीपी स्टेटस कोड दिखाता है:
- 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 से Workflows को चालू करने के लिए किया जा सके:
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-$RANDOM/beach-400x400-watermark.jpeg gs://$PROJECT_ID-images-output-$RANDOM/beach-400x400.png gs://$PROJECT_ID-images-output-$RANDOM/beach-labels.txt
दोबारा जांच करने के लिए, वॉटरमार्क वाली और साइज़ बदली गई इमेज खोलें. इससे आपको नतीजे दिखेंगे:

12. बधाई हो
बधाई हो, आपने कोडलैब पूरा कर लिया है!
हमने क्या-क्या शामिल किया है
- Eventarc और Workflows की खास जानकारी
- Cloud Functions की सेवाओं को कैसे डिप्लॉय करें
- Workflows का इस्तेमाल करके सेवाओं को व्यवस्थित करने का तरीका
- Eventarc की मदद से, Cloud Storage इवेंट के जवाब में Workflows को ट्रिगर करने का तरीका