फ़ोटो-ए-रोज़: लैब 6—वर्कफ़्लो के साथ आयोजन

1. खास जानकारी

पिछली लैब में, आपने रोज़ के Pic-a-daily ऐप्लिकेशन का इवेंट-ड्रिवन वर्शन बनाया था. इसमें इमेज विश्लेषण सेवा के लिए, Google Cloud Storage ट्रिगर किए गए Cloud Function का इस्तेमाल किया गया था. GCS (जीसीएस) ने थंबनेल सेवा के लिए Pub/Sub से Cloud Run कंटेनर और Cloud Run पर इमेज गार्बेज कलेक्टर सेवा को ट्रिगर करने के लिए Eventarc को ट्रिगर किया था. क्लाउड शेड्यूलर की वजह से कोलाज सेवा भी ट्रिगर हुई:

d93345bfc235f81e.png

इस लैब में, आपको ऐप्लिकेशन का एक व्यवस्थित वर्शन बनाना होगा. सिस्टम से फ़्लो करने वाले अलग-अलग तरह के इवेंट के बजाय, सेवाओं को व्यवस्थित करने और कॉल करने के लिए, Workflows का इस तरह से इस्तेमाल किया जाएगा:

b763efcbf5589747.png

आपको इनके बारे में जानकारी मिलेगी

  • App Engine
  • Cloud Firestore
  • Cloud Functions
  • Cloud Run
  • वर्कफ़्लो

2. सेटअप और ज़रूरी शर्तें

अपने हिसाब से एनवायरमेंट सेटअप करना

  1. Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. (अगर आपके पास पहले से Gmail या Google Workspace खाता नहीं है, तो आपको एक खाता बनाना होगा.)

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

प्रोजेक्ट आईडी याद रखें. यह Google Cloud के सभी प्रोजेक्ट के लिए एक खास नाम होता है (ऊपर दिया गया नाम पहले ही ले लिया गया है और यह आपके लिए काम नहीं करेगा!). बाद में, इस कोडलैब को इस कोडलैब में PROJECT_ID के तौर पर दिखाया जाएगा.

  1. इसके बाद, आपको Google Cloud के संसाधनों का इस्तेमाल करने के लिए, Cloud Console में बिलिंग की सुविधा चालू करनी होगी.

इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. "साफ़ करना" सेक्शन में दिए गए निर्देशों का पालन करना न भूलें सेक्शन में, संसाधनों को बंद करने का तरीका बताया गया है. इससे इस ट्यूटोरियल के अलावा बिलिंग की सुविधा नहीं मिलेगी. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले प्रोग्राम में हिस्सा ले सकते हैं.

Cloud Shell शुरू करना

Google Cloud को आपके लैपटॉप से, कहीं से भी ऑपरेट किया जा सकता है. हालांकि, इस कोडलैब में Google Cloud Shell का इस्तेमाल किया जा रहा है. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.

GCP कंसोल में, सबसे ऊपर दाईं ओर मौजूद टूलबार पर क्लाउड शेल आइकॉन पर क्लिक करें:

bce75f34b2c53987.png

प्रावधान करने और एनवायरमेंट से कनेक्ट होने में कुछ ही समय लगेगा. उसके पूरा हो जाने पर, आपको कुछ ऐसा दिखाई देगा:

f6ef2b5f13479f3a.png

इस वर्चुअल मशीन में ऐसे सभी डेवलपमेंट टूल मौजूद हैं जिनकी आपको ज़रूरत पड़ेगी. यह पांच जीबी की स्थायी होम डायरेक्ट्री उपलब्ध कराता है और Google Cloud पर चलता है. यह नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रक्रिया को बेहतर बनाता है. इस लैब में आपका सारा काम बस एक ब्राउज़र से किया जा सकता है.

3. वर्कफ़्लो के बारे में जानकारी

90fcd42d556e310e.jpeg

बिना सर्वर वाले वर्कफ़्लो बनाने के लिए, वर्कफ़्लो का इस्तेमाल किया जा सकता है. ये बिना सर्वर वाले टास्क की सीरीज़ को आपके तय किए गए क्रम में एक साथ लिंक करते हैं. Google Cloud के एपीआई और Cloud Functions और Cloud Run जैसे बिना सर्वर वाले प्रॉडक्ट का इस्तेमाल किया जा सकता है. साथ ही, सर्वर के बिना इस्तेमाल किए जाने वाले सुविधाजनक ऐप्लिकेशन बनाने के लिए, बाहरी एपीआई को कॉल किया जा सकता है.

