Pic-a-daily: लैब 5—इमेज मिटाने के बाद क्लीनअप करना

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

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

d93345bfc235f81e.png

आपको क्या सीखने को मिलेगा

  • Cloud Run
  • Cloud Storage
  • Cloud Firestore
  • Eventarc

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

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

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों के लिए डिसप्ले नेम होता है. यह एक कैरेक्टर स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते. इसे किसी भी समय अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, सभी Google Cloud प्रोजेक्ट के लिए यूनीक होना चाहिए. साथ ही, इसे बदला नहीं जा सकता. Cloud Console, एक यूनीक स्ट्रिंग अपने-आप जनरेट करता है. आम तौर पर, आपको इससे कोई फ़र्क़ नहीं पड़ता कि यह क्या है. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना होगा. इसे आम तौर पर PROJECT_ID के तौर पर पहचाना जाता है. इसलिए, अगर आपको यह पसंद नहीं है, तो कोई दूसरा रैंडम आईडी जनरेट करें. इसके अलावा, अपने हिसाब से कोई आईडी बनाकर देखें कि वह उपलब्ध है या नहीं. इसके बाद, प्रोजेक्ट बनाने के बाद इसे "फ़्रीज़" कर दिया जाता है.
  • तीसरी वैल्यू, प्रोजेक्ट नंबर होती है. इसका इस्तेमाल कुछ एपीआई करते हैं. इन तीनों वैल्यू के बारे में ज़्यादा जानने के लिए, दस्तावेज़ देखें.
  1. इसके बाद, आपको Cloud Console में बिलिंग चालू करनी होगी, ताकि Cloud संसाधनों/एपीआई का इस्तेमाल किया जा सके. इस कोडलैब को पूरा करने में ज़्यादा खर्च नहीं आएगा. संसाधन बंद करने के लिए, कोडलैब के आखिर में दिए गए "बंद करें" निर्देशों का पालन करें, ताकि इस ट्यूटोरियल के बाद आपको बिलिंग न करनी पड़े. Google Cloud के नए उपयोगकर्ताओं को, मुफ़्त में आज़माने के लिए 300 डॉलर का क्रेडिट मिलता है.

Cloud Shell शुरू करें

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

GCP Console में, सबसे ऊपर दाईं ओर मौजूद टूलबार पर मौजूद Cloud Shell आइकॉन पर क्लिक करें:

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

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

3. Eventarc के बारे में जानकारी

Eventarc की मदद से, Cloud Run सेवाओं को अलग-अलग सोर्स से मिलने वाले इवेंट के साथ आसानी से कनेक्ट किया जा सकता है. यह आपके लिए इवेंट को इकट्ठा करने, डिलीवर करने, सुरक्षित रखने, अनुमति देने, और गड़बड़ी ठीक करने का काम करता है.

776ed63706ca9683.png

Google Cloud के सोर्स और Cloud Pub/Sub पर पब्लिश करने वाले कस्टम ऐप्लिकेशन से इवेंट लिए जा सकते हैं. साथ ही, उन्हें Google Cloud Run सिंक तक पहुंचाया जा सकता है.

Cloud Audit Logs की मदद से, Google Cloud के कई सोर्स से इवेंट डिलीवर किए जाते हैं. इन सोर्स से इवेंट डिलीवरी की लेटेन्सी और उपलब्धता, Cloud Audit Logs की लेटेन्सी और उपलब्धता से जुड़ी होती है. जब भी Google Cloud सोर्स से कोई इवेंट ट्रिगर होता है, तब उससे जुड़ी Cloud Audit Log एंट्री बन जाती है.

Cloud Pub/Sub पर पब्लिश करने वाले कस्टम ऐप्लिकेशन, Pub/Sub के किसी ऐसे विषय पर मैसेज पब्लिश कर सकते हैं जिसे वे किसी भी फ़ॉर्मैट में तय करते हैं.

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

सभी इवेंट, CloudEvents v1.0 फ़ॉर्मैट में डिलीवर किए जाते हैं, ताकि अलग-अलग सेवाओं के बीच इंटरऑपरेबिलिटी हो सके.

