Cloud Run ফাংশন ব্যবহার শুরু করা

১. ভূমিকা

এক নজরে

Cloud Run ফাংশন হল Google Cloud-এর ফাংশন-অ্যাজ-এ-সার্ভিস অফার যা Cloud Run এবং Eventarc দ্বারা পরিচালিত, যা আপনাকে পারফর্ম্যান্স এবং স্কেলেবিলিটির উপর আরও উন্নত কন্ট্রোল এবং ৯০টিরও বেশি ইভেন্ট সোর্স থেকে ফাংশন রানটাইম এবং ট্রিগারের উপর আরও বেশি কন্ট্রোল প্রদান করে।

এই কোডল্যাব আপনাকে Cloud Run ফাংশন তৈরি করার ব্যাপারে গাইড করবে যা HTTP কলে সাড়া দেয় এবং Pub/Sub মেসেজ ও Cloud Audit Logs-এর মাধ্যমে ট্রিগার হয়।

এছাড়াও, এই কোডল্যাব --base-image ফ্ল্যাগ ব্যবহার করে বেস ইমেজ নির্দিষ্ট করার মাধ্যমে ফাংশন ডিপ্লয়মেন্টের জন্য অটোমেটিক বেস ইমেজ আপডেট ব্যবহার করে। Cloud Run-এর জন্য অটোমেটিক বেস ইমেজ আপডেট, Google-কে অপারেটিং সিস্টেমের সিকিউরিটি প্যাচ এবং বেস ইমেজের ল্যাঙ্গুয়েজ রানটাইম কম্পোনেন্ট অটোমেটিক তৈরি করার সুবিধা দেয়। বেস ইমেজ আপডেট করার জন্য আপনাকে পরিষেবা আবার তৈরি বা ডেপ্লয় করতে হবে না। আরও তথ্যের জন্য, অটোমেটিক বেস ইমেজ আপডেট চেক করুন

আপনি অটোমেটিক বেস ইমেজ আপডেট ব্যবহার করতে না চাইলে, এই কোডল্যাবে দেখানো উদাহরণ থেকে --base-image ফ্ল্যাগ সরিয়ে দিতে পারেন।

আপনি কী শিখবেন

  • Cloud Run ফাংশনের ওভারভিউ এবং কীভাবে অটোমেটিক বেস ইমেজ আপডেট ব্যবহার করবেন।
  • HTTP কলে সাড়া দেয় এমন একটি ফাংশন কীভাবে লিখবেন।
  • Pub/Sub মেসেজের উত্তর দেয় এমন ফাংশন কীভাবে লিখতে হয়।
  • Cloud Storage ইভেন্টে রেসপন্স করে এমন ফাংশন কীভাবে লিখবেন।
  • দুটি রিভিশনের মধ্যে ট্রাফিক কীভাবে ভাগ করতে হয়।
  • ন্যূনতম ইনস্ট্যান্সের মাধ্যমে কোল্ড স্টার্টের সমস্যা থেকে কীভাবে মুক্তি পাবেন।

২. সেট-আপ ও প্রয়োজনীয়তা

রুট ফোল্ডার তৈরি করুন

সব উদাহরণের জন্য একটি রুট ফোল্ডার তৈরি করুন।

mkdir crf-codelab
cd crf-codelab

এনভায়রনমেন্ট ভেরিয়েবল সেট-আপ করা

এই কোডল্যাব জুড়ে ব্যবহার করা হবে এমন এনভায়রনমেন্ট ভেরিয়েবেল সেট করুন/

gcloud config set project <YOUR-PROJECT-ID>
REGION=<YOUR_REGION>

PROJECT_ID=$(gcloud config get-value project)

API চালু করুন

প্রয়োজনীয় সব পরিষেবা চালু করুন:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  eventarc.googleapis.com \
  run.googleapis.com \
  logging.googleapis.com \
  pubsub.googleapis.com

৩. HTTP ফাংশন

প্রথম ফাংশনের জন্য, আসুন একটি যাচাই করা Node.js ফাংশন তৈরি করি যা HTTP অনুরোধের উত্তর দেয়। HTTP অনুরোধে উত্তর দেওয়ার জন্য কোনও ফাংশন কীভাবে আরও বেশি সময় পেতে পারে তা দেখানোর জন্য, আসুন ১০ মিনিটের টাইমআউট ব্যবহার করি।

তৈরি করুন

অ্যাপের জন্য একটি ফোল্ডার তৈরি করুন এবং ফোল্ডারে নেভিগেট করুন:

mkdir hello-http
cd hello-http

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 ফ্ল্যাগ HTTP অনুরোধের উত্তর দেওয়ার জন্য ফাংশনকে আরও বেশি টাইমআউট দেয়। এই উদাহরণে, ১০ মিনিটের রেসপন্স টাইম দেখানোর জন্য ৬০০ সেকেন্ড ব্যবহার করা হয়েছে।
  • (ঐচ্ছিক) আপনার ফাংশন যাতে সর্বজনীনভাবে কল করা না যায় তার জন্য --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! মেসেজটি দেখতে পাবেন।

৪. Pub/Sub ফাংশন

দ্বিতীয় ফাংশনের জন্য, আসুন একটি Python ফাংশন তৈরি করি যা নির্দিষ্ট বিষয়ে প্রকাশিত Pub/Sub মেসেজের মাধ্যমে ট্রিগার করা হয়।

Pub/Sub অথেন্টিকেশন টোকেন সেট-আপ করুন

আপনি ৮ এপ্রিল, ২০২১-এ বা তার আগে 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 ID সহ একটি মেসেজ লগ করে:

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

৫. Cloud Storage ফাংশন

পরবর্তী ফাংশনের জন্য, আসুন একটি Node.js ফাংশন তৈরি করি যা Cloud Storage বাকেট থেকে ইভেন্টে সাড়া দেয়।

সেট-আপ করুন

Cloud Storage ফাংশন ব্যবহার করতে, Cloud Storage পরিষেবা অ্যাকাউন্টে pubsub.publisher IAM ভূমিকা মঞ্জুর করুন:

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

৬. Cloud Audit Logs

পরবর্তী ফাংশনের জন্য, আসুন একটি Node.js ফাংশন তৈরি করি যা Compute Engine VM ইনস্ট্যান্স তৈরি করার সময় একটি Cloud Audit Log ইভেন্ট গ্রহণ করে। এর উত্তরে, এটি নতুন তৈরি করা VM-এ একটি লেবেল যোগ করে, VM-এর ক্রিয়েটরকে নির্দিষ্ট করে।

নতুন তৈরি করা Compute Engine VM নির্ধারণ করা

VM তৈরি করা হলে Compute Engine ২টি অডিট লগ প্রকাশ করে।

প্রথমটি VM তৈরির শুরুতে নির্গত হয়। VM তৈরি হওয়ার পরে দ্বিতীয়টি নির্গত হয়।

অডিট লগে, অপারেশন ফিল্ডগুলি আলাদা, এতে first: true এবং last: true ভ্যালু রয়েছে। দ্বিতীয় অডিট লগে কোনও ইনস্ট্যান্স লেবেল করার জন্য প্রয়োজনীয় সব তথ্য থাকে, তাই Cloud Run ফাংশনে এটি শনাক্ত করার জন্য আমরা last: true ফ্ল্যাগ ব্যবহার করব।

সেট-আপ করুন

Cloud Audit Log ফাংশন ব্যবহার করতে, আপনাকে অবশ্যই Eventarc-এর জন্য Audit Logs চালু করতে হবে। এছাড়াও, আপনাকে 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

পরীক্ষা করুন

env vars সেট করুন:

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

VM তৈরি করতে এই কমান্ড রান করুন:

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

VM তৈরি করা সম্পূর্ণ হয়ে গেলে, Cloud Console-এ VM-এ যোগ করা creator লেবেলটি প্রাথমিক তথ্য বিভাগে বা নিম্নলিখিত কমান্ড ব্যবহার করে দেখতে পাবেন:

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

আপনি আউটপুটে নিম্নলিখিত উদাহরণের মতো লেবেল দেখতে পাবেন:

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

অপ্রয়োজনীয়গুলি মুছুন

VM ইনস্ট্যান্স মুছে দিতে ভুলবেন না। এই ল্যাবে এটি আর ব্যবহার করা হবে না।

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

৭. ট্রাফিক স্প্লিট করা

Cloud Run ফাংশন আপনার ফাংশনের একাধিক রিভিশন, বিভিন্ন রিভিশনের মধ্যে ট্রাফিক স্প্লিট করা এবং আপনার ফাংশনকে আগের ভার্সনে রোলব্যাক করা সমর্থন করে।

এই ধাপে, আপনি কোনও ফাংশনের ২টি রিভিশন ডিপ্লয় করবেন এবং তারপরে তাদের মধ্যে ট্রাফিক ৫০-৫০ অনুপাতে ভাগ করবেন।

তৈরি করুন