जैसा कि आपको ऑर्केस्ट्रेटर से उम्मीद की जा सकती है, Workflows की मदद से YAML/JSON आधारित वर्कफ़्लो डेफ़िनिशन लैंग्वेज में अपने कारोबार लॉजिक के फ़्लो को तय किया जा सकता है. साथ ही, इन फ़्लो को ट्रिगर करने के लिए, Workflows एक्ज़ीक्यूटिव एपीआई और Workflows का यूज़र इंटरफ़ेस (यूआई) उपलब्ध कराया जाता है.

यह सिर्फ़ ऑर्केस्ट्रेटर से कहीं बढ़कर है, जिसमें ये पहले से मौजूद और कॉन्फ़िगर की जा सकने वाली सुविधाएं हैं:

  • चरणों के भरोसेमंद निष्पादन के लिए चरणों के बीच सुविधाजनक तरीके से फिर से कोशिश करना और गड़बड़ियों को मैनेज करना.
  • ग्लू-कोड से बचने के लिए, एक चरण से दूसरे चरण में JSON पार्स और वैरिएबल पास होना.
  • फ़ैसले लेने के लिए एक्सप्रेशन फ़ॉर्मूला, कंडिशनल चरण को एक्ज़ीक्यूट करने की अनुमति देता है.
  • मॉड्यूलर और फिर से इस्तेमाल किए जा सकने वाले वर्कफ़्लो के लिए सबवर्कफ़्लो.
  • बाहरी सेवाओं की मदद से, Google Cloud के अलावा अन्य सेवाओं को मैनेज किया जा सकता है.
  • सुरक्षित तरीके से चरण लागू करने के लिए, Google Cloud और बाहरी सेवाओं के लिए पुष्टि करने में मदद करने वाली सेवा.
  • आसानी से इंटिग्रेट करने के लिए, Google Cloud की सेवाओं के कनेक्टर. जैसे, Pub/Sub, Firestore, टास्क, सीक्रेट मैनेजर.

यह साफ़ तौर पर नहीं बताया गया है कि Workflows एक पूरी तरह से मैनेज किया गया बिना सर्वर वाला प्रॉडक्ट है. कॉन्फ़िगर या स्केल करने के लिए कोई सर्वर नहीं है और आपको सिर्फ़ अपने इस्तेमाल के लिए पैसे देने होते हैं.

4. एपीआई चालू करें

इस लैब में, Cloud Functions और Cloud Run सेवाओं को Workflows के साथ कनेक्ट किया जाएगा. आप App Engine, Cloud Build, Vision API, और अन्य सेवाओं का भी इस्तेमाल करेंगे.

Cloud Shell में, पक्का करें कि सभी ज़रूरी सेवाएं चालू हों:

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 में App Engine फ़्रंटएंड मौजूद है, जिसे हम लैब 4 से फिर से इस्तेमाल करेंगे.
  • functions में, वर्कफ़्लो के लिए बनाए गए Cloud फ़ंक्शन शामिल हैं.
  • services में वर्कफ़्लो के लिए बदली गई Cloud Run सेवाएं शामिल हैं.
  • workflows.yaml वर्कफ़्लो डेफ़िनिशन फ़ाइल है.

6. YAML के वर्कफ़्लो एक्सप्लोर करें

workflows.yaml पर वर्कफ़्लो को कई चरणों में बताया जाता है. आइए, इसे बेहतर तरीके से समझने के लिए इसे देखते हैं.

वर्कफ़्लो की शुरुआत में, कुछ पैरामीटर पास किए जाते हैं. इन्हें वर्कफ़्लो ट्रिगर करने वाले दो Cloud Functions के ज़रिए पास किया जाएगा. हम इन फ़ंक्शन की जानकारी बाद में देंगे, लेकिन वर्कफ़्लो यहां से शुरू होता है:

d44a5e18aa9d4660.png

YAML में, यह देखा जा सकता है कि init चरण में वैरिएबल के लिए ये पैरामीटर असाइन किए गए हैं. उदाहरण के लिए, इवेंट ट्रिगर करने वाली फ़ाइल और बकेट के नाम. साथ ही, कुछ Cloud Functions और Cloud Run सेवाओं के यूआरएल, जिन्हें वर्कफ़्लो कॉल करेगा:

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}

