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

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

এই কোডল্যাব সম্পর্কে

subjectমে ৭, ২০২৫-এ শেষবার আপডেট করা হয়েছে
account_circleMete Atamel-এর লেখা

1. ভূমিকা

ওভারভিউ

ক্লাউড রান ফাংশন হল Google ক্লাউডের ফাংশন-এ-এ-সার্ভিস অফার যা Cloud Run এবং Eventarc দ্বারা চালিত হয়, যা আপনাকে কার্যক্ষমতা এবং স্কেলেবিলিটির উপর আরও উন্নত নিয়ন্ত্রণ দেয় এবং 90টিরও বেশি ইভেন্ট উত্স থেকে ফাংশন রানটাইম এবং ট্রিগারগুলির উপর আরও নিয়ন্ত্রণ দেয়৷

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

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

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

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

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

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. HTTP ফাংশন

প্রথম ফাংশনের জন্য, আসুন একটি প্রমাণীকৃত Node.js ফাংশন তৈরি করি যা HTTP অনুরোধে সাড়া দেয়। আসুন একটি 10 ​​মিনিটের টাইমআউট ব্যবহার করি যে কীভাবে একটি ফাংশন 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 পতাকা (নতুন) ব্যবহার করা হয় নতুন পরিষেবার এন্ট্রিপয়েন্ট সেট করার জন্য যে ফাংশন স্বাক্ষর আপনি আহ্বান করতে চান
  • --base-image পতাকা (নতুন) আপনার ফাংশনের জন্য বেস ইমেজ পরিবেশ নির্দিষ্ট করে, যেমন nodejs22 , python312 , go123 , java21 , dotnet8 , ruby33 , বা php83 । বেস ইমেজ এবং প্রতিটি ইমেজে অন্তর্ভুক্ত প্যাকেজ সম্পর্কে আরো বিস্তারিত জানার জন্য, রানটাইমস বেস ইমেজ দেখুন।
  • (ঐচ্ছিক) --timeout ফ্ল্যাগটি HTTP অনুরোধে সাড়া দেওয়ার জন্য ফাংশনটিকে দীর্ঘ সময় শেষ করার অনুমতি দেয়। এই উদাহরণে, 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 auth টোকেন সেট আপ করুন

আপনি যদি 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

তৈরি করুন

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

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"

আপনি লগগুলিতে প্রাপ্ত ক্লাউড ইভেন্ট দেখতে পাবেন:

gcloud run services logs read python-pubsub-function --region $REGION --limit=10

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

পরবর্তী ফাংশনের জন্য, আসুন একটি 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

একবার ফাংশনটি স্থাপন করা হলে, আপনি এটি ক্লাউড কনসোলের ক্লাউড রান বিভাগের অধীনে দেখতে পাবেন।

এখন 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

আপনি লগগুলিতে প্রাপ্ত ক্লাউড ইভেন্ট দেখতে পাবেন:

gcloud run services logs read nodejs-crf-cloud-storage --region $REGION --limit=10

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

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

এই ধাপে, আপনি একটি ফাংশনের 2টি সংশোধন স্থাপন করবেন এবং তারপর 50-50 এর মধ্যে ট্র্যাফিক বিভক্ত করবেন।

তৈরি করুন

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

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

ট্রাফিক 50-50 ভাগ করুন

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

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

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

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

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

এই ধাপে, আপনি ধীর শুরুর সাথে একটি ফাংশন স্থাপন করবেন। আপনি কোল্ড স্টার্ট সমস্যা লক্ষ্য করবেন। তারপর, আপনি কোল্ড স্টার্ট থেকে মুক্তি পেতে ন্যূনতম দৃষ্টান্ত মান 1 সেট করে ফাংশনটি স্থাপন করবেন।

তৈরি করুন

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

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

একটি main.go ফাইল তৈরি করুন। এই Go পরিষেবাটিতে একটি init ফাংশন রয়েছে যা 10 সেকেন্ডের জন্য ঘুমায় একটি দীর্ঘ প্রাথমিককরণ অনুকরণ করতে। এটিতে একটি 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

আপনি প্রথম কলে 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. অভিনন্দন!

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

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

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