অ্যাপের জন্য একটি ফোল্ডার তৈরি করুন এবং ফোল্ডারে নেভিগেট করুন:

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 ট্রিগার (উপরের ডিপ্লয়মেন্ট কমান্ডের URI আউটপুট) দেখে ফাংশনটি পরীক্ষা করেন, তাহলে কমলা ব্যাকগ্রাউন্ডে 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

ট্রাফিক ৫০-৫০ অনুপাতে ভাগ করুন

কমলা ও হলুদ রিভিশনের মধ্যে ট্রাফিক স্প্লিট করতে, আপনাকে 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

পরীক্ষা করুন

ফাংশনের পাবলিক URL-এ গিয়ে সেটি পরীক্ষা করুন। অর্ধেক সময়, আপনাকে কমলা রঙের রিভিশন এবং বাকি অর্ধেক সময় হলুদ রঙের রিভিশন দেখতে হবে:

36ca0c5f39cc89cf.png 391286a08ad3cdde.png

আরও তথ্যের জন্য রোলব্যাক, ধীরে ধীরে রোল-আউট ও ট্রাফিক মাইগ্রেশন দেখুন।

৮. ন্যূনতম ইনস্ট্যান্স

Cloud Run ফাংশনে, আপনি অনুরোধের উত্তর দেওয়ার জন্য প্রস্তুত রাখতে ন্যূনতম সংখ্যক ফাংশন ইনস্ট্যান্স নির্দিষ্ট করতে পারেন। কোল্ড স্টার্টের সংখ্যা সীমিত করার ক্ষেত্রে এটি উপযোগী।

এই ধাপে, আপনি স্লো ইনিশিয়ালাইজেশন সহ একটি ফাংশন ডিপ্লয় করবেন। আপনি কোল্ড স্টার্ট সংক্রান্ত সমস্যা লক্ষ্য করবেন। তারপর, কোল্ড স্টার্ট থেকে মুক্তি পেতে আপনি ন্যূনতম ইনস্ট্যান্স ভ্যালু ১-এ সেট করে ফাংশনটি ডিপ্লয় করবেন।

তৈরি করুন

অ্যাপের জন্য একটি ফোল্ডার তৈরি করুন এবং সেখানে নেভিগেট করুন:

mkdir ../min-instances
cd ../min-instances

main.go ফাইল তৈরি করুন। এই Go পরিষেবায় একটি init ফাংশন আছে যা দীর্ঘ ইনিশিয়ালাইজেশন সিমুলেট করার জন্য ১০ সেকেন্ডের জন্য স্লিপ মোডে থাকে। এটিতে একটি HelloWorld ফাংশনও রয়েছে যা HTTP কলে সাড়া দেয়:

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

প্রথম কলের ক্ষেত্রে আপনি ১০ সেকেন্ডের বিলম্ব (কোল্ড স্টার্ট) লক্ষ্য করবেন এবং তারপরে মেসেজটি দেখতে পাবেন। পরবর্তী কলগুলি অবিলম্বে ফিরে আসা উচিত।

ন্যূনতম ইনস্ট্যান্স সেট করুন

প্রথম অনুরোধে কোল্ড স্টার্ট এড়াতে, নিম্নলিখিত উপায়ে --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

প্রথম অনুরোধে ১০ সেকেন্ডের বিলম্ব আর দেখতে পাবেন না। প্রথমবার ইনভোক করার (দীর্ঘদিন পরে) জন্য কোল্ড স্টার্টের সমস্যাটি সমাধান করা হয়েছে, ন্যূনতম ইনস্ট্যান্সের জন্য ধন্যবাদ!

আরও তথ্যের জন্য ন্যূনতম ইনস্ট্যান্স ব্যবহার করা দেখুন।

৯. অভিনন্দন!

কোডল্যাব সম্পূর্ণ করার জন্য অভিনন্দন!

আমরা কী কী কভার করেছি

  • Cloud Run ফাংশনের ওভারভিউ এবং কীভাবে অটোমেটিক বেস ইমেজ আপডেট ব্যবহার করবেন।
  • HTTP কলে সাড়া দেয় এমন একটি ফাংশন কীভাবে লিখবেন।
  • Pub/Sub মেসেজের উত্তর দেয় এমন ফাংশন কীভাবে লিখতে হয়।
  • Cloud Storage ইভেন্টে রেসপন্স করে এমন ফাংশন কীভাবে লিখবেন।
  • দুটি রিভিশনের মধ্যে ট্রাফিক কীভাবে ভাগ করতে হয়।
  • ন্যূনতম ইনস্ট্যান্সের মাধ্যমে কোল্ড স্টার্টের সমস্যা থেকে কীভাবে মুক্তি পাবেন।