इसके बाद, वर्कफ़्लो, इवेंट टाइप की जांच करता है. यह दो तरह के इवेंट टाइप का इस्तेमाल किया जा सकता है: object.finalize (किसी फ़ाइल को क्लाउड स्टोरेज बकेट में सेव करने पर यह मिटता है) और object.delete (किसी फ़ाइल को मिटाने पर). किसी भी अन्य चीज़ से ऐसे इवेंट को बढ़ावा मिलेगा जिसका इस्तेमाल नहीं किया जा सकता.

dd1f450983655619.png

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 को इमेज का विश्लेषण करने, इमेज में पहचानी गई चीज़ों के लेबल को क्रम से लगाने, मुख्य रंग चुनने, यह देखने के लिए कि इमेज दिखाने के लिए सुरक्षित है या नहीं, और फिर मेटाडेटा को Cloud Firestore में सेव करने के लिए Vision API के रिस्पॉन्स डेटा को बदलने के कई कॉल की सीरीज़ है.

ध्यान दें कि Vision Transform Cloud Functions को छोड़कर, वर्कफ़्लो में सभी काम किए जाते हैं. इन्हें हम बाद में डिप्लॉय करेंगे:

ca2ad16b9cbb436.png

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

इमेज का विश्लेषण होने के बाद, अगले दो चरणों में इमेज का थंबनेल और सबसे हाल की इमेज का एक कोलाज बनाना है. इसके लिए, Cloud Run की दो सेवाओं को डिप्लॉय करना होगा और thumbnailCall के collageCall चरणों से उन्हें कॉल करना होगा:

76f9179323c3144.png

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 से इसके मेटाडेटा को मिटाना चाहते हैं. ये दोनों, Workflows के एचटीटीपी कॉल की मदद से किए जाते हैं:

f172379274dcb3c2.png

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}

यहां दिए गए चरणों में, हम वर्कफ़्लो की सभी बाहरी डिपेंडेंसी बनाएंगे: बकेट, Cloud Functions, Cloud Run सेवाएं, और Firestore डेटाबेस.

7. बकेट बनाना

इमेज के लिए आपको दो बकेट की ज़रूरत होती है: हाई रिज़ॉल्यूशन वाली मूल इमेज को सेव करने के लिए और दूसरी इमेज के थंबनेल को सेव करने के लिए.

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}

Cloud Console के Cloud Storage सेक्शन में जाकर, इस बात की दोबारा जांच की जा सकती है कि बकेट बनाई गई हैं और सार्वजनिक की गई हैं:

15063936edd72f06.png

8. विज़न डेटा ट्रांसफ़ॉर्म (Cloud फ़ंक्शन)

Workflows.yaml init, eventTypeSwitch, eventTypeNotSupported कदमों से शुरू होता है. ये पक्का करते हैं कि बकेट से आने वाले इवेंट सही चरणों पर रूट किए जा रहे हों.

बनाई गई इमेज का मेटाडेटा एक्सट्रैक्ट करने के लिए, imageAnalysisCall चरण object.finalize इवेंट के लिए Vision API को कॉल करता है. ये सभी चरण वर्कफ़्लो में पूरे होते हैं:

daaed43a22d2b0d3.png

इसके बाद, हमें Vision API से लौटाए गए डेटा को पूरी तरह बदलना होगा, ताकि हम इसे Firestore में सेव कर सकें. खास तौर पर, हम चाहते हैं कि:

  • इमेज के लिए दिखाए गए लेबल की सूची बनाएं.
  • इमेज का मुख्य रंग वापस पाएं.
  • तय करें कि क्या तस्वीर सुरक्षित है.

ऐसा Cloud Function में कोड में किया जाता है और वर्कफ़्लो सिर्फ़ इस फ़ंक्शन को कॉल करता है:

5e120e70c67779cd.png

कोड को एक्सप्लोर करना

Cloud फ़ंक्शन को vision-data-transform कहा जाता है. आप इसका पूरा कोड index.js में देख सकते हैं. जैसा कि आपको दिख रहा है, इस फ़ंक्शन का मकसद JSON में बदलाव करना है, ताकि इमेज के मेटाडेटा को Firestore में आसानी से सेव किया जा सके.

