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.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. एपीआई चालू करें

इस लैब में, आपको कंटेनर इमेज बनाने के लिए 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 मॉड्यूल इंस्टॉल किए जाते हैं. इसके बाद, 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 मैसेज को एचटीटीपी पोस्ट अनुरोधों के ज़रिए भेजा जाता है. ये अनुरोध, इस तरह के 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`);

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

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

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

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

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

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

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

npm install; npm start

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

Started thumbnail generator on port 8080

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

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

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

कंटेनर इमेज बनाने के लिए, 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

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

9bfe48e3c8b597e5.png

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

सेवा तैयार है, लेकिन आपको अब भी नई बनाई गई Cloud Run सेवा के लिए Cloud Storage इवेंट बनाने होंगे. 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

अगर आपने Pub/Sub सेवा खाते को 8 अप्रैल, 2021 को या उससे पहले चालू किया था, तो 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

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

आखिर में, सेवा खाते का इस्तेमाल करके 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

अगले चरण