4. शुरू करने से पहले

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

Cloud Run सेवा को ट्रिगर करने के लिए, आपको Eventarc सेवा की ज़रूरत होगी. पक्का करें कि यह सुविधा चालू हो:

gcloud services enable eventarc.googleapis.com

आपको यह कार्रवाई पूरी होने का मैसेज दिखेगा:

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

सेवा खातों को कॉन्फ़िगर करना

ट्रिगर में, Compute Engine के डिफ़ॉल्ट सेवा खाते का इस्तेमाल किया जाएगा. डिफ़ॉल्ट कंप्यूट सेवा खाते को eventarc.eventReceiver की भूमिका असाइन करें:

PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format='value(projectNumber)')

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
    --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
    --role roles/eventarc.eventReceiver

Cloud Storage सेवा खाते को pubsub.publisher की भूमिका असाइन करें. Eventarc Cloud Storage ट्रिगर के लिए यह ज़रूरी है:

SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)

gcloud projects add-iam-policy-binding $PROJECT_NUMBER \
    --member serviceAccount:$SERVICE_ACCOUNT \
    --role roles/pubsub.publisher

अगर आपने Pub/Sub सेवा खाते को 8 अप्रैल, 2021 को या उससे पहले चालू किया था, तो Pub/Sub सेवा खाते को iam.serviceAccountTokenCreator की भूमिका असाइन करें:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
  --role roles/iam.serviceAccountTokenCreator

5. कोड क्लोन करना

अगर आपने पिछले कोड लैब में कोड को क्लोन नहीं किया है, तो इसे क्लोन करें:

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

इसके बाद, उस डायरेक्ट्री पर जाएं जिसमें सेवा मौजूद है:

cd serverless-photosharing-workshop/services/garbage-collector/nodejs

सेवा के लिए, आपके पास फ़ाइल का यह लेआउट होगा:

services
 |
 ├── garbage-collector
      |
      ├── nodejs
           |
           ├── index.js
           ├── package.json

फ़ोल्डर में, ये तीन फ़ाइलें हैं:

  • index.js में Node.js कोड शामिल है
  • package.json लाइब्रेरी की डिपेंडेंसी तय करता है

6. कोड के बारे में जानकारी

ज़रूरी शर्तें

package.json फ़ाइल में, ज़रूरी लाइब्रेरी डिपेंडेंसी के बारे में बताया गया है:

{
  "name": "garbage_collector_service",
  "version": "0.0.1",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "cloudevents": "^4.0.1",
    "express": "^4.17.1",
    "@google/events": "^3.1.0",
    "@google-cloud/firestore": "^4.9.9",
    "@google-cloud/storage": "^5.8.3"
  }
}

Cloud Storage में मौजूद इमेज को मिटाने के लिए, हम Cloud Storage लाइब्रेरी पर निर्भर करते हैं. हमने Cloud Firestore पर निर्भरता का एलान किया है, ताकि हम पहले से सेव किए गए फ़ोटो के मेटाडेटा को भी मिटा सकें. इसके अलावा, Eventarc से भेजे गए CloudEvents को पढ़ने के लिए, हम CloudEvents SDK और Google Events लाइब्रेरी पर निर्भर रहते हैं. Express, JavaScript / Node वेब फ़्रेमवर्क है. Bluebird का इस्तेमाल, प्रॉमिस को मैनेज करने के लिए किया जाता है.

index.js

आइए, अपने index.js कोड पर एक नज़र डालें:

const express = require('express');
const {Storage} = require('@google-cloud/storage');
const Firestore = require('@google-cloud/firestore');
const { HTTP } = require("cloudevents");
const {toStorageObjectData} = require('@google/events/cloud/storage/v1/StorageObjectData');

हमारे प्रोग्राम को चलाने के लिए, हमें कई डिपेंडेंसी की ज़रूरत होती है: Express, Node वेब फ़्रेमवर्क है, जिसका हम इस्तेमाल करेंगे. Bluebird, JavaScript प्रॉमिस को मैनेज करने के लिए एक लाइब्रेरी है. Storage और Firestore का इस्तेमाल, Google Cloud Storage (हमारी इमेज की बकेट) और Cloud Firestore डेटास्टोर के साथ काम करने के लिए किया जाता है. इसके अलावा, हमें CloudEvent की ज़रूरत होती है. इससे, Eventarc StoreObjectData से भेजे गए CloudEvent को पढ़ा जा सकता है. साथ ही, Google Events library से CloudEvent के Cloud Storage इवेंट बॉडी को भी पढ़ा जा सकता है.

