Cloud Run फ़ंक्शन का इस्तेमाल शुरू करना

1. परिचय

खास जानकारी

Cloud Run फ़ंक्शन, Google Cloud की Functions-as-a-Service सुविधा है. यह Cloud Run और Eventarc पर काम करती है. इससे आपको परफ़ॉर्मेंस और स्केलेबिलिटी पर ज़्यादा बेहतर कंट्रोल मिलता है. साथ ही, 90 से ज़्यादा इवेंट सोर्स से फ़ंक्शन के रनटाइम और ट्रिगर पर ज़्यादा कंट्रोल मिलता है.

इस कोडलैब में, आपको एचटीटीपी कॉल का जवाब देने वाले Cloud Run फ़ंक्शन बनाने का तरीका बताया जाएगा. साथ ही, Pub/Sub मैसेज और Cloud Audit Logs से ट्रिगर होने वाले फ़ंक्शन बनाने का तरीका भी बताया जाएगा.

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

पहले फ़ंक्शन के लिए, आइए एक authenticated 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

यह कमांड, buildpacks का इस्तेमाल करके, आपके फ़ंक्शन के सोर्स कोड को प्रोडक्शन के लिए तैयार कंटेनर इमेज में बदलती है.

कृपया इन बातों का ध्यान रखें:

  • --source फ़्लैग का इस्तेमाल, Cloud Run को यह बताने के लिए किया जाता है कि फ़ंक्शन को एक ऐसे कंटेनर में बनाया जाए जिसे चलाया जा सके
  • --function फ़्लैग (नया) का इस्तेमाल, नई सेवा के एंट्रीपॉइंट को सेट करने के लिए किया जाता है. इससे, फ़ंक्शन के उस सिग्नेचर को सेट किया जाता है जिसे आपको कॉल करना है
  • --base-image फ़्लैग (नया) आपके फ़ंक्शन के लिए, बेस इमेज एनवायरमेंट तय करता है. जैसे, nodejs22, python312, go123, java21, dotnet8, ruby33 या php83. बेस इमेज और हर इमेज में शामिल पैकेज के बारे में ज़्यादा जानने के लिए, Runtimes की बेस इमेज देखें.
  • (ज़रूरी नहीं) --timeout फ़्लैग की मदद से, फ़ंक्शन को एचटीटीपी अनुरोधों का जवाब देने के लिए ज़्यादा समय मिलता है. इस उदाहरण में, 600 सेकंड का इस्तेमाल करके, जवाब देने में लगने वाले 10 मिनट के समय को दिखाया गया है.
  • (ज़रूरी नहीं) --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 फ़ंक्शन

दूसरे फ़ंक्शन के लिए, आइए एक Python फ़ंक्शन बनाते हैं. यह फ़ंक्शन, किसी खास विषय पर पब्लिश किए गए Pub/Sub मैसेज से ट्रिगर होता है.

Pub/Sub के पुष्टि करने वाले टोकन सेट अप करना

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

अगले फ़ंक्शन के लिए, आइए एक Node.js फ़ंक्शन बनाएं. यह फ़ंक्शन, Compute Engine वीएम इंस्टेंस बनाए जाने पर Cloud Audit Log इवेंट को स्वीकार करता है. इसके जवाब में, यह नई बनाई गई वीएम में एक लेबल जोड़ता है. इसमें वीएम बनाने वाले व्यक्ति की जानकारी होती है.

हाल ही में बनाए गए Compute Engine VM का पता लगाना

VM बनाए जाने पर, Compute Engine दो ऑडिट लॉग जनरेट करता है.

पहला इवेंट, वीएम बनाने की प्रोसेस की शुरुआत में ट्रिगर होता है. दूसरा इवेंट, वीएम बनने के बाद ट्रिगर होता है.

ऑडिट लॉग में, ऑपरेशन फ़ील्ड अलग-अलग होते हैं. इनमें first: true और last: true वैल्यू शामिल होती हैं. दूसरे ऑडिट लॉग में, किसी इंस्टेंस को लेबल करने के लिए ज़रूरी सारी जानकारी मौजूद होती है. इसलिए, हम Cloud Run फ़ंक्शन में इसका पता लगाने के लिए last: true फ़्लैग का इस्तेमाल करेंगे.

सेट अप करें

Cloud Audit Log फ़ंक्शन का इस्तेमाल करने के लिए, आपको Eventarc के लिए ऑडिट लॉग चालू करने होंगे. आपको eventarc.eventReceiver भूमिका वाला सेवा खाता भी इस्तेमाल करना होगा.

  1. Compute Engine API के लिए, Cloud Audit Logs चालू करें. साथ ही, एडमिन के लिए पढ़ने की अनुमति, डेटा पढ़ने की अनुमति, और डेटा लिखने की अनुमति वाले लॉग टाइप चालू करें.
  2. डिफ़ॉल्ट Compute Engine सेवा खाते को eventarc.eventReceiver IAM भूमिका असाइन करें:
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
  --role roles/eventarc.eventReceiver

फ़ंक्शन बनाना

इस कोडलैब में node.js का इस्तेमाल किया गया है. हालांकि, आपको अन्य उदाहरण https://github.com/GoogleCloudPlatform/eventarc-samples पर मिल सकते हैं

package.json फ़ाइल बनाना

{
  "dependencies": {
    "googleapis": "^84.0.0"
  }
}

node.js फ़ाइल बनाना

// Copyright 2021 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
const { google } = require("googleapis");
var compute = google.compute("v1");