Cloud Functions में डिप्लॉय करें

फ़ोल्डर पर जाएं:

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

फ़ंक्शन लागू होने के बाद, वर्कफ़्लो का transformImageAnalysisData चरण इस फ़ंक्शन को कॉल कर पाएगा, ताकि Vision API डेटा को बदला जा सके.

9. डेटाबेस तैयार करना

वर्कफ़्लो में अगला चरण, इमेज के डेटा से इमेज की सुरक्षा की जांच करना है और फिर Vision API से मिली तस्वीर की जानकारी को Cloud Firestore के डेटाबेस में स्टोर करना है. यह एक तेज़, पूरी तरह से मैनेज किया गया, सर्वर के बिना, क्लाउड-नेटिव NoSQL दस्तावेज़ डेटाबेस है:

6624c616bc7cd97f.png

ये दोनों काम, वर्कफ़्लो में किए जाते हैं. हालांकि, मेटाडेटा की मेमोरी के काम करने के लिए आपको Firestore डेटाबेस बनाना होगा.

सबसे पहले, उस इलाके में ऐप्लिकेशन इंजन ऐप्लिकेशन बनाएं जहां आपको Firestore डेटाबेस चाहिए (Firestore के लिए एक ज़रूरी शर्त):

export REGION_FIRESTORE=europe-west2
gcloud app create --region=${REGION_FIRESTORE}

इसके बाद, उसी क्षेत्र में Firestore डेटाबेस बनाएं:

gcloud firestore databases create --region=${REGION_FIRESTORE}

दस्तावेज़ हमारे कलेक्शन में प्रोग्राम के हिसाब से बनाए जाएंगे. इनमें चार फ़ील्ड होंगे:

  • name (string): अपलोड की गई फ़ोटो की फ़ाइल का नाम, जो दस्तावेज़ की कुंजी भी है
  • लेबल (स्ट्रिंग की कैटगरी): Vision API की मदद से पहचाने गए आइटम के लेबल
  • color (string): मुख्य रंग का हेक्साडेसिमल रंग कोड (जैसे, #ab12ef)
  • बनाया गया (तारीख): इस इमेज के मेटाडेटा को सेव किए जाने के समय का टाइमस्टैंप
  • थंबनेल (बूलियन): एक वैकल्पिक फ़ील्ड, जो मौजूद होगी. अगर इस तस्वीर के लिए थंबनेल इमेज जनरेट की गई है, तो यह सही हो जाएगी

हम Firestore में ऐसी तस्वीरें ढूंढने के लिए Firestore में खोज करेंगे जिनमें थंबनेल उपलब्ध होंगे. साथ ही, हम उन्हें बनने की तारीख के हिसाब से क्रम में लगाने का काम करेंगे, इसलिए हमें एक सर्च इंडेक्स बनाना होगा. इस कमांड की मदद से इंडेक्स बनाया जा सकता है:

gcloud firestore indexes composite create --collection-group=pictures \
  --field-config field-path=thumbnail,order=descending \
  --field-config field-path=created,order=descending

ध्यान दें कि इंडेक्स बनने में 10 मिनट या इससे ज़्यादा समय लग सकता है.

इंडेक्स बन जाने के बाद, उसे Cloud Console में देखा जा सकता है:

43af1f5103bf423.png

वर्कफ़्लो के storeMetadata चरण के तहत, इमेज के मेटाडेटा को अब Firestore में सेव किया जा सकेगा.

10. थंबनेल की सेवा (Cloud Run)

चेन में आगे आपको एक इमेज का थंबनेल बनाना है. ऐसा Cloud Run सेवा में कोड में किया जाता है और वर्कफ़्लो इस सेवा को thumbnailCall चरण में कॉल करता है:

84d987647f082b53.png

कोड को एक्सप्लोर करना

Cloud Run सेवा का नाम thumbnails है. आप इसका पूरा कोड index.js में देख सकते हैं.

कंटेनर इमेज बनाना और पब्लिश करना

Cloud Run, कंटेनर पर काम करता है, लेकिन पहले आपको कंटेनर की इमेज बनानी होगी. इसकी जानकारी Dockerfile में दी गई है. Google Cloud Build का इस्तेमाल कंटेनर की इमेज बनाने और फिर Google Container Registry को होस्ट करने के लिए किया जा सकता है.

फ़ोल्डर पर जाएं:

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 कंटेनर रजिस्ट्री में डिप्लॉय कर दिया जाएगा.

Cloud Run पर डिप्लॉय करें

कुछ ज़रूरी वैरिएबल और कॉन्फ़िगरेशन सेट करें:

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. कोलाज सेवा (Cloud Run)

चेन में आगे, सबसे हाल की इमेज से एक कोलाज बनाना है. ऐसा Cloud Run सेवा में कोड में किया जाता है और वर्कफ़्लो इस सेवा को collageCall चरण में कॉल करता है:

591e36149066e1ba.png

कोड को एक्सप्लोर करना

Cloud Run सेवा का नाम collage है. आप इसका पूरा कोड index.js में देख सकते हैं.

कंटेनर इमेज बनाना और पब्लिश करना

Cloud Run, कंटेनर पर काम करता है, लेकिन पहले आपको कंटेनर की इमेज बनानी होगी. इसकी जानकारी Dockerfile में दी गई है. Google Cloud Build का इस्तेमाल कंटेनर की इमेज बनाने और फिर Google Container Registry को होस्ट करने के लिए किया जा सकता है.

फ़ोल्डर पर जाएं:

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 कंटेनर रजिस्ट्री में डिप्लॉय कर दिया जाएगा.

Cloud Run पर डिप्लॉय करें

कुछ ज़रूरी वैरिएबल और कॉन्फ़िगरेशन सेट करें:

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}

