ক্লাউড রান ফাংশন দিয়ে শুরু করা

১. ভূমিকা

সংক্ষিপ্ত বিবরণ

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

এই কোডল্যাবটি আপনাকে এমন ক্লাউড রান ফাংশন তৈরি করার পদ্ধতি শেখাবে, যা HTTP কলের সাড়া দেয় এবং পাব/সাব মেসেজ ও ক্লাউড অডিট লগ দ্বারা ট্রিগার হয়।

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

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

আপনি যা শিখবেন

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

২. সেটআপ এবং প্রয়োজনীয়তা

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

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

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

৩. HTTP ফাংশন

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

তৈরি করুন

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

mkdir hello-http
cd hello-http

একটি index.js ফাইল তৈরি করুন যা HTTP অনুরোধের উত্তর দেবে:

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 ফ্ল্যাগটি ক্লাউড রানকে ফাংশনটিকে একটি চালনাযোগ্য কন্টেইনার-ভিত্তিক পরিষেবাতে বিল্ড করতে বলার জন্য ব্যবহৃত হয়।
  • নতুন সার্ভিসের এন্ট্রিপয়েন্টকে আপনার কাঙ্ক্ষিত ফাংশন সিগনেচারে সেট করার জন্য --function ফ্ল্যাগটি (new) ব্যবহৃত হয়।
  • --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! বার্তাটি দেখতে পাবেন।

৪. পাব/সাব ফাংশন

দ্বিতীয় ফাংশনটির জন্য, চলুন একটি পাইথন ফাংশন তৈরি করি যা একটি নির্দিষ্ট টপিকে প্রকাশিত পাব/সাব মেসেজের মাধ্যমে ট্রিগার হবে।

পাব/সাব অথোরাইজেশন টোকেন সেট আপ করুন

যদি আপনি ৮ই এপ্রিল, ২০২১ তারিখে বা তার আগে পাব/সাব সার্ভিস অ্যাকাউন্টটি সক্রিয় করে থাকেন, তাহলে পাব/সাব সার্ভিস অ্যাকাউন্টটিকে 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

তৈরি করুন

নমুনা হিসেবে ব্যবহারের জন্য একটি পাব/সাব টপিক তৈরি করুন:

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

৫. ক্লাউড স্টোরেজ ফাংশন

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

সেট আপ

ক্লাউড স্টোরেজ ফাংশনগুলি ব্যবহার করতে, ক্লাউড স্টোরেজ পরিষেবা অ্যাকাউন্টকে 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 ফাইল তৈরি করুন যা কেবল ক্লাউড স্টোরেজ ইভেন্টগুলিতে সাড়া দেবে:

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"
  }
}

মোতায়েন করুন

প্রথমে, ক্লাউড স্টোরেজ বাকেট তৈরি করুন (অথবা আপনার আগে থেকে থাকা কোনো বাকেট ব্যবহার করুন):

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

ফাংশনটি ডেপ্লয় করা হয়ে গেলে, আপনি এটি ক্লাউড কনসোলের ক্লাউড রান সেকশনে দেখতে পাবেন।

এখন ইভেন্টআর্ক ট্রিগারটি তৈরি করুন।

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

৬. ক্লাউড অডিট লগ

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

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

একটি ভিএম তৈরি করার সময় কম্পিউট ইঞ্জিন ২টি অডিট লগ নির্গত করে।

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

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

সেট আপ

ক্লাউড অডিট লগ ফাংশন ব্যবহার করতে হলে, আপনাকে ইভেন্টআর্ক-এর জন্য অডিট লগ সক্রিয় করতে হবে। এছাড়াও, আপনার eventarc.eventReceiver রোলসহ একটি সার্ভিস অ্যাকাউন্ট ব্যবহার করতে হবে।

  1. Compute Engine API-এর জন্য Cloud Audit Logs Admin Read , Data Read এবং Data Write লগ টাইপগুলো সক্রিয় করুন।
  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 ফ্ল্যাগ ব্যবহার করে অডিট লগ থেকে কম্পিউট ইঞ্জিন ইনসারশনগুলো ফিল্টার করছে।

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

ভিএম তৈরি সম্পন্ন হলে, আপনি ক্লাউড কনসোলের বেসিক ইনফরমেশন বিভাগে অথবা নিম্নলিখিত কমান্ডটি ব্যবহার করে ভিএম-টিতে যুক্ত হওয়া creator লেবেলটি দেখতে পাবেন:

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

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

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

পরিষ্কার করা

ভিএম ইনস্ট্যান্সটি অবশ্যই মুছে ফেলুন। এই ল্যাবে এটি আর ব্যবহার করা হবে না।

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

৭. ট্র্যাফিক বিভাজন

ক্লাউড রান ফাংশন আপনার ফাংশনের একাধিক সংস্করণ সমর্থন করে, বিভিন্ন সংস্করণের মধ্যে ট্র্যাফিক ভাগ করে দেয় এবং আপনার ফাংশনটিকে পূর্ববর্তী সংস্করণে ফিরিয়ে নিয়ে যায়।

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

তৈরি করুন

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

mkdir ../traffic-splitting
cd ../traffic-splitting

একটি 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

ট্র্যাফিক ৫০-৫০ ভাগ করুন

অরেঞ্জ এবং ইয়েলো রিভিশনের মধ্যে ট্র্যাফিক ভাগ করার জন্য, আপনাকে ক্লাউড রান সার্ভিসগুলোর রিভিশন আইডি খুঁজে বের করতে হবে। রিভিশন আইডিগুলো দেখার কমান্ডটি হলো:

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.png391286a08ad3cdde.png

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

৮. ন্যূনতম দৃষ্টান্ত

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

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

তৈরি করুন

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

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

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

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

৯. অভিনন্দন!

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

আমরা যা আলোচনা করেছি

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