इस कोडलैब (कोड बनाना सीखने के लिए ट्यूटोरियल) के बारे में जानकारी
1. परिचय
खास जानकारी
Cloud Run फ़ंक्शन, Google Cloud की सेवा के तौर पर फ़ंक्शन की सुविधा है. यह Cloud Run और Eventarc की मदद से काम करती है. इससे आपको परफ़ॉर्मेंस और स्केलेबिलिटी पर ज़्यादा बेहतर कंट्रोल मिलता है. साथ ही, 90 से ज़्यादा इवेंट सोर्स से फ़ंक्शन के रनटाइम और ट्रिगर पर ज़्यादा कंट्रोल मिलता है.
इस कोडलैब में, एचटीटीपी कॉल का जवाब देने वाले और Pub/Sub मैसेज और Cloud ऑडिट लॉग से ट्रिगर होने वाले Cloud Run फ़ंक्शन बनाने का तरीका बताया गया है.
इस कोडलैब में, फ़ंक्शन डिप्लॉयमेंट के लिए, अपने-आप अपडेट होने वाली बुनियादी इमेज का भी इस्तेमाल किया जाता है. इसके लिए, --base-image
फ़्लैग का इस्तेमाल करके बुनियादी इमेज तय की जाती है. Cloud Run के लिए, बेस इमेज के अपने-आप अपडेट होने की सुविधा की मदद से, Google, बेस इमेज के ऑपरेटिंग सिस्टम और भाषा के रनटाइम कॉम्पोनेंट में अपने-आप सुरक्षा पैच कर सकता है. बेस इमेज को अपडेट करने के लिए, आपको अपनी सेवा को फिर से बनाने या फिर से डिप्लॉय करने की ज़रूरत नहीं है. ज़्यादा जानकारी के लिए, बेस इमेज अपने-आप अपडेट होने की सुविधा देखें
अगर आपको बुनियादी इमेज के अपने-आप अपडेट होने की सुविधा का इस्तेमाल नहीं करना है, तो इस कोडलैब में दिखाए गए उदाहरणों से --base-image
फ़्लैग हटाया जा सकता है.
आपको क्या सीखने को मिलेगा
- Cloud Run फ़ंक्शन की खास जानकारी और बेस इमेज के अपने-आप अपडेट होने की सुविधा का इस्तेमाल करने का तरीका.
- एचटीटीपी कॉल का जवाब देने वाला फ़ंक्शन लिखने का तरीका.
- Pub/Sub मैसेज का जवाब देने वाला फ़ंक्शन लिखने का तरीका.
- Cloud Storage इवेंट के जवाब देने वाला फ़ंक्शन लिखने का तरीका.
- दो बदलावों के बीच ट्रैफ़िक को बांटने का तरीका.
- कम से कम इंस्टेंस के साथ कोल्ड स्टार्ट से छुटकारा पाने का तरीका.
2. सेटअप और ज़रूरी शर्तें
रूट फ़ोल्डर बनाना
सभी उदाहरणों के लिए एक रूट फ़ोल्डर बनाएं.
mkdir crf-codelab cd crf-codelab
एनवायरमेंट वैरिएबल सेट अप करना
ऐसे एनवायरमेंट वैरिएबल सेट करें जिनका इस्तेमाल इस कोडलैब में किया जाएगा/
gcloud config set project <YOUR-PROJECT-ID> REGION=<YOUR_REGION> PROJECT_ID=$(gcloud config get-value project)
एपीआई चालू करें
सभी ज़रूरी सेवाएं चालू करें:
gcloud services enable \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ eventarc.googleapis.com \ run.googleapis.com \ logging.googleapis.com \ pubsub.googleapis.com
3. एचटीटीपी फ़ंक्शन
पहले फ़ंक्शन के लिए, एक ऐसा Node.js फ़ंक्शन बनाएं जिसकी पुष्टि हो चुकी हो और जो एचटीटीपी अनुरोधों का जवाब दे. आइए, 10 मिनट के टाइम आउट का इस्तेमाल करके यह भी देखें कि किसी फ़ंक्शन के पास एचटीटीपी अनुरोधों का जवाब देने के लिए ज़्यादा समय कैसे हो सकता है.
बनाएं
ऐप्लिकेशन के लिए फ़ोल्डर बनाएं और उस फ़ोल्डर पर जाएं:
mkdir hello-http cd hello-http
एचटीटीपी अनुरोधों का जवाब देने वाली index.js
फ़ाइल बनाएं:
const functions = require('@google-cloud/functions-framework'); functions.http('helloWorld', (req, res) => { res.status(200).send('HTTP with Node.js in Cloud Run functions!'); });
डिपेंडेंसी की जानकारी देने के लिए, package.json
फ़ाइल बनाएं:
{ "name": "nodejs-run-functions-codelab", "version": "0.0.1", "main": "index.js", "dependencies": { "@google-cloud/functions-framework": "^2.0.0" } }
डिप्लॉय करना
फ़ंक्शन को डिप्लॉय करें:
gcloud run deploy nodejs-run-function \ --source . \ --function helloWorld \ --base-image nodejs22 \ --region $REGION \ --timeout 600 \ --no-allow-unauthenticated
यह कमांड, आपके फ़ंक्शन के सोर्स कोड को प्रोडक्शन के लिए तैयार कंटेनर इमेज में बदलने के लिए, बिल्डपैक का इस्तेमाल करता है.
कृपया यहां बताई गई चीज़ों पर ध्यान दें:
--source
फ़्लैग का इस्तेमाल, Cloud Run को फ़ंक्शन को रन की जा सकने वाली कंटेनर सेवा में बनाने के लिए किया जाता है--function
फ़्लैग (नया) का इस्तेमाल, नई सेवा के एंट्रीपॉइंट को उस फ़ंक्शन सिग्नेचर के तौर पर सेट करने के लिए किया जाता है जिसे आपको शुरू करना है--base-image
फ़्लैग (नया) आपके फ़ंक्शन के लिए, बेस इमेज एनवायरमेंट की जानकारी देता है. जैसे,nodejs22
,python312
,go123
,java21
,dotnet8
,ruby33
याphp83
. बेस इमेज और हर इमेज में शामिल पैकेज के बारे में ज़्यादा जानकारी के लिए, रनटाइम की बेस इमेज देखें.- (ज़रूरी नहीं)
--timeout
फ़्लैग की मदद से, फ़ंक्शन को एचटीटीपी अनुरोधों का जवाब देने के लिए ज़्यादा समय दिया जा सकता है. इस उदाहरण में, 10 मिनट के रिस्पॉन्स टाइम को दिखाने के लिए 600 सेकंड का इस्तेमाल किया गया है. - (ज़रूरी नहीं)
--no-allow-unauthenticated
, ताकि आपके फ़ंक्शन को सार्वजनिक तौर पर इस्तेमाल न किया जा सके
जांच करना
इन निर्देशों की मदद से फ़ंक्शन की जांच करें:
# get the Service URL SERVICE_URL="$(gcloud run services describe nodejs-run-function --region $REGION --format 'value(status.url)')" # invoke the service curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL
आपको जवाब के तौर पर HTTP with Node.js in Cloud Run functions!
मैसेज दिखेगा.
4. Pub/Sub फ़ंक्शन
दूसरे फ़ंक्शन के लिए, किसी खास विषय पर पब्लिश किए गए Pub/Sub मैसेज से ट्रिगर होने वाला Python फ़ंक्शन बनाएं.
Pub/Sub के पुष्टि करने वाले टोकन सेट अप करना
अगर आपने 8 अप्रैल, 2021 को या उससे पहले Pub/Sub सेवा खाता चालू किया है, तो Pub/Sub सेवा खाते को iam.serviceAccountTokenCreator
भूमिका दें:
PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)') gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role roles/iam.serviceAccountTokenCreator
बनाएं
सैंपल के लिए इस्तेमाल करने के लिए, Pub/Sub का कोई विषय बनाएं:
TOPIC=cloud-run-functions-pubsub-topic gcloud pubsub topics create $TOPIC
ऐप्लिकेशन के लिए फ़ोल्डर बनाएं और उस फ़ोल्डर पर जाएं:
mkdir ../hello-pubsub cd ../hello-pubsub
ऐसी main.py
फ़ाइल बनाएं जो CloudEvent आईडी वाले मैसेज को लॉग करती हो:
import functions_framework @functions_framework.cloud_event def hello_pubsub(cloud_event): print('Pub/Sub with Python in Cloud Run functions! Id: ' + cloud_event['id'])
डिपेंडेंसी की जानकारी देने के लिए, इस कॉन्टेंट के साथ requirements.txt
फ़ाइल बनाएं:
functions-framework==3.*
डिप्लॉय करना
फ़ंक्शन को डिप्लॉय करें:
gcloud run deploy python-pubsub-function \ --source . \ --function hello_pubsub \ --base-image python313 \ --region $REGION \ --no-allow-unauthenticated
सेवा खाते की पहचान के लिए इस्तेमाल किया जाने वाला प्रोजेक्ट नंबर वापस पाएं.
PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)')
ट्रिगर बनाना
gcloud eventarc triggers create python-pubsub-function-trigger \ --location=$REGION \ --destination-run-service=python-pubsub-function \ --destination-run-region=$REGION \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=projects/$PROJECT_ID/topics/$TOPIC \ --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
जांच करना
विषय पर मैसेज भेजकर, इस सुविधा को आज़माएं:
gcloud pubsub topics publish $TOPIC --message="Hello World"
आपको लॉग में, मिला CloudEvent दिखेगा:
gcloud run services logs read python-pubsub-function --region $REGION --limit=10
5. Cloud Storage फ़ंक्शन
अगले फ़ंक्शन के लिए, एक Node.js फ़ंक्शन बनाएं, जो Cloud Storage बकेट से आने वाले इवेंट पर प्रतिक्रिया देता हो.
सेट अप करें
Cloud Storage फ़ंक्शन का इस्तेमाल करने के लिए, Cloud Storage सेवा खाते को pubsub.publisher
आईएएम भूमिका दें:
SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER) gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT \ --role roles/pubsub.publisher
बनाएं
ऐप्लिकेशन के लिए फ़ोल्डर बनाएं और उस फ़ोल्डर पर जाएं:
mkdir ../hello-storage cd ../hello-storage
ऐसी index.js
फ़ाइल बनाएं जो सिर्फ़ Cloud Storage इवेंट के जवाब देती हो:
const functions = require('@google-cloud/functions-framework'); functions.cloudEvent('helloStorage', (cloudevent) => { console.log('Cloud Storage event with Node.js in Cloud Run functions!'); console.log(cloudevent); });
डिपेंडेंसी की जानकारी देने के लिए, package.json
फ़ाइल बनाएं:
{ "name": "nodejs-crf-cloud-storage", "version": "0.0.1", "main": "index.js", "dependencies": { "@google-cloud/functions-framework": "^2.0.0" } }
डिप्लॉय करना
सबसे पहले, Cloud Storage बकेट बनाएं या किसी मौजूदा बकेट का इस्तेमाल करें:
export BUCKET_NAME="gcf-storage-$PROJECT_ID" export BUCKET="gs://gcf-storage-$PROJECT_ID" gsutil mb -l $REGION $BUCKET
फ़ंक्शन को डिप्लॉय करें:
gcloud run deploy nodejs-crf-cloud-storage \ --source . \ --base-image nodejs22 \ --function helloStorage \ --region $REGION \ --no-allow-unauthenticated
फ़ंक्शन डिप्लॉय होने के बाद, उसे Cloud Console के Cloud Run सेक्शन में देखा जा सकता है.
अब Eventarc ट्रिगर बनाएं.
BUCKET_REGION=$REGION gcloud eventarc triggers create nodejs-crf-cloud-storage-trigger \ --location=$BUCKET_REGION \ --destination-run-service=nodejs-crf-cloud-storage \ --destination-run-region=$REGION \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=$BUCKET_NAME" \ --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
जांच करना
बकेट में कोई फ़ाइल अपलोड करके, फ़ंक्शन की जांच करें:
echo "Hello World" > random.txt gsutil cp random.txt $BUCKET/random.txt
आपको लॉग में, मिला CloudEvent दिखेगा:
gcloud run services logs read nodejs-crf-cloud-storage --region $REGION --limit=10
6. ट्रैफ़िक का बंटवारा
Cloud Run फ़ंक्शन, आपके फ़ंक्शन के कई रिविज़न के साथ काम करता है. साथ ही, ट्रैफ़िक को अलग-अलग रिविज़न के बीच बांटता है और आपके फ़ंक्शन को पिछले वर्शन पर वापस ले जाता है.
इस चरण में, आपको किसी फ़ंक्शन के दो रिविज़न डिप्लॉय करने होंगे. इसके बाद, ट्रैफ़िक को 50-50 के हिसाब से बांटना होगा.
बनाएं
ऐप्लिकेशन के लिए फ़ोल्डर बनाएं और उस फ़ोल्डर पर जाएं:
mkdir ../traffic-splitting cd ../traffic-splitting
Python फ़ंक्शन के साथ main.py
फ़ाइल बनाएं, जो रंग वाले एनवायरमेंट वैरिएबल को पढ़ती है और उस बैकग्राउंड रंग में Hello World
के साथ जवाब देती है:
import os color = os.environ.get('COLOR') def hello_world(request): return f'<body style="background-color:{color}"><h1>Hello World!</h1></body>'
डिपेंडेंसी की जानकारी देने के लिए, इस कॉन्टेंट के साथ requirements.txt
फ़ाइल बनाएं:
functions-framework==3.*
डिप्लॉय करना
नारंगी बैकग्राउंड वाले फ़ंक्शन का पहला रिविज़न डिप्लॉय करें:
COLOR=orange gcloud run deploy hello-world-colors \ --source . \ --base-image python313 \ --function hello_world \ --region $REGION \ --allow-unauthenticated \ --update-env-vars COLOR=$COLOR
इस समय, अगर आपने अपने ब्राउज़र में एचटीटीपी ट्रिगर (डिप्लॉयमेंट के ऊपर दिए गए निर्देश का यूआरआई आउटपुट) देखकर फ़ंक्शन की जांच की, तो आपको नारंगी बैकग्राउंड वाला Hello World
दिखेगा:
पीले बैकग्राउंड के साथ दूसरा बदलाव डिप्लॉय करें:
COLOR=yellow gcloud run deploy hello-world-colors \ --source . \ --base-image python313 \ --function hello_world \ --region $REGION \ --allow-unauthenticated \ --update-env-vars COLOR=$COLOR
यह बदलाव हाल ही में किया गया है. इसलिए, फ़ंक्शन की जांच करने पर, आपको पीले बैकग्राउंड वाला Hello World
दिखेगा:
ट्रैफ़िक को 50-50 बांटना
ऑरेंज और पीले रंग के रिविज़न के बीच ट्रैफ़िक को बांटने के लिए, आपको Cloud Run सेवाओं के रिविज़न आईडी ढूंढने होंगे. बदलाव के आईडी देखने के लिए यह कमांड इस्तेमाल करें:
gcloud run revisions list --service hello-world-colors \ --region $REGION --format 'value(REVISION)'
आउटपुट कुछ ऐसा दिखना चाहिए:
hello-world-colors-00001-man hello-world-colors-00002-wok
अब, इन दोनों रिविज़न के बीच ट्रैफ़िक को इस तरह बांटें (अपने रिविज़न के नाम के हिसाब से X-XXX
को अपडेट करें):
gcloud run services update-traffic hello-world-colors \ --region $REGION \ --to-revisions hello-world-colors-0000X-XXX=50,hello-world-colors-0000X-XXX=50
जांच करना
फ़ंक्शन के सार्वजनिक यूआरएल पर जाकर, उसकी जांच करें. आधे समय आपको नारंगी रंग में बदलाव दिखेगा और आधे समय पीले रंग में:
ज़्यादा जानकारी के लिए, रोलबैक, धीरे-धीरे रोल आउट करना, और ट्रैफ़िक माइग्रेट करना देखें.
7. कम से कम इंस्टेंस
Cloud Run फ़ंक्शन में, कम से कम फ़ंक्शन इंस्टेंस तय किए जा सकते हैं, ताकि उन्हें अनुरोधों को पूरा करने के लिए तैयार रखा जा सके. इससे कोल्ड स्टार्ट की संख्या को कम करने में मदद मिलती है.
इस चरण में, आपको धीमी शुरुआत वाले फ़ंक्शन को डिप्लॉय करना होगा. आपको कोल्ड स्टार्ट की समस्या दिखेगी. इसके बाद, कोल्ड स्टार्ट की समस्या से बचने के लिए, फ़ंक्शन को 1 पर सेट की गई इंस्टेंस वैल्यू के साथ डिप्लॉय किया जाएगा.
बनाएं
ऐप्लिकेशन के लिए फ़ोल्डर बनाएं और उस पर जाएं:
mkdir ../min-instances cd ../min-instances
main.go
फ़ाइल बनाएं. इस Go सेवा में एक init
फ़ंक्शन है, जो लंबे समय तक चलने वाले शुरू होने की प्रक्रिया को सिम्युलेट करने के लिए 10 सेकंड के लिए रुकता है. इसमें एक HelloWorld
फ़ंक्शन भी होता है, जो एचटीटीपी कॉल का जवाब देता है:
package p import ( "fmt" "net/http" "time" ) func init() { time.Sleep(10 * time.Second) } func HelloWorld(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Slow HTTP Go in Cloud Run functions!") }
डिप्लॉय करना
फ़ंक्शन के पहले रिविज़न को डिफ़ॉल्ट तौर पर, इंस्टेंस की सबसे कम वैल्यू शून्य के साथ डिप्लॉय करें:
gcloud run deploy go-slow-function \ --source . \ --base-image go123 \ --function HelloWorld \ --region $REGION \ --no-allow-unauthenticated
इस निर्देश की मदद से फ़ंक्शन की जांच करें:
# get the Service URL SERVICE_URL="$(gcloud run services describe go-slow-function --region $REGION --format 'value(status.url)')" # invoke the service curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL
आपको पहले कॉल में 10 सेकंड का इंतज़ार (कोल्ड स्टार्ट) दिखेगा. इसके बाद, आपको मैसेज दिखेगा. इसके बाद आने वाले कॉल तुरंत आ जाएंगे.
कम से कम इंस्टेंस सेट करना
पहले अनुरोध पर कोल्ड स्टार्ट की समस्या से बचने के लिए, --min-instances
फ़्लैग को 1 पर सेट करके फ़ंक्शन को फिर से डिप्लॉय करें. इसके लिए, यह तरीका अपनाएं:
gcloud run deploy go-slow-function \ --source . \ --base-image go123 \ --function HelloWorld \ --region $REGION \ --no-allow-unauthenticated \ --min-instances 1
जांच करना
फ़ंक्शन को फिर से टेस्ट करें:
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL
आपको पहले अनुरोध में अब 10 सेकंड की देरी नहीं दिखनी चाहिए. कम से कम इंस्टेंस की मदद से, पहली बार कॉल करने पर कोल्ड स्टार्ट की समस्या खत्म हो गई है.
ज़्यादा जानकारी के लिए, कम से कम इंस्टेंस का इस्तेमाल करना देखें.
8. बधाई हो!
कोडलैब पूरा करने के लिए बधाई!
हमने क्या-क्या शामिल किया है
- Cloud Run फ़ंक्शन की खास जानकारी और बेस इमेज के अपने-आप अपडेट होने की सुविधा का इस्तेमाल करने का तरीका.
- एचटीटीपी कॉल का जवाब देने वाला फ़ंक्शन लिखने का तरीका.
- Pub/Sub मैसेज का जवाब देने वाला फ़ंक्शन लिखने का तरीका.
- Cloud Storage इवेंट के जवाब देने वाला फ़ंक्शन लिखने का तरीका.
- दो बदलावों के बीच ट्रैफ़िक को बांटने का तरीका.
- कम से कम इंस्टेंस के साथ कोल्ड स्टार्ट से छुटकारा पाने का तरीका.