सेवा डिप्लॉय होने के बाद, Cloud Console के Cloud Run सेक्शन में यह जांच की जा सकती है कि दोनों सेवाएं काम कर रही हैं या नहीं. वर्कफ़्लो के collageCall चरण में इस सेवा को कॉल किया जा सकेगा:

3ae9873f4cbbf423.png

12. वर्कफ़्लो डिप्लॉयमेंट

हमने Workflows की सभी बाहरी डिपेंडेंसी को डिप्लॉय किया है. बाकी के सभी चरण (finalizeCompleted, pictureGarbageCollectionGCS, pictureGarbageCollectionFirestore, deleteCompleted) को Workflows की मदद से पूरा किया जा सकता है.

वर्कफ़्लो लागू करने का समय आ गया है!

उस फ़ोल्डर पर जाएं जिसमें workflows.yaml फ़ाइल है और इसे इन चीज़ों के साथ डिप्लॉय करें:

export WORKFLOW_REGION=europe-west4
export WORKFLOW_NAME=picadaily-workflows
gcloud workflows deploy ${WORKFLOW_NAME} \
  --source=workflows.yaml \
  --location=${WORKFLOW_REGION}

कुछ ही सेकंड में, वर्कफ़्लो डिप्लॉय हो जाएगा और इसे Cloud Console के वर्कफ़्लो सेक्शन में देखा जा सकता है:

94a720149e5df9c5.png

आप चाहें, तो वर्कफ़्लो पर क्लिक करके उसमें बदलाव कर सकते हैं. बदलाव करने के दौरान, आपको वर्कफ़्लो का एक अच्छा विज़ुअल दिखता है:

55441b158f6027f3.png

सही पैरामीटर का इस्तेमाल करके, Cloud Console से मैन्युअल तरीके से भी वर्कफ़्लो चलाया जा सकता है. इसके बजाय, हम अगले चरण में Cloud Storage इवेंट के जवाब में इसे अपने-आप लागू कर देंगे.

13. वर्कफ़्लो ट्रिगर (Cloud फ़ंक्शन)

वर्कफ़्लो लागू हो गया है और तैयार है. अब हमें Cloud Storage बकेट में किसी फ़ाइल के बनाए या मिटाए जाने पर, वर्कफ़्लो ट्रिगर करना होगा. ये storage.object.finalize और storage.object.delete इवेंट हैं.

वर्कफ़्लो बनाने, मैनेज करने, और एक्ज़ीक्यूट करने के लिए एपीआई और क्लाइंट लाइब्रेरी मौजूद होती हैं, जिनका इस्तेमाल किया जा सकता है. इस मामले में, वर्कफ़्लो को ट्रिगर करने के लिए, Workflows खाता है और खास तौर पर इसकी Node.js क्लाइंट लाइब्रेरी का इस्तेमाल किया जाएगा.

