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

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

इस कोडलैब (कोड बनाना सीखने के लिए ट्यूटोरियल) के बारे में जानकारी

subjectपिछली बार नव॰ 14, 2021 को अपडेट किया गया
account_circleGuillaume Laforge, Mete Atamel ने लिखा

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

Cloud Shell शुरू करना

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

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

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

इस वर्चुअल मशीन में ऐसे सभी डेवलपमेंट टूल मौजूद हैं जिनकी आपको ज़रूरत पड़ेगी. यह पांच जीबी की स्थायी होम डायरेक्ट्री उपलब्ध कराता है और 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. कोड एक्सप्लोर करें

कोड को एक्सप्लोर करने के लिए, पहले से मौजूद टेक्स्ट एडिटर का इस्तेमाल करें. इसके लिए, क्लाउड शेल विंडो के सबसे ऊपर मौजूद 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. एक्सप्रेस एक JavaScript / नोड वेब फ़्रेमवर्क है. बॉडी-पार्सर मॉड्यूल का इस्तेमाल आने वाले अनुरोधों को आसानी से पार्स करने के लिए किया जाता है. 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" ]

बेस इमेज नोड 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 पेलोड होते हैं. इन्हें हमारे ऐप्लिकेशन पर पोस्ट अनुरोध के ज़रिए भेजा जाता है.

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 वेब कंसोल में स्टैकड्राइवर लॉगिंग इंटरफ़ेस से ही लॉग देखे जा सकते हैं.

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 एट्रिब्यूट में क्या है. यह सिर्फ़ एक स्ट्रिंग है, लेकिन यह असल पेलोड को बेस 64 में कोड में बदल देती है. यही वजह है कि ऊपर दिया गया हमारा कोड, इस एट्रिब्यूट के बेस 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}`);

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

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}`);
});

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

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

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

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

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 Run में Cloud Storage इवेंट का इस्तेमाल करना

सेवा तैयार है. हालांकि, आपको अब भी 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

अगर आपने 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

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

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

  • Cloud Run
  • Cloud Storage
  • Cloud Pub/Sub

अगले चरण