Pic-a-daily: Lab 2—तस्वीरों के थंबनेल बनाएं

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

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

जब कोई इमेज Cloud Storage पर अपलोड की जाती है, तो Cloud Pub/Sub के ज़रिए Cloud Run वेब कंटेनर को एक सूचना भेजी जाती है. इसके बाद, यह इमेज का साइज़ बदलता है और उन्हें Cloud Storage में किसी दूसरी बकेट में सेव करता है.

31fa4f8a294d90df.png

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

  • Cloud Run
  • Cloud Storage
  • Cloud Pub/Sub

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

अपनी रफ़्तार से सेटअप करने के लिए एनवायरमेंट सेट अप करना

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

96a9c957bc475304.pngb9a10ebdf5b5a448.pnga1e3c01a38fa61c2.png

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

Cloud Shell शुरू करना

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

जीसीपी कंसोल में, सबसे ऊपर दाएं टूलबार पर मौजूद Cloud Shell आइकॉन पर क्लिक करें:

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

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

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

इस लैब में, आपको कंटेनर इमेज बनाने के लिए Cloud Build और कंटेनर को डिप्लॉय करने के लिए Cloud Run की ज़रूरत होगी.

Cloud Shell से, दोनों एपीआई चालू करें:

gcloud services enable cloudbuild.googleapis.com \
  run.googleapis.com

आपको दिखेगा कि ऑपरेशन पूरा हो गया है:

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

4. कोई दूसरी बकेट बनाएं

अपलोड की गई इमेज के थंबनेल, किसी दूसरी बकेट में सेव किए जाएंगे. दूसरी बकेट बनाने के लिए, gsutil का इस्तेमाल करें.

Cloud Shell में, यूनीक बकेट के नाम के लिए कोई वैरिएबल सेट करें. Cloud Shell में, GOOGLE_CLOUD_PROJECT पहले से ही आपके यूनीक प्रोजेक्ट आईडी पर सेट है. इसे बकेट के नाम में जोड़ा जा सकता है. इसके बाद, यूरोप में एक सार्वजनिक मल्टी-रीजन बकेट बनाएं. इसमें सभी के लिए एक जैसा ऐक्सेस लेवल सेट करें:

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

आखिर में, आपके पास एक नई सार्वजनिक बकेट होनी चाहिए:

8e75c8099938e972.png

5. कोड क्लोन करें

कोड क्लोन करें और उस डायरेक्ट्री पर जाएं जिसमें सेवा मौजूद है:

git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop
cd serverless-photosharing-workshop/services/thumbnails/nodejs

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

services
 |
 ├── thumbnails
      |
      ├── nodejs
           |
           ├── Dockerfile
           ├── index.js
           ├── package.json

thumbnails/nodejs फ़ोल्डर में, आपके पास तीन फ़ाइलें होंगी:

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

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

कोड एक्सप्लोर करने के लिए, बिल्ट-इन टेक्स्ट एडिटर का इस्तेमाल किया जा सकता है. इसके लिए, Cloud Shell विंडो में सबसे ऊपर मौजूद Open Editor बटन पर क्लिक करें:

3d145fe299dd8b3e.png

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

डिपेंडेंसी

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

{
  "name": "thumbnail_service",
  "version": "0.0.1",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "bluebird": "^3.7.2",
    "express": "^4.17.1",
    "imagemagick": "^0.1.3",
    "@google-cloud/firestore": "^4.9.9",
    "@google-cloud/storage": "^5.8.3"
  }
}

Cloud Storage में इमेज फ़ाइलें पढ़ने और सेव करने के लिए, Cloud Storage लाइब्रेरी का इस्तेमाल किया जाता है. Firestore का इस्तेमाल, इमेज के मेटाडेटा को अपडेट करने के लिए किया जाता है. Express, JavaScript / Node वेब फ़्रेमवर्क है. आने वाले अनुरोधों को आसानी से पार्स करने के लिए, body-parser मॉड्यूल का इस्तेमाल किया जाता है. Bluebird का इस्तेमाल, प्रॉमिस को हैंडल करने के लिए किया जाता है. वहीं, Imagemagick, इमेज में बदलाव करने के लिए एक लाइब्रेरी है.

Dockerfile

Dockerfile में, ऐप्लिकेशन के लिए कंटेनर इमेज तय की जाती है:

FROM node:14-slim