Cloud Storage के इवेंट को सुनकर, Cloud Function से वर्कफ़्लो ट्रिगर किया जाएगा. क्लाउड फ़ंक्शन सिर्फ़ एक तरह के इवेंट को सुन सकता है. इसलिए, इवेंट बनाने और मिटाने, दोनों के लिए आपको दो Cloud Functions डिप्लॉय करने होंगे:

c4d79646de729e4.png

कोड को एक्सप्लोर करना

Cloud फ़ंक्शन को trigger-workflow कहा जाता है. आप इसका पूरा कोड index.js में देख सकते हैं.

Cloud Functions में डिप्लॉय करें

फ़ोल्डर पर जाएं:

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}

डिप्लॉयमेंट पूरा होने के बाद, Cloud Console में दोनों फ़ंक्शन देखे जा सकते हैं:

7d60c8b7851f39f5.png

14. फ़्रंटएंड (App Engine)

इस चरण में, आप Pic-a-daily: Lab 4—वेब फ़्रंटएंड बनाएं से Google App Engine पर एक वेब फ़्रंटएंड बनाएं, जिससे उपयोगकर्ता वेब ऐप्लिकेशन से चित्र अपलोड करने के साथ ही अपलोड की गई तस्वीरें और उनके थंबनेल ब्राउज़ कर सकेंगे.

223fb2281614d053.png

आप App Engine के बारे में ज़्यादा जान सकते हैं और Pic-a-daily: Lab 4—वेब फ़्रंटएंड बनाएं में जाकर कोड का ब्यौरा पढ़ सकते हैं.

कोड को एक्सप्लोर करना

App Engine ऐप्लिकेशन को frontend कहा जाता है. आप इसका पूरा कोड index.js में देख सकते हैं.

App Engine में डिप्लॉय करें

फ़ोल्डर पर जाएं:

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

यह देखने के लिए कि ऐप्लिकेशन डिप्लॉय किया गया है या नहीं, Cloud Console के App Engine सेक्शन में जाकर भी, App Engine की सुविधाओं के बारे में जाना जा सकता है. इनमें वर्शन बनाने और ट्रैफ़िक के बंटवारे जैसी सुविधाएं शामिल हैं:

f4bd5f4de028bd83.png

15. वर्कफ़्लो की जांच करें

जांच करने के लिए, ऐप्लिकेशन (https://<YOUR_PROJECT_ID>.appspot.com/) ऐप्लिकेशन के डिफ़ॉल्ट App Engine यूआरएल पर जाएं और आपको फ़्रंटएंड यूज़र इंटरफ़ेस (यूआई) तैयार होते हुए दिखना चाहिए!

1649ac060441099.png

कोई तस्वीर अपलोड करें. इससे वर्कफ़्लो ट्रिगर होगा. साथ ही, Cloud Console में आपको Active में वर्कफ़्लो पूरा होने की प्रोसेस दिखेगी:

b5a2a3d7a2bc094.png

वर्कफ़्लो पूरा होने के बाद, एक्ज़ीक्यूशन आईडी पर क्लिक करके, अलग-अलग सेवाओं से मिलने वाला आउटपुट देखा जा सकता है:

8959df5098c21548.png

तीन और तस्वीरें अपलोड करें. आपको Cloud Storage बकेट और अपडेट किए गए App Engine फ़्रंटएंड में, इमेज का थंबनेल और कोलाज भी दिखेगा:

d90c786ff664a5dc.png

16. स्टोरेज खाली करें (ज़रूरी नहीं)

अगर आपको ऐप्लिकेशन का इस्तेमाल नहीं करना है, तो संसाधनों को खाली किया जा सकता है. इससे प्रोजेक्ट को मिटाया जा सकता है और कम से कम खर्च किया जा सकता है. साथ ही, एक अच्छा क्लाउड सिटिज़न भी बन सकता है:

gcloud projects delete ${GOOGLE_CLOUD_PROJECT} 

17. बधाई हो!

आपने वर्कफ़्लो का इस्तेमाल करके, ऐप्लिकेशन का एक व्यवस्थित वर्शन बनाया है. यह वर्शन, सेवाओं को व्यवस्थित करने और कॉल करने के लिए इस्तेमाल किया जाता है.

इसमें हमने इन विषयों के बारे में बताया

  • App Engine
  • Cloud Firestore
  • Cloud Functions
  • Cloud Run
  • वर्कफ़्लो