exports.labelVmCreation = async (cloudevent) => {
  const data = cloudevent.body;

  // in case an event has >1 audit log
  // make sure we respond to the last event
  if (!data.operation || !data.operation.last) {
    console.log("Operation is not last, skipping event");
    return;
  }

  // projects/dogfood-gcf-saraford/zones/us-central1-a/instances/instance-1
  var resourceName = data.protoPayload.resourceName;
  var resourceParts = resourceName.split("/");
  var project = resourceParts[1];
  var zone = resourceParts[3];
  var instanceName = resourceParts[5];
  var username = data.protoPayload.authenticationInfo.principalEmail.split("@")[0];

  console.log(`Setting label username: ${username} to instance ${instanceName} for zone ${zone}`);

  var authClient = await google.auth.getClient({
    scopes: ["https://www.googleapis.com/auth/cloud-platform"]
  });

  // per docs: When updating or adding labels in the API,
  // you need to provide the latest labels fingerprint with your request,
  // to prevent any conflicts with other requests.
  var labelFingerprint = await getInstanceLabelFingerprint(authClient, project, zone, instanceName);

  var responseStatus = await setVmLabel(
    authClient,
    labelFingerprint,
    username,
    project,
    zone,
    instanceName
  );

  // log results of setting VM label
  console.log(JSON.stringify(responseStatus, null, 2));
};

async function getInstanceLabelFingerprint(authClient, project, zone, instanceName) {
  var request = {
    project: project,
    zone: zone,
    instance: instanceName,
    auth: authClient
  };

  var response = await compute.instances.get(request);
  var labelFingerprint = response.data.labelFingerprint;
  return labelFingerprint;
}

async function setVmLabel(authClient, labelFingerprint, username, project, zone, instanceName) {
  var request = {
    project: project,
    zone: zone,
    instance: instanceName,

    resource: {
      labels: { "creator": username },
      labelFingerprint: labelFingerprint
    },

    auth: authClient
  };

  var response = await compute.instances.setLabels(request);
  return response.statusText;
}

लागू करना

फ़ंक्शन डिप्लॉय करें:

gcloud run deploy gce-vm-labeler \
  --source . \
  --function labelVmCreation \
  --region $REGION \
  --no-allow-unauthenticated

अब ट्रिगर बनाएं. ध्यान दें कि यह फ़ंक्शन, --trigger-event-filters फ़्लैग के साथ Compute Engine में किए गए बदलावों के लिए, ऑडिट लॉग को कैसे फ़िल्टर कर रहा है.

gcloud eventarc triggers create gce-vm-labeler-trigger \
  --location=$REGION \
  --destination-run-service=gce-vm-labeler \
  --destination-run-region=$REGION \
  --event-filters="type=google.cloud.audit.log.v1.written,serviceName=compute.googleapis.com,methodName=v1.compute.instances.insert" \
  --service-account=$ROJECT_NUMBER-compute@developer.gserviceaccount.com

टेस्ट

एनवायरमेंट वैरिएबल सेट करें:

# if you're using europe-west1 as your region
ZONE=europe-west1-d
VM_NAME=codelab-crf-auditlog

वीएम बनाने के लिए, यह कमांड चलाएं:

gcloud compute instances create $VM_NAME --zone=$ZONE --machine-type=e2-medium --image-family=debian-11  --image-project=debian-cloud

वर्चुअल मशीन (वीएम) बन जाने के बाद, आपको Cloud Console में वीएम पर जोड़ा गया creator लेबल दिखेगा. यह लेबल, सामान्य जानकारी सेक्शन में दिखेगा. इसके अलावा, इस लेबल को देखने के लिए यहां दिया गया निर्देश भी इस्तेमाल किया जा सकता है:

gcloud compute instances describe $VM_NAME --zone=$ZONE

आपको आउटपुट में लेबल इस उदाहरण की तरह दिखना चाहिए:

...
labelFingerprint: ULU6pAy2C7s=
labels:
  creator: atameldev
...

व्यवस्थित करें

पक्का करें कि आपने वीएम इंस्टेंस मिटा दिया हो. इस लैब में इसका दोबारा इस्तेमाल नहीं किया जाएगा.

gcloud compute instances delete $VM_NAME --zone=$ZONE

7. ट्रैफ़िक स्प्लिट करना

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

इस समय, अगर अपने ब्राउज़र में HTTP ट्रिगर (ऊपर दी गई डिप्लॉयमेंट कमांड का यूआरआई आउटपुट) देखकर फ़ंक्शन की जांच की जाती है, तो आपको Hello World दिखेगा. इसका बैकग्राउंड नारंगी रंग का होगा:

36ca0c5f39cc89cf.png

पीले बैकग्राउंड वाले दूसरे वर्शन को डिप्लॉय करें:

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 दिखेगा:

391286a08ad3cdde.png

ट्रैफ़िक को 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

टेस्ट

फ़ंक्शन को आज़माने के लिए, उसके सार्वजनिक यूआरएल पर जाएं. आपको आधे समय तक नारंगी रंग वाला वर्शन और बाकी आधे समय तक पीले रंग वाला वर्शन दिखना चाहिए:

36ca0c5f39cc89cf.png 391286a08ad3cdde.png

ज़्यादा जानकारी के लिए, रोलबैक, धीरे-धीरे रोलआउट करना, और ट्रैफ़िक माइग्रेशन देखें.

8. कम से कम इंस्टेंस

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

ज़्यादा जानकारी के लिए, कम से कम इंस्टेंस का इस्तेमाल करना लेख पढ़ें.

9. बधाई हो!

कोडलैब पूरा करने के लिए बधाई!

हमने क्या-क्या बताया

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