# installing Imagemagick
RUN set -ex; \
  apt-get -y update; \
  apt-get -y install imagemagick; \
  rm -rf /var/lib/apt/lists/*; \
  mkdir /tmp/original; \
  mkdir /tmp/thumbnail;

WORKDIR /picadaily/services/thumbnails
COPY package*.json ./
RUN npm install --production
COPY . .
CMD [ "npm", "start" ]

बेस इमेज Node 14 है. इमेज में बदलाव करने के लिए, imagemagick लाइब्रेरी का इस्तेमाल किया जाता है. ओरिजनल और थंबनेल इमेज फ़ाइलें सेव करने के लिए, कुछ अस्थायी डायरेक्ट्री बनाई जाती हैं. इसके बाद, हमारे कोड के लिए ज़रूरी एनपीएम मॉड्यूल इंस्टॉल किए जाते हैं. इसके बाद, npm start से कोड शुरू किया जाता है.

index.js

कोड को अलग-अलग हिस्सों में एक्सप्लोर करते हैं, ताकि हम बेहतर तरीके से समझ सकें कि यह प्रोग्राम क्या कर रहा है.

const express = require('express');
const imageMagick = require('imagemagick');
const Promise = require("bluebird");
const path = require('path');
const {Storage} = require('@google-cloud/storage');
const Firestore = require('@google-cloud/firestore');

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

सबसे पहले, हम ज़रूरी डिपेंडेंसी का अनुरोध कर रहे हैं. इसके बाद, अपना Express वेब ऐप्लिकेशन बना रहे हैं. साथ ही, यह भी बता रहे हैं कि हमें JSON बॉडी पार्सर का इस्तेमाल करना है, क्योंकि आने वाले अनुरोध असल में सिर्फ़ JSON पेलोड होते हैं. इन्हें हमारे ऐप्लिकेशन को POST अनुरोध के ज़रिए भेजा जाता है.

app.post('/', async (req, res) => {
    try {
        // ...
    } catch (err) {
        console.log(`Error: creating the thumbnail: ${err}`);
        console.error(err);
        res.status(500).send(err);
    }
});

हमें ये आने वाले पेलोड, / बेस यूआरएल पर मिल रहे हैं. साथ ही, हम अपने कोड को कुछ गड़बड़ी लॉजिक हैंडलिंग के साथ रैप कर रहे हैं, ताकि Google Cloud वेब कंसोल में Stackdriver Logging इंटरफ़ेस से दिखने वाले लॉग देखकर, हमें इस बारे में बेहतर जानकारी मिल सके कि हमारे कोड में कोई गड़बड़ी क्यों हो रही है.

const pubSubMessage = req.body;
console.log(`PubSub message: ${JSON.stringify(pubSubMessage)}`);

const fileEvent = JSON.parse(Buffer.from(pubSubMessage.message.data, 'base64').toString().trim());
console.log(`Received thumbnail request for file ${fileEvent.name} from bucket ${fileEvent.bucket}`);

Cloud Run प्लैटफ़ॉर्म पर, Pub/Sub मैसेज, एचटीटीपी POST अनुरोधों के ज़रिए भेजे जाते हैं. ये JSON पेलोड के तौर पर इस फ़ॉर्म में होते हैं:

{
  "message": {
    "attributes": {
      "bucketId": "uploaded-pictures",
      "eventTime": "2020-02-27T09:22:43.255225Z",
      "eventType": "OBJECT_FINALIZE",
      "notificationConfig": "projects/_/buckets/uploaded-pictures/notificationConfigs/28",
      "objectGeneration": "1582795363255481",
      "objectId": "IMG_20200213_181159.jpg",
      "payloadFormat": "JSON_API_V1"
    },
    "data": "ewogICJraW5kIjogInN0b3JhZ2Ujb2JqZWN...FQUU9Igp9Cg==",
    "messageId": "1014308302773399",
    "message_id": "1014308302773399",
    "publishTime": "2020-02-27T09:22:43.973Z",
    "publish_time": "2020-02-27T09:22:43.973Z"
  },
  "subscription": "projects/serverless-picadaily/subscriptions/gcs-events-subscription"
}

हालांकि, इस JSON दस्तावेज़ में सबसे दिलचस्प बात यह है कि इसमें message.data एट्रिब्यूट में क्या शामिल है. यह सिर्फ़ एक स्ट्रिंग है, लेकिन यह असल पेलोड को Base 64 में एन्कोड करती है. इसलिए, ऊपर दिया गया हमारा कोड, इस एट्रिब्यूट के Base 64 कॉन्टेंट को डिकोड कर रहा है. डिकोड होने के बाद, data एट्रिब्यूट में एक और JSON दस्तावेज़ होता है. इसमें Cloud Storage इवेंट की जानकारी होती है. इसमें अन्य मेटाडेटा के अलावा, फ़ाइल का नाम और बकेट का नाम भी शामिल होता है.

{
  "kind": "storage#object",
  "id": "uploaded-pictures/IMG_20200213_181159.jpg/1582795363255481",
  "selfLink": "https://www.googleapis.com/storage/v1/b/uploaded-pictures/o/IMG_20200213_181159.jpg",
  "name": "IMG_20200213_181159.jpg",
  "bucket": "uploaded-pictures",
  "generation": "1582795363255481",
  "metageneration": "1",
  "contentType": "image/jpeg",
  "timeCreated": "2020-02-27T09:22:43.255Z",
  "updated": "2020-02-27T09:22:43.255Z",
  "storageClass": "STANDARD",
  "timeStorageClassUpdated": "2020-02-27T09:22:43.255Z",
  "size": "4944335",
  "md5Hash": "QzBIoPJBV2EvqB1EVk1riw==",
  "mediaLink": "https://www.googleapis.com/download/storage/v1/b/uploaded-pictures/o/IMG_20200213_181159.jpg?generation=1582795363255481&alt=media",
  "crc32c": "hQ3uHg==",
  "etag": "CLmJhJu08ecCEAE="
}

हमें इमेज और बकेट के नामों में दिलचस्पी है, क्योंकि हमारा कोड, थंबनेल बनाने के लिए उस इमेज को बकेट से फ़ेच करने वाला है:

const bucket = storage.bucket(fileEvent.bucket);
const thumbBucket = storage.bucket(process.env.BUCKET_THUMBNAILS);

const originalFile = path.resolve('/tmp/original', fileEvent.name);
const thumbFile = path.resolve('/tmp/thumbnail', fileEvent.name);

await bucket.file(fileEvent.name).download({
    destination: originalFile
});
console.log(`Downloaded picture into ${originalFile}`);

हम आउटपुट स्टोरेज बकेट का नाम, एनवायरमेंट वैरिएबल से वापस पा रहे हैं.

हमारे पास ओरिजन बकेट है. इसमें फ़ाइल बनाने की वजह से, हमारी Cloud Run सेवा ट्रिगर हुई. साथ ही, डेस्टिनेशन बकेट है, जिसमें हम नतीजे के तौर पर मिली इमेज सेव करेंगे. हम स्थानीय फ़ाइल हैंडलिंग के लिए, path बिल्ट-इन एपीआई का इस्तेमाल कर रहे हैं, क्योंकि imagemagick लाइब्रेरी, /tmp अस्थायी डायरेक्ट्री में स्थानीय तौर पर थंबनेल बनाएगी. अपलोड की गई इमेज फ़ाइल डाउनलोड करने के लिए, हम एसिंक्रोनस कॉल के लिए await का इस्तेमाल कर रहे हैं.

const resizeCrop = Promise.promisify(im.crop);
await resizeCrop({
        srcPath: originalFile,
        dstPath: thumbFile,
        width: 400,
        height: 400         
});
console.log(`Created local thumbnail in ${thumbFile}`);

Imagemagick मॉड्यूल, async / await के साथ काम करने के लिए ज़्यादा बेहतर नहीं है. इसलिए, हम इसे JavaScript प्रॉमिस (Bluebird मॉड्यूल से मिला) में रैप कर रहे हैं. इसके बाद, हम एसिंक्रोनस साइज़ बदलने / क्रॉप करने वाले फ़ंक्शन को कॉल कर रहे हैं. इसे हमने सोर्स और डेस्टिनेशन फ़ाइलों के पैरामीटर के साथ-साथ, उस थंबनेल के डाइमेंशन के साथ बनाया है जिसे हमें बनाना है.

await thumbBucket.upload(thumbFile);
console.log(`Uploaded thumbnail to Cloud Storage bucket ${process.env.BUCKET_THUMBNAILS}`);

Cloud Storage पर थंबनेल फ़ाइल अपलोड होने के बाद, हम Cloud Firestore में मेटाडेटा भी अपडेट करेंगे. इससे यह बताने के लिए एक बूलियन फ़्लैग जोड़ा जाएगा कि इस इमेज का थंबनेल जनरेट हो गया है:

const pictureStore = new Firestore().collection('pictures');
const doc = pictureStore.doc(fileEvent.name);
await doc.set({
    thumbnail: true
}, {merge: true});
console.log(`Updated Firestore about thumbnail creation for ${fileEvent.name}`);

res.status(204).send(`${fileEvent.name} processed`);

हमारा अनुरोध पूरा होने के बाद, हम एचटीटीपी POST अनुरोध का जवाब देते हैं कि फ़ाइल को सही तरीके से प्रोसेस कर लिया गया है.

const PORT = process.env.PORT || 8080;

app.listen(PORT, () => {
    console.log(`Started thumbnail generator on port ${PORT}`);
});

सोर्स फ़ाइल के आखिर में, हमारे पास Express को डिफ़ॉल्ट पोर्ट 8080 पर अपना वेब ऐप्लिकेशन शुरू करने के निर्देश हैं.

7. स्थानीय तौर पर टेस्ट करना

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

thumbnails/nodejs फ़ोल्डर में, एनपीएम डिपेंडेंसी इंस्टॉल करें और सर्वर शुरू करें:

npm install; npm start

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

Started thumbnail generator on port 8080

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

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

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

thumbnails/nodejs फ़ोल्डर में, जहां Dockerfile मौजूद है, कंटेनर इमेज बनाने के लिए यह निर्देश जारी करें:

gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/thumbnail-service

एक या दो मिनट बाद, बिल्ड पूरा हो जाना चाहिए:

b354b3a9a3631097.png

Cloud Build के "इतिहास" सेक्शन में, आपको सफल बिल्ड भी दिखना चाहिए:

df00f198dd2bf6bf.png

जानकारी देखने के लिए, बिल्ड आईडी पर क्लिक करें. "बिल्ड आर्टफ़ैक्ट" टैब में, आपको दिखना चाहिए कि कंटेनर इमेज को Cloud Registry (GCR) पर अपलोड कर दिया गया है:

a4577ce0744f73e2.png

अगर चाहें, तो यह पक्का करने के लिए दोबारा जांच करें कि कंटेनर इमेज, Cloud Shell में स्थानीय तौर पर चलती है या नहीं:

docker run -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/thumbnail-service

इसे कंटेनर में पोर्ट 8080 पर सर्वर शुरू करना चाहिए:

Started thumbnail generator on port 8080

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

9. Cloud Run पर डिप्लॉय करना

Cloud Run पर डिप्लॉय करने से पहले, Cloud Run के लिए कोई ऐसा इलाका सेट करें जो काम करता हो. साथ ही, प्लैटफ़ॉर्म को managed पर सेट करें:

gcloud config set run/region europe-west1
gcloud config set run/platform managed

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

gcloud config list

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

Cloud Run पर कंटेनर इमेज डिप्लॉय करने के लिए, यह निर्देश चलाएं:

SERVICE_NAME=thumbnail-service
gcloud run deploy $SERVICE_NAME \
    --image gcr.io/$GOOGLE_CLOUD_PROJECT/thumbnail-service \
    --no-allow-unauthenticated \
    --update-env-vars BUCKET_THUMBNAILS=$BUCKET_THUMBNAILS

--no-allow-unauthenticated फ़्लैग पर ध्यान दें. इससे Cloud Run सेवा, एक इंटरनल सेवा बन जाती है. इसे सिर्फ़ खास सेवा खातों से ट्रिगर किया जा सकेगा.

अगर डिप्लॉयमेंट पूरा हो जाता है, तो आपको यह आउटपुट दिखेगा:

c0f28e7d6de0024.png

अगर आप क्लाउड कंसोल यूज़र इंटरफ़ेस (यूआई) पर जाते हैं, तो आपको यह भी दिखेगा कि सेवा को सही तरीके से डिप्लॉय कर दिया गया है:

9bfe48e3c8b597e5.png

10. Pub/Sub के ज़रिए, Cloud Storage के इवेंट को Cloud Run पर भेजना

सेवा तैयार है. हालांकि, आपको Cloud Storage के इवेंट को, नई बनाई गई Cloud Run सेवा पर भेजना होगा. Cloud Storage, Cloud Pub/Sub के ज़रिए फ़ाइल बनाने के इवेंट भेज सकता है. हालांकि, इसके लिए कुछ चरण पूरे करने होंगे.

कम्यूनिकेशन पाइपलाइन के तौर पर, Pub/Sub विषय बनाएं:

TOPIC_NAME=cloudstorage-cloudrun-topic
gcloud pubsub topics create $TOPIC_NAME

बकेट में फ़ाइलें सेव होने पर, Pub/Sub सूचनाएं बनाएं:

BUCKET_PICTURES=uploaded-pictures-$GOOGLE_CLOUD_PROJECT
gsutil notification create -t $TOPIC_NAME -f json gs://$BUCKET_PICTURES

Pub/Sub सदस्यता के लिए, एक सेवा खाता बनाएं. इसे हम बाद में बनाएंगे:

SERVICE_ACCOUNT=$TOPIC_NAME-sa
gcloud iam service-accounts create $SERVICE_ACCOUNT \
     --display-name "Cloud Run Pub/Sub Invoker"

सेवा खाते को, Cloud Run सेवा को शुरू करने की अनुमति दें:

SERVICE_NAME=thumbnail-service
gcloud run services add-iam-policy-binding $SERVICE_NAME \
   --member=serviceAccount:$SERVICE_ACCOUNT@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
   --role=roles/run.invoker

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

PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format='value(projectNumber)')
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
     --member=serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
     --role=roles/iam.serviceAccountTokenCreator

आईएएम में किए गए बदलावों को लागू होने में कुछ मिनट लग सकते हैं.

आखिर में, सेवा खाते के साथ Pub/Sub सदस्यता बनाएं:

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --format 'value(status.url)')
gcloud pubsub subscriptions create $TOPIC_NAME-subscription --topic $TOPIC_NAME \
   --push-endpoint=$SERVICE_URL \
   --push-auth-service-account=$SERVICE_ACCOUNT@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com

यह देखा जा सकता है कि सदस्यता बन गई है. कंसोल में Pub/Sub पर जाएं. इसके बाद, gcs-events विषय चुनें. सबसे नीचे, आपको सदस्यता दिखनी चाहिए:

e8ab86dccb8d890.png

11. सेवा को टेस्ट करना

यह देखने के लिए कि सेटअप काम कर रहा है या नहीं, uploaded-pictures बकेट में कोई नई इमेज अपलोड करें. इसके बाद, thumbnails बकेट में देखें कि साइज़ बदली गई नई इमेज, उम्मीद के मुताबिक दिख रही हैं या नहीं.

लॉगिंग मैसेज देखने के लिए, लॉग की दोबारा जांच भी की जा सकती है. इससे यह पता चलेगा कि Cloud Run सेवा के अलग-अलग चरण पूरे हो रहे हैं या नहीं:

42c025e2d7d6ca3a.png

12. स्टोरेज में जगह बनाएं (ज़रूरी नहीं)

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

बकेट मिटाएं:

gsutil rb gs://$BUCKET_THUMBNAILS

सेवा मिटाएं:

gcloud run services delete $SERVICE_NAME -q

Pub/Sub विषय मिटाएं:

gcloud pubsub topics delete $TOPIC_NAME

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

gcloud projects delete $GOOGLE_CLOUD_PROJECT

13. बधाई हो!

अब सब कुछ सेट हो गया है:

  • Cloud Storage में एक सूचना बनाई गई है. जब कोई नई इमेज अपलोड की जाती है, तो यह किसी विषय पर Pub/Sub मैसेज भेजती है.
  • ज़रूरी आईएएम बाइंडिंग और खाते तय किए गए हैं. Cloud Functions में यह सब अपने-आप होता है. हालांकि, यहां इसे मैन्युअल तरीके से कॉन्फ़िगर किया गया है.
  • एक सदस्यता बनाई गई है, ताकि हमारी Cloud Run सेवा को Pub/Sub मैसेज मिल सकें.
  • जब भी बकेट में कोई नई इमेज अपलोड की जाती है, तो नई Cloud Run सेवा की मदद से इमेज का साइज़ बदल दिया जाता है.

हमने क्या कवर किया

  • Cloud Run
  • Cloud Storage
  • Cloud Pub/Sub

अगले चरण