const app = express();
app.use(express.json());

app.post('/', async (req, res) => {
    try {
        const cloudEvent = HTTP.toEvent({ headers: req.headers, body: req.body });
        console.log(cloudEvent);


        /* ... */

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

ऊपर, हमने अपने नोड हैंडलर का स्ट्रक्चर दिया है: हमारा ऐप्लिकेशन, एचटीटीपी पोस्ट अनुरोधों का जवाब देता है. यह एचटीटीपी अनुरोध से CloudEvent को पढ़ता है. अगर कोई गड़बड़ी होती है, तो हम उसे ठीक करने की कोशिश करते हैं. अब देखते हैं कि इस स्ट्रक्चर के अंदर क्या है.

अगला चरण, CloudEvent के मुख्य हिस्से को वापस पाना और पार्स करना है. साथ ही, ऑब्जेक्ट का नाम वापस पाना है:

const storageObjectData = toStorageObjectData(cloudEvent.data);
console.log(storageObjectData);

const objectName = storageObjectData.name;

इमेज का नाम पता चलने के बाद, हम उसे थंबनेल बकेट से मिटा सकते हैं:

try {
    await storage.bucket(bucketThumbnails).file(objectName).delete();
    console.log(`Deleted '${objectName}' from bucket '${bucketThumbnails}'.`);
}
catch(err) {
    console.log(`Failed to delete '${objectName}' from bucket '${bucketThumbnails}': ${err}.`);
}

आखिरी चरण के तौर पर, Firestore कलेक्शन से भी फ़ोटो का मेटाडेटा मिटाएं:

try {
    const pictureStore = new Firestore().collection('pictures');
    const docRef = pictureStore.doc(objectName);
    await docRef.delete();

    console.log(`Deleted '${objectName}' from Firestore collection 'pictures'`);
}
catch(err) {
    console.log(`Failed to delete '${objectName}' from Firestore: ${err}.`);
}

res.status(200).send(`Processed '${objectName}'.`);

अब हमारी नोड स्क्रिप्ट को आने वाले अनुरोधों को सुनने का समय है. यह भी देखें कि ज़रूरी एनवायरमेंट वैरिएबल सेट किए गए हैं या नहीं:

app.listen(PORT, () => {
    if (!bucketThumbnails) throw new Error("BUCKET_THUMBNAILS not set");
    console.log(`Started service on port ${PORT}`);
});

7. लोकल तौर पर टेस्ट करना

कोड को क्लाउड पर डिप्लॉय करने से पहले, स्थानीय तौर पर उसकी जांच करें. इससे यह पक्का किया जा सकेगा कि कोड काम कर रहा है.

garbage-collector/nodejs फ़ोल्डर में, npm डिपेंडेंसी इंस्टॉल करें और सर्वर शुरू करें:

export BUCKET_THUMBNAILS=thumbnails-$GOOGLE_CLOUD_PROJECT

npm install; npm start

अगर सब कुछ ठीक रहा, तो यह पोर्ट 8080 पर सर्वर शुरू कर देगा:

Started service on port 8080

बाहर निकलने के लिए, CTRL-C का इस्तेमाल करें.

8. Cloud Run पर इमेज बनाना और डिप्लॉय करना

Cloud Run पर डिप्लॉय करने से पहले, Cloud Run के लिए उपलब्ध किसी देश/इलाके को चुनें. साथ ही, प्लैटफ़ॉर्म को managed पर सेट करें:

REGION=europe-west1
gcloud config set run/region $REGION
gcloud config set run/platform managed

यह देखा जा सकता है कि कॉन्फ़िगरेशन सेट है या नहीं:

gcloud config list

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

Cloud Build का इस्तेमाल करके, कंटेनर इमेज को मैन्युअल तरीके से बनाने और पब्लिश करने के बजाय, Cloud Run पर भरोसा किया जा सकता है. Cloud Run, Google Cloud Buildpacks का इस्तेमाल करके, आपके लिए कंटेनर इमेज बना सकता है.

Google Cloud Buildpack का इस्तेमाल करके कंटेनर इमेज बनाने के लिए, यह निर्देश चलाएं. इसके बाद, कंटेनर इमेज को Cloud Run पर डिप्लॉय करें:

SERVICE_NAME=garbage-collector-service

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

–-source फ़्लैग पर ध्यान दें. इससे Cloud Run को यह सूचना मिलती है कि कंटेनर इमेज बनाने के लिए, Google Cloud Buildpacks का इस्तेमाल किया जाए. इसके लिए, Dockerfile. की ज़रूरत नहीं होती. --no-allow-unauthenticated फ़्लैग, Cloud Run सेवा को एक इंटरनल सेवा बनाता है. यह सिर्फ़ कुछ सेवा खातों से ट्रिगर होगी. इसके बाद, Compute के डिफ़ॉल्ट सेवा खाते का इस्तेमाल करके ट्रिगर बनाया जाएगा. इस खाते के पास, Cloud Run की इंटरनल सेवाओं को कॉल करने के लिए run.invoker की भूमिका होती है.

9. ट्रिगर बनाना

Eventarc में, ट्रिगर यह तय करता है कि किस सेवा को किस तरह के इवेंट मिलने चाहिए. इस मामले में, आपको यह सूचना चाहिए कि जब किसी बकेट में कोई फ़ाइल मिटाई जाए, तब सेवा को इवेंट मिले.

ट्रिगर की जगह को उसी इलाके में सेट करें जहां अपलोड की गई तस्वीरों का बकेट है:

gcloud config set eventarc/location eu

storage.objects.delete इवेंट को फ़िल्टर करने और उन्हें Cloud Run सेवा पर भेजने के लिए, AuditLog ट्रिगर बनाएं:

BUCKET_IMAGES=uploaded-pictures-$GOOGLE_CLOUD_PROJECT

gcloud eventarc triggers create trigger-$SERVICE_NAME \
  --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$REGION \
  --event-filters="type=google.cloud.storage.object.v1.deleted" \
  --event-filters="bucket=$BUCKET_IMAGES" \
  --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

इस निर्देश की मदद से, यह पुष्टि की जा सकती है कि ट्रिगर बनाया गया है या नहीं:

gcloud eventarc triggers list

10. सेवा को आज़माना

यह देखने के लिए कि सेवा काम कर रही है या नहीं, uploaded-pictures बकेट पर जाएं और कोई एक फ़ोटो मिटाएं. आपको सेवा के लॉग में यह दिखना चाहिए कि उसने thumbnails बकेट में मौजूद काम की फ़ोटो मिटा दी है. साथ ही, pictures Firestore कलेक्शन से उसका दस्तावेज़ भी मिटा दिया है.

519abf90e7ea4d12.png

11. डेटा साफ़ करना (ज़रूरी नहीं)

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

सेवा मिटाएं:

gcloud run services delete $SERVICE_NAME -q

Eventarc ट्रिगर मिटाएं:

gcloud eventarc triggers delete trigger-$SERVICE_NAME -q

इसके अलावा, पूरे प्रोजेक्ट को मिटाया जा सकता है:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

12. बधाई हो!

बधाई हो! आपने Cloud Run सेवा, इमेज गार्बेज कलेक्टर बनाई है. इसे Eventarc ट्रिगर करता है. Eventarc, Cloud Run में इवेंट पाने के लिए नई सेवा है. जब तस्वीरों के बकेट से कोई तस्वीर मिटाई जाती है, तो सेवा को Eventarc से एक इवेंट मिलता है. इसके बाद, यह इमेज को थंबनेल बकेट से मिटा देता है. साथ ही, इसे Firestore के फ़ोटो कलेक्शन से भी हटा देता है.

हमने क्या-क्या बताया

  • Cloud Run
  • Cloud Storage
  • Cloud Firestore
  • Eventarc