1. खास जानकारी
इस कोड लैब में, एक नई Cloud Run सेवा, कोलाज सेवा बनाई जाती है, जो समय-समय पर Cloud शेड्यूलर से ट्रिगर होगी. यह सेवा, अपलोड की गई नई तस्वीरों को फ़ेच करती है और उन तस्वीरों का एक कोलाज बनाती है: यह Cloud Firestore में हाल ही की तस्वीरों की सूची ढूंढती है. इसके बाद, यह Cloud Storage से फ़ोटो की असल फ़ाइलें डाउनलोड करती है.
आपको क्या सीखने को मिलेगा
- Cloud Run
- Cloud Scheduler
- Cloud Storage
- Cloud Firestore
2. सेटअप और ज़रूरी शर्तें
अपने हिसाब से एनवायरमेंट सेटअप करना
- Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से Gmail या Google Workspace खाता नहीं है, तो आपको नया खाता बनाना होगा.
- प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों का डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करता. साथ ही, आप इसे किसी भी समय अपडेट कर सकते हैं.
- प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होना चाहिए. साथ ही, आईडी को बदला नहीं जा सकता. सेट अप के बाद इसे बदला नहीं जा सकता. Cloud Console, एक यूनीक स्ट्रिंग अपने-आप जनरेट करता है; आम तौर पर, आपको उसके होने की कोई परवाह नहीं होती. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना पड़ता है और आम तौर पर इसकी पहचान
PROJECT_ID
के रूप में की जाती है. इसलिए, अगर आपको यह पसंद नहीं आता है, तो कोई भी कोड जनरेट करें. इसके अलावा, खुद का भी कोड बनाकर देखा जा सकता है कि वह उपलब्ध है या नहीं. फिर यह "फ़्रोज़न" होता है प्रोजेक्ट बनने के बाद. - तीसरी वैल्यू, प्रोजेक्ट नंबर है, जिसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
- इसके बाद, आपको क्लाउड संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग की सुविधा चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. संसाधनों को बंद करने के लिए, इस ट्यूटोरियल के अलावा किसी और तरीके से बिलिंग न करें. इसके लिए, "साफ़-सफ़ाई" का इस्तेमाल करें कोडलैब के आखिर में दिए गए निर्देश देखें. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले प्रोग्राम में हिस्सा ले सकते हैं.
Cloud Shell शुरू करना
Google Cloud को आपके लैपटॉप से, कहीं से भी ऑपरेट किया जा सकता है. हालांकि, इस कोडलैब में Google Cloud Shell का इस्तेमाल किया जा रहा है. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.
GCP कंसोल में, सबसे ऊपर दाईं ओर मौजूद टूलबार पर क्लाउड शेल आइकॉन पर क्लिक करें:
प्रावधान करने और एनवायरमेंट से कनेक्ट होने में कुछ ही समय लगेगा. उसके पूरा हो जाने पर, आपको कुछ ऐसा दिखाई देगा:
इस वर्चुअल मशीन में ऐसे सभी डेवलपमेंट टूल मौजूद हैं जिनकी आपको ज़रूरत पड़ेगी. यह पांच जीबी की स्थायी होम डायरेक्ट्री उपलब्ध कराता है और Google Cloud पर चलता है. यह नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रक्रिया को बेहतर बनाता है. इस लैब में आपका सारा काम बस एक ब्राउज़र से किया जा सकता है.
3. एपीआई चालू करें
Cloud Run सेवा को नियमित अंतराल पर ट्रिगर करने के लिए, आपको Cloud शेड्यूलर की ज़रूरत होगी. पक्का करें कि यह चालू हो:
gcloud services enable cloudscheduler.googleapis.com
आपको कार्रवाई सफलतापूर्वक खत्म होने के लिए दिखाई देना चाहिए:
Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.
4. कोड का क्लोन बनाएं
अगर आपने पिछले कोड लैब में, पहले से कोई काम नहीं किया है, तो कोड का क्लोन बनाएं:
git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop
इसके बाद आप सेवा वाली डायरेक्ट्री पर जा सकते हैं:
cd serverless-photosharing-workshop/services/collage/nodejs
आपके पास सेवा के लिए यह फ़ाइल लेआउट होगा:
services | ├── collage | ├── nodejs | ├── Dockerfile ├── index.js ├── package.json
फ़ोल्डर के अंदर, आपकी तीन फ़ाइलें होंगी:
index.js
में Node.js कोड शामिल होता हैpackage.json
, लाइब्रेरी डिपेंडेंसी के बारे में बताता हैDockerfile
कंटेनर इमेज के बारे में बताता है
5. कोड एक्सप्लोर करें
डिपेंडेंसी
package.json
फ़ाइल, ज़रूरी लाइब्रेरी डिपेंडेंसी के बारे में बताती है:
{
"name": "collage_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 की लाइब्रेरी का इस्तेमाल करते हैं. इमेज का जो मेटाडेटा हमने पहले सेव किया था उसे फ़ेच करने के लिए, हम Cloud 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/*
WORKDIR /picadaily/services/collage
COPY package*.json ./
RUN npm install --production
COPY . .
CMD [ "npm", "start" ]
हम हल्के नोड 14 की बेस इमेज का इस्तेमाल कर रहे हैं. हम Imagemagick लाइब्रेरी को इंस्टॉल कर रहे हैं. इसके बाद, हम अपने कोड के लिए ज़रूरी NPM मॉड्यूल इंस्टॉल कर रहे हैं. साथ ही, हम npm स्टार्ट के साथ अपना नोड कोड चलाते हैं.
index.js
आइए, हमारे 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');
हमें अपने प्रोग्राम को चलाने के लिए अलग-अलग डिपेंडेंसी की ज़रूरत होती है: एक्सप्रेस वह नोड वेब फ़्रेमवर्क है जिसका हम इस्तेमाल करेंगे, ImageMagick से इमेज में बदलाव करने के लिए लाइब्रेरी मिलेगी, Bluebird एक लाइब्रेरी है, जो JavaScript वादों को मैनेज करने के लिए, पाथ का इस्तेमाल फ़ाइलों और डायरेक्ट्री पाथ से निपटने के लिए किया जाता है. इसके बाद, Google Cloud Storage (हमारी इमेज के बकेट) और Cloud Firestore डेटास्टोर के साथ काम करने के लिए स्टोरेज और Firestore का इस्तेमाल किया जाता है.
const app = express();
app.get('/', async (req, res) => {
try {
console.log('Collage request');
/* ... */
} catch (err) {
console.log(`Error: creating the collage: ${err}`);
console.error(err);
res.status(500).send(err);
}
});
ऊपर, हमारे नोड हैंडलर का स्ट्रक्चर तैयार है: हमारा ऐप्लिकेशन, एचटीटीपी जीईटी अनुरोधों का जवाब देता है. अगर कुछ गड़बड़ी हो जाती है, तो हम कुछ गड़बड़ियों को ठीक कर रहे हैं. आइए अब देखते हैं कि इस संरचना के अंदर क्या है.
const thumbnailFiles = [];
const pictureStore = new Firestore().collection('pictures');
const snapshot = await pictureStore
.where('thumbnail', '==', true)
.orderBy('created', 'desc')
.limit(4).get();
if (snapshot.empty) {
console.log('Empty collection, no collage to make');
res.status(204).send("No collage created.");
} else {
/* ... */
}
हमारी कोलाज सेवा के लिए कम-से-कम चार चित्र आवश्यक हैं (जिनके थंबनेल जनरेट किए गए हैं), इसलिए पहले 4 चित्र अपलोड करना पक्का करें.
हमें उपयोगकर्ताओं की अपलोड की गई चार नई तस्वीरें, Cloud Firestore में सेव किए गए मेटाडेटा से मिली हैं. हम जांच करते हैं कि मिलने वाला कलेक्शन खाली है या नहीं. इसके बाद, हम अपने कोड की अन्य ब्रांच में आगे बढ़ते हैं.
फ़ाइल नामों की सूची इकट्ठा करें:
snapshot.forEach(doc => {
thumbnailFiles.push(doc.id);
});
console.log(`Picture file names: ${JSON.stringify(thumbnailFiles)}`);
हम उनमें से हर फ़ाइल को थंबनेल बकेट से डाउनलोड करेंगे, जिसका नाम एक ऐसे एनवायरमेंट वैरिएबल से आ रहा है जिसे हमने डिप्लॉयमेंट के समय सेट किया था:
const thumbBucket = storage.bucket(process.env.BUCKET_THUMBNAILS);
await Promise.all(thumbnailFiles.map(async fileName => {
const filePath = path.resolve('/tmp', fileName);
await thumbBucket.file(fileName).download({
destination: filePath
});
}));
console.log('Downloaded all thumbnails');
सबसे नए थंबनेल अपलोड होने के बाद, हम ImageMagick लाइब्रेरी का इस्तेमाल करके, उन थंबनेल पिक्चर की 4x4 ग्रिड बनाएंगे. हम Bluebird लाइब्रेरी और इसके प्रॉमिस को लागू करने के तरीके का इस्तेमाल करके, कॉलबैक-ड्रिवन कोड को async
/ await
फ़्रेंडली कोड में बदलते हैं. इसके बाद, हम इमेज कोलाज बनाने के प्रॉमिस का इंतज़ार करते हैं:
const collagePath = path.resolve('/tmp', 'collage.png');
const thumbnailPaths = thumbnailFiles.map(f => path.resolve('/tmp', f));
const convert = Promise.promisify(im.convert);
await convert([
'(', ...thumbnailPaths.slice(0, 2), '+append', ')',
'(', ...thumbnailPaths.slice(2), '+append', ')',
'-size', '400x400', 'xc:none', '-background', 'none', '-append',
collagePath]);
console.log("Created local collage picture");
कोलाज की तस्वीर, कुछ समय के लिए उपलब्ध फ़ोल्डर में स्थानीय तौर पर सेव की गई है. इसलिए, अब हमें इसे Cloud Storage में अपलोड करना होगा और एक सही जवाब (स्टेटस कोड 2xx) देना होगा:
await thumbBucket.upload(collagePath);
console.log("Uploaded collage to Cloud Storage bucket ${process.env.BUCKET_THUMBNAILS}");
res.status(204).send("Collage created.");
अब समय आ गया है कि हमारी नोड स्क्रिप्ट को आने वाले अनुरोधों पर ध्यान दिया जाए:
const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
console.log(`Started collage service on port ${PORT}`);
});
हमारी सोर्स फ़ाइल के आखिर में, हमें निर्देश दिए गए हैं कि एक्सप्रेस सुविधा से हमारा वेब ऐप्लिकेशन 8080 डिफ़ॉल्ट पोर्ट पर शुरू किया जाए.
6. स्थानीय तौर पर टेस्ट करें
क्लाउड पर डिप्लॉय करने से पहले, कोड को स्थानीय तौर पर टेस्ट करके पक्का कर लें कि वह काम कर रहा है.
collage/nodejs
फ़ोल्डर में, एनपीएम डिपेंडेंसी इंस्टॉल करें और सर्वर चालू करें:
npm install; npm start
अगर सब कुछ ठीक हो गया था, तो इसे पोर्ट 8080 पर सर्वर शुरू करना चाहिए:
Started collage service on port 8080
बाहर निकलने के लिए, CTRL-C
का इस्तेमाल करें.
7. क्लाउड रन में बनाएं और डिप्लॉय करें
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 Build का इस्तेमाल करके, कंटेनर की इमेज बनाने और पब्लिश करने के बजाय, Google Cloud Buildpack का इस्तेमाल करके, कंटेनर की इमेज बनाने के लिए Cloud Run का इस्तेमाल करें.
कंटेनर इमेज बनाने के लिए, यहां दिया गया कमांड चलाएं:
BUCKET_THUMBNAILS=thumbnails-$GOOGLE_CLOUD_PROJECT SERVICE_NAME=collage-service gcloud run deploy $SERVICE_NAME \ --source . \ --no-allow-unauthenticated \ --update-env-vars BUCKET_THUMBNAILS=$BUCKET_THUMBNAILS
–-source
फ़्लैग को नोट करें. यह Cloud Run में सोर्स के हिसाब से डिप्लॉयमेंट की सुविधा है. अगर सोर्स कोड डायरेक्ट्री में Dockerfile
मौजूद है, तो अपलोड किया गया सोर्स कोड उसी Dockerfile
का इस्तेमाल करके बनाया जाता है. अगर सोर्स कोड डायरेक्ट्री में कोई Dockerfile
मौजूद नहीं है, तो Google Cloud Buildpacks, आपकी चुनी गई भाषा का अपने-आप पता लगाता है और कोड की डिपेंडेंसी को फ़ेच करके, प्रोडक्शन के लिए तैयार कंटेनर इमेज बनाता है. इसके लिए, Google की मैनेज की जाने वाली सुरक्षित बेस इमेज का इस्तेमाल किया जाता है. यह Cloud Run को फ़्लैग करता है, ताकि Google Cloud Buildpacks का इस्तेमाल करके, Dockerfile
में बताई गई कंटेनर इमेज बनाई जा सके.
ध्यान रखें कि सोर्स के हिसाब से डिप्लॉयमेंट में, बनाए गए कंटेनर को स्टोर करने के लिए Artifact Registry का इस्तेमाल होता है. Artifact Registry, Google Container Registry का आधुनिक वर्शन है. अगर प्रोजेक्ट में यह एपीआई पहले से चालू नहीं है, तो सीएलआई चालू करने का अनुरोध करेगा. साथ ही, जिस इलाके में आपको डिप्लॉय कर रहा है वहां cloud-run-source-deploy
नाम से एक रिपॉज़िटरी बनाएगा.
--no-allow-unauthenticated
फ़्लैग, Cloud Run सेवा को अंदरूनी सेवा बनाता है. यह सेवा कुछ खास सेवा खातों से ही ट्रिगर होगी.
8. क्लाउड शेड्यूलर सेट अप करें
Cloud Run सेवा तैयार है और उसे डिप्लॉय किया जा चुका है. इसलिए, हर मिनट इस सेवा को शुरू करने के लिए एक नियमित शेड्यूल बनाएं.
सेवा खाता बनाएं:
SERVICE_ACCOUNT=collage-scheduler-sa gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name "Collage Scheduler Service Account"
Cloud Run सेवा शुरू करने के लिए, सेवा खाते को अनुमति दें:
gcloud run services add-iam-policy-binding $SERVICE_NAME \ --member=serviceAccount:$SERVICE_ACCOUNT@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \ --role=roles/run.invoker
हर एक मिनट में काम करने के लिए, क्लाउड शेड्यूलर जॉब बनाएं:
SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --format 'value(status.url)') gcloud scheduler jobs create http $SERVICE_NAME-job --schedule "* * * * *" \ --http-method=GET \ --location=europe-west1 \ --uri=$SERVICE_URL \ --oidc-service-account-email=$SERVICE_ACCOUNT@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \ --oidc-token-audience=$SERVICE_URL
Cloud Console के Cloud शेड्यूलर सेक्शन में जाकर देखा जा सकता है कि वह सेट अप है और Cloud Run सेवा यूआरएल की ओर इशारा करता है:
9. सेवा की जांच करें
यह जांचने के लिए कि सेटअप काम कर रहा है या नहीं, कोलाज इमेज (जिसे collage.png
कहा जाता है) के लिए thumbnails
बकेट में देखें. इसके अलावा, सेवा के लॉग भी देखे जा सकते हैं:
10. स्टोरेज खाली करें (ज़रूरी नहीं)
अगर आपको सीरीज़ में मौजूद अन्य लैब का इस्तेमाल जारी नहीं रखना है, तो संसाधनों को इकट्ठा करके खर्च बचाया जा सकता है और क्लाउड पर अच्छा नागरिक बनाया जा सकता है. यहां बताए गए तरीके से, अलग-अलग संसाधनों को खाली किया जा सकता है.
सेवा को मिटाएं:
gcloud run services delete $SERVICE_NAME -q
क्लाउड शेड्यूलर जॉब मिटाएं:
gcloud scheduler jobs delete $SERVICE_NAME-job -q
इसके अलावा, पूरा प्रोजेक्ट मिटाया जा सकता है:
gcloud projects delete $GOOGLE_CLOUD_PROJECT
11. बधाई हो!
बधाई हो! आपने शेड्यूल की गई सेवा बनाई है: Cloud शेड्यूलर की मदद से, यह Pub/Sub विषय पर हर मिनट मैसेज भेजता है. इसलिए, Cloud Run कोलाज सेवा शुरू हो जाती है. साथ ही, यह नतीजा पाने के लिए तस्वीरों को साथ में जोड़ सकती है.
इसमें हमने इन विषयों के बारे में बताया
- Cloud Run
- Cloud Scheduler
- Cloud Storage
- Cloud Firestore