ক্লাউড রানে Node.js দিয়ে একটি স্ল্যাক বট তৈরি করুন

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

5f529fb87abc11c9.png

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

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

  • স্ল্যাকে কীভাবে একটি বট কাস্টম ইন্টিগ্রেশন তৈরি করবেন
  • সিক্রেট ম্যানেজার ব্যবহার করে কীভাবে আপনার স্ল্যাক গোপনীয় তথ্য সুরক্ষিত করবেন
  • ক্লাউড রান- এ কীভাবে একটি স্ল্যাক বট স্থাপন করবেন, যা একটি সম্পূর্ণ পরিচালিত কম্পিউট প্ল্যাটফর্ম এবং আপনার স্টেটলেস কন্টেইনারগুলিকে স্বয়ংক্রিয়ভাবে স্কেল করে।

আপনার যা যা লাগবে

আপনি এই টিউটোরিয়ালটি কীভাবে ব্যবহার করবেন?

শুধু পুরোটা পড়ুন এটি পড়ুন এবং অনুশীলনগুলো সম্পূর্ণ করুন।

গুগল ক্লাউড ব্যবহারের অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

শিক্ষানবিশ মধ্যবর্তী দক্ষ

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

স্ব-গতিতে পরিবেশ সেটআপ

  1. Google Cloud Console- এ সাইন-ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। যদি আপনার আগে থেকে Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।

98e4187c97cf2e0e.png

37d264871000675d.png

c20a9642aaa18d11.png

  • প্রজেক্টের নামটি হলো এই প্রজেক্টের অংশগ্রহণকারীদের প্রদর্শিত নাম। এটি একটি ক্যারেক্টার স্ট্রিং যা গুগল এপিআই ব্যবহার করে না। আপনি যেকোনো সময় এটি আপডেট করতে পারেন।
  • প্রজেক্ট আইডি সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে অনন্য এবং অপরিবর্তনীয় (একবার সেট করার পর এটি পরিবর্তন করা যায় না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত এটি কী তা নিয়ে আপনার মাথা ঘামানোর দরকার নেই। বেশিরভাগ কোডল্যাবে, আপনাকে আপনার প্রজেক্ট আইডি উল্লেখ করতে হবে (যা সাধারণত PROJECT_ID হিসাবে চিহ্নিত করা হয়)। তৈরি করা আইডিটি আপনার পছন্দ না হলে, আপনি এলোমেলোভাবে আরেকটি তৈরি করতে পারেন। বিকল্পভাবে, আপনি আপনার নিজের আইডি দিয়ে চেষ্টা করে দেখতে পারেন যে সেটি উপলব্ধ আছে কিনা। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রজেক্টের পুরো সময়কাল জুড়ে এটি অপরিবর্তিত থাকবে।
  • আপনার অবগতির জন্য জানাচ্ছি যে, তৃতীয় একটি ভ্যালু রয়েছে, যা হলো প্রজেক্ট নম্বর , এবং কিছু এপিআই এটি ব্যবহার করে থাকে। ডকুমেন্টেশনে এই তিনটি ভ্যালু সম্পর্কে আরও বিস্তারিত জানুন।
  1. এরপর, ক্লাউড রিসোর্স/এপিআই ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং চালু করতে হবে। এই কোডল্যাবটি সম্পন্ন করতে খুব বেশি খরচ হবে না, এমনকি আদৌ কোনো খরচ নাও হতে পারে। এই টিউটোরিয়ালের পর বিলিং এড়াতে রিসোর্সগুলো বন্ধ করার জন্য, আপনি আপনার তৈরি করা রিসোর্সগুলো অথবা প্রজেক্টটি ডিলিট করে দিতে পারেন। নতুন গুগল ক্লাউড ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।

ক্লাউড শেল শুরু করুন

যদিও গুগল ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালনা করা যায়, এই টিউটোরিয়ালে আপনি ক্লাউড শেল ব্যবহার করবেন, যা ক্লাউডে চলমান একটি কমান্ড লাইন পরিবেশ।

ক্লাউড শেল সক্রিয় করুন

  1. ক্লাউড কনসোল থেকে, Activate Cloud Shell-এ ক্লিক করুন। d1264ca30785e435.png .

84688aa223b1c3a2.png

আপনি যদি প্রথমবারের মতো ক্লাউড শেল চালু করেন, তাহলে এটি কী তা বর্ণনা করে একটি মধ্যবর্তী স্ক্রিন আপনার সামনে আসবে। যদি একটি মধ্যবর্তী স্ক্রিন আসে, তাহলে 'চালিয়ে যান' (Continue) এ ক্লিক করুন।

d95252b003979716.png

ক্লাউড শেল প্রস্তুত করতে এবং এর সাথে সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগা উচিত।

7833d5e1c5d18f54.png

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

ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনি দেখতে পাবেন যে আপনাকে প্রমাণীকৃত করা হয়েছে এবং প্রজেক্টটি আপনার প্রজেক্ট আইডিতে সেট করা আছে।

  1. আপনি প্রমাণীকৃত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud auth list

কমান্ড আউটপুট

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud কমান্ডটি আপনার প্রজেক্ট সম্পর্কে জানে কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud config list project

কমান্ড আউটপুট

[core]
project = <PROJECT_ID>

যদি তা না থাকে, তবে আপনি এই কমান্ডটি দিয়ে এটি সেট করতে পারেন:

gcloud config set project <PROJECT_ID>

কমান্ড আউটপুট

Updated property [core/project].

৩. এপিআইগুলো সক্রিয় করুন

ক্লাউড শেল থেকে আর্টিফ্যাক্ট রেজিস্ট্রি, ক্লাউড বিল্ড, ক্লাউড রান এবং সিক্রেট ম্যানেজার এপিআইগুলো সক্রিয় করুন:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com \
  secretmanager.googleapis.com

এর ফলে এই ধরনের একটি সফলতার বার্তা আউটপুট হয়:

Operation "operations/..." finished successfully.

এখন, আপনি আপনার অ্যাপ্লিকেশনটি প্রস্তুত ও স্থাপন করার জন্য তৈরি...

৪. একটি স্ল্যাক ওয়ার্কস্পেস তৈরি করুন।

আপনার এমন একটি স্ল্যাক ওয়ার্কস্পেসের প্রয়োজন হবে যেখানে আপনি কাস্টম ইন্টিগ্রেশন তৈরি করতে পারবেন। এই টিউটোরিয়ালের জন্য ব্যবহার করতে চাইলে, আপনার যদি আগে থেকে কোনো ওয়ার্কস্পেস না থাকে, তবে আপনি বিনামূল্যে একটি তৈরি করে নিতে পারেন।

aa1f0fda82263bf8.png

৫. একটি স্ল্যাক বট ব্যবহারকারী তৈরি করুন।

একজন বট ব্যবহারকারী স্ল্যাকে মেসেজ শুনতে, মেসেজ পোস্ট করতে এবং ফাইল আপলোড করতে পারে। এই কোডল্যাবে, আপনি একটি সাধারণ শুভেচ্ছা বার্তা পোস্ট করার জন্য একটি বট তৈরি করবেন।

একটি নতুন স্ল্যাক অ্যাপ তৈরি করুন

  • স্ল্যাক অ্যাপস ম্যানেজমেন্ট পেজে যান।
  • উপরের ডান কোণায় থাকা 'Create new app' বাটনটিতে ক্লিক করুন।
  • অ্যাপটির একটি নাম দিন, যেমন "কিটেনবট"।
  • যে স্ল্যাক টিমে এটি ইনস্টল করতে চান, সেটি বেছে নিন।

একটি বট ব্যবহারকারী তৈরি করুন

  • বাম পাশের প্যানেলে ফিচার্স-এর অধীনে অ্যাপ হোম- এ যান।

414213b184fcc992.png

  • আপনার বট টোকেনে একটি স্কোপ নির্ধারণ করতে, 'Review Scopes to Add'-এ ক্লিক করুন।
  • নিচে স্ক্রল করে ‘Bot Token Scopes’- এ যান এবং ‘Add an OAuth Scope’-এ ক্লিক করুন। chat:write কে ‘Send messages as Kittenbot’ হিসেবে নির্বাচন করুন।

74a6fa87c64c2b23.png

  • উপরে স্ক্রোল করুন এবং আপনার ওয়ার্কস্পেসে অ্যাপটি ইনস্টল করুন বোতামে ক্লিক করুন।
  • এটি আপনার টিমে অ্যাপটি ইনস্টল করবে, আপনার সদ্য তৈরি করা বট ব্যবহারকারীকে যুক্ত করবে এবং একটি বট টোকেন তৈরি করবে।
  • নির্দেশিত হলে, আপনার ওয়ার্কস্পেসে বটটিকে চ্যাট করার অনুমতি দিতে ' অনুমতি দিন ' বাটনে ক্লিক করুন।

বার্তা এবং কমান্ড সক্রিয় করুন

  • নিচে স্ক্রল করে ' Show Tabs'- এ যান এবং নিশ্চিত করুন যে উভয় অপশনই চালু আছে:

5ca52f7abbdc15c.png

ক্লায়েন্টের স্বাক্ষরের গোপনীয়তা পান

  • সেটিংস-এর অধীনে মৌলিক তথ্যে যান।
  • নিচে স্ক্রল করে 'Signing Secret'- এ যান, 'Show'-তে ক্লিক করুন এবং তারপর সিক্রেটটি আপনার ক্লিপবোর্ডে কপি করুন:

74cfd6616fa71dc4.png

  • গোপনীয় তথ্য একটি এনভায়রনমেন্ট ভেরিয়েবলে সংরক্ষণ করুন:
CLIENT_SIGNING_SECRET=PASTE_THE_SIGNING_SECRET

বট টোকেনটি নিন

  • Features-এর অধীনে OAuth & Permissions- এ যান।
  • বট ব্যবহারকারীর OAuth অ্যাক্সেস টোকেন টেক্সটটি আপনার ক্লিপবোর্ডে কপি করতে কপি বাটনে ক্লিক করুন।

6f5a18069471101.png

  • বট টোকেনটি একটি এনভায়রনমেন্ট ভেরিয়েবলে সংরক্ষণ করুন:
BOT_TOKEN=PASTE_THE_BOT_TOKEN

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

৬. আপনার গোপনীয়তা সুরক্ষিত রাখুন

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

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

আপনার গোপনীয়তা তৈরি করুন

নিম্নলিখিত কমান্ডগুলো ব্যবহার করে আপনার ক্লায়েন্ট সাইনিং সিক্রেট এবং বট টোকেন সংরক্ষণ করুন:

  • ক্লায়েন্টের স্বাক্ষর গোপনীয়
echo -n $CLIENT_SIGNING_SECRET | gcloud secrets create client-signing-secret \
  --replication-policy automatic \
  --data-file -
  • বট টোকেন
echo -n $BOT_TOKEN | gcloud secrets create bot-token \
  --replication-policy automatic \
  --data-file -

আপনার গোপনীয়তাগুলি অ্যাক্সেস করুন

চলুন নিশ্চিত করা যাক যে আপনার সিক্রেটগুলো সঠিকভাবে তৈরি হয়েছে এবং আপনার পারমিশনগুলো কাজ করছে। নিম্নলিখিত কমান্ডগুলো ব্যবহার করে আপনার সিক্রেটগুলো অ্যাক্সেস করুন:

echo $(gcloud secrets versions access 1 --secret client-signing-secret)
echo $(gcloud secrets versions access 1 --secret bot-token)

এছাড়াও আপনি গুগল ক্লাউড কনসোলে আপনার গোপনীয় তথ্যগুলো দেখতে ও পরিচালনা করতে পারেন।

৭. নমুনা কোডটি নিন।

ক্লাউড শেল-এর কমান্ড-লাইনে, গিটহাব রিপোজিটরি ক্লোন করতে নিম্নলিখিত কমান্ডটি চালান:

git clone https://github.com/googlecodelabs/cloud-slack-bot.git

cloud-slack-bot/start ডিরেক্টরিতে পরিবর্তন করুন।

cd cloud-slack-bot/start

কোডটি বোঝা

আপনার পছন্দের কমান্ড লাইন এডিটর (ন্যানো, ভিম, ইম্যাক্স...) দিয়ে kittenbot.js ফাইলটি খুলুন, অথবা নিম্নলিখিত কমান্ডটি ব্যবহার করে সরাসরি ক্লাউড শেল এডিটরে বর্তমান ফোল্ডারটি খুলুন:

cloudshell workspace .

কিটেনবট কোডের দুটি প্রধান কাজ রয়েছে। একটি হলো গোপনীয় তথ্য পুনরুদ্ধার করা, এবং অন্যটি হলো বটটি চালানো।

প্রথমে, আমরা নির্ভরতাগুলো ইম্পোর্ট করি:

kittenbot.js

const { Botkit } = require('botkit');
const {
  SlackAdapter,
  SlackEventMiddleware,
} = require('botbuilder-adapter-slack');
const { SecretManagerServiceClient } = require('@google-cloud/secret-manager');

SlackAdapter এবং SlackEventMiddleware হলো এমন প্যাকেজ যা বটকিটকে সম্প্রসারিত করে এবং বটকে স্ল্যাক এপিআই-এর সাথে ও স্ল্যাক এপিআই-তে সহজে বার্তা অনুবাদ করতে সাহায্য করে। সিক্রেট ম্যানেজার ক্লায়েন্ট আপনাকে পূর্ববর্তী ধাপে সংরক্ষণ করা গোপনীয় তথ্যগুলো অ্যাক্সেস করার সুযোগ দেবে।

এরপরে গোপনীয় তথ্য পুনরুদ্ধার করার জন্য আমাদের ফাংশনটি রয়েছে:

/**
 * Returns the secret string from Google Cloud Secret Manager
 * @param {string} name The name of the secret.
 * @return {Promise<string>} The string value of the secret.
 */
async function accessSecretVersion(name) {
  const client = new SecretManagerServiceClient();
  const projectId = process.env.PROJECT_ID;
  const [version] = await client.accessSecretVersion({
    name: `projects/${projectId}/secrets/${name}/versions/1`,
  });

  // Extract the payload as a string.
  const payload = version.payload.data.toString('utf8');

  return payload;
}

এই ফাংশনটি বটটিকে প্রমাণীকরণের জন্য প্রয়োজনীয় সিক্রেটগুলোর স্ট্রিং ভ্যালু রিটার্ন করে।

পরবর্তী ফাংশনটি বটটিকে চালু করে:

/**
 * Function to initialize kittenbot.
 */
async function kittenbotInit() {
  const adapter = new SlackAdapter({
    clientSigningSecret: await accessSecretVersion('client-signing-secret'),
    botToken: await accessSecretVersion('bot-token'),
  });

  adapter.use(new SlackEventMiddleware());

  const controller = new Botkit({
    webhook_uri: '/api/messages',
    adapter: adapter,
  });

  controller.ready(() => {
    controller.hears(
      ['hello', 'hi', 'hey'],
      ['message', 'direct_message'],
      async (bot, message) => {
        await bot.reply(message, 'Meow. :smile_cat:');
      }
    );
  });
}

ফাংশনের প্রথম অংশটি সিক্রেটগুলো দিয়ে স্ল্যাকঅ্যাডাপ্টার কনফিগার করে এবং তারপর মেসেজ গ্রহণের জন্য একটি এন্ডপয়েন্ট নির্দিষ্ট করে। এরপর, কন্ট্রোলারটি চালু হয়ে গেলে, বটটি "hello", "hi", বা "hey" থাকা যেকোনো মেসেজের উত্তরে "Meow. 😺" পাঠাবে।

অ্যাপ ম্যানিফেস্টের এই নির্দিষ্ট অংশগুলো দেখুন:

প্যাকেজ.json

{
  // ...
  "scripts": {
    "start": "node kittenbot.js",
    // ...
  },
  "engines": {
    "node": "16"
  },
  // ...
}

আপনি ক্লাউড রান ব্যবহার করে সরাসরি সোর্স থেকে একটি Node.js অ্যাপ ডেপ্লয় করতে পারেন। এর নেপথ্যে নিম্নলিখিত বিষয়গুলো ঘটবে:

  • ক্লাউড রান একটি কন্টেইনার ইমেজ তৈরি করার জন্য ক্লাউড বিল্ডকে কল করে ( সোর্স কোড থেকে ডিপ্লয়িং দেখুন)।
  • সোর্স কোড ডিরেক্টরিতে যদি কোনো Dockerfile থাকে, তাহলে ক্লাউড বিল্ড সেটি ব্যবহার করে একটি কন্টেইনার ইমেজ তৈরি করে।
  • যেহেতু তা নয়, ক্লাউড বিল্ড সোর্স বিশ্লেষণ করতে এবং স্বয়ংক্রিয়ভাবে একটি প্রোডাকশন-রেডি ইমেজ তৈরি করতে বিল্ডপ্যাকসকে আহ্বান করে।
  • বিল্ডপ্যাকস package.json ম্যানিফেস্টটি শনাক্ত করে একটি Node.js ইমেজ তৈরি করে।
  • ` scripts.start ফিল্ডটি নির্ধারণ করে অ্যাপটি কীভাবে চালু হবে।
  • engines.node ফিল্ডটি কন্টেইনার বেস ইমেজের Node.js ভার্সন নির্ধারণ করে।
  • স্থাপনের সময়, জ্ঞাত নিরাপত্তা সমাধানগুলো স্বয়ংক্রিয়ভাবে প্রয়োগ করা হয়।

আপনি অ্যাপটি ডেপ্লয় করার জন্য প্রস্তুত!

৮. অ্যাপটি স্থাপন করুন।

স্ল্যাক ইভেন্টস এপিআই ইভেন্ট সম্পর্কিত বহির্গামী বার্তা পাঠাতে ওয়েবহুক ব্যবহার করে। স্ল্যাক অ্যাপ কনফিগার করার সময়, স্ল্যাক এপিআই-এর পিং করার জন্য আপনাকে একটি সর্বজনীনভাবে অ্যাক্সেসযোগ্য ইউআরএল প্রদান করতে হবে।

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

আপনার প্রজেক্ট আইডি পুনরুদ্ধার করুন

PROJECT_ID এনভায়রনমেন্ট ভেরিয়েবলটি সংজ্ঞায়িত করুন:

PROJECT_ID=$(gcloud config get-value core/project)

আপনার ক্লাউড রান অঞ্চল নির্ধারণ করুন

ক্লাউড রান আঞ্চলিক, যার অর্থ হলো আপনার ক্লাউড রান পরিষেবাটি যে পরিকাঠামোতে চলে তা একটি নির্দিষ্ট অঞ্চলে অবস্থিত এবং সেই অঞ্চলের সমস্ত জোনে রিডান্ড্যান্টভাবে উপলব্ধ থাকার জন্য গুগল দ্বারা পরিচালিত হয়। আপনার ডেপ্লয়মেন্টের জন্য যে অঞ্চলটি ব্যবহার করবেন তা নির্ধারণ করুন, উদাহরণস্বরূপ:

REGION="us-central1"

অনুমতিগুলি আপডেট করুন

সিক্রেট ম্যানেজার থেকে গোপনীয় তথ্য অ্যাক্সেস করতে হলে, ক্লাউড রান সার্ভিস অ্যাকাউন্টকে roles/secretmanager.secretAccessor রোলটি প্রদান করতে হবে।

প্রথমে, ডিফল্ট সার্ভিস অ্যাকাউন্টটি একটি এনভায়রনমেন্ট ভেরিয়েবলে সংরক্ষণ করুন:

SERVICE_ACCOUNT=$(gcloud iam service-accounts list \
  --format "value(email)" \
  --filter "displayName:Compute Engine default service account")

আপনার ইমেল ঠিকানাটি সংরক্ষিত আছে কিনা তা নিশ্চিত করুন:

echo $SERVICE_ACCOUNT

সার্ভিস অ্যাকাউন্টের ফরম্যাটটি হলো: PROJECT_NUMBER-compute@developer.gserviceaccount.com

ইমেল ঠিকানাটি পেয়ে গেলে, পরিষেবা অ্যাকাউন্টের জন্য ভূমিকাটি সক্রিয় করুন:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT \
  --role roles/secretmanager.secretAccessor

অ্যাপটি স্থাপন করুন

একটি ক্লাউড রান পরিষেবা একটি অনন্য এন্ডপয়েন্ট উন্মুক্ত করে এবং আগত অনুরোধগুলি সামাল দেওয়ার জন্য অন্তর্নিহিত পরিকাঠামোকে স্বয়ংক্রিয়ভাবে স্কেল করে।

ক্লাউড রান-এ অ্যাপটি স্থাপন করুন:

gcloud run deploy kittenbot \
  --source . \
  --platform managed \
  --region $REGION \
  --set-env-vars PROJECT_ID=$PROJECT_ID \
  --allow-unauthenticated
  • এটি kittenbot নামের একটি সার্ভিস তৈরি করে।
  • --source অপশনটি ক্লাউড বিল্ড দিয়ে অ্যাপ্লিকেশনটি বিল্ড করার জন্য বর্তমান ফোল্ডার ব্যবহার করে। ক্লাউড বিল্ড স্বয়ংক্রিয়ভাবে package.json ফাইলের উপস্থিতি শনাক্ত করে।
  • বিকল্পভাবে আপনি এই কমান্ডটি ব্যবহার করে একটি ডিফল্ট অঞ্চল নির্ধারণ করতে পারেন: gcloud config set run/region $REGION
  • আপনি এই কমান্ডটি ব্যবহার করে ক্লাউড রানকে ডিফল্টরূপে ম্যানেজডও করতে পারেন: gcloud config set run/platform managed
  • --set-env-vars অপশনটি সার্ভিসের এনভায়রনমেন্ট ভেরিয়েবলগুলো সেট করে।
  • --allow-unauthenticated অপশনটি সার্ভিসটিকে সর্বজনীনভাবে উপলব্ধ করে তোলে।

প্রথমবার, আপনাকে একটি আর্টিফ্যাক্ট রেজিস্ট্রি রিপোজিটরি তৈরি করার জন্য অনুরোধ জানানো হবে। যাচাই করতে এন্টার চাপুন:

Deploying from source requires an Artifact Registry Docker repository to store
built containers. A repository named [cloud-run-source-deploy] in region [REGION]
will be created.

Do you want to continue (Y/n)?

এর মাধ্যমে আর্টিফ্যাক্ট রেজিস্ট্রি রিপোজিটরিতে আপনার সোর্স কোড আপলোড এবং আপনার কন্টেইনার ইমেজ বিল্ড করার প্রক্রিয়া শুরু হয়:

Building using Dockerfile and deploying container ...
* Building and deploying new service... Building Container.
  OK Creating Container Repository...
  OK Uploading sources...
  * Building Container... Logs are available at ...

তারপর, বিল্ড এবং ডিপ্লয়মেন্ট সম্পূর্ণ হওয়া পর্যন্ত কিছুক্ষণ অপেক্ষা করুন। সফল হলে, কমান্ড লাইনে সার্ভিস URL-টি প্রদর্শিত হবে:

...
OK Building and deploying new service... Done.
  OK Creating Container Repository...
  OK Uploading sources...
  OK Building Container... Logs are available at ...
  OK Creating Revision... Creating Service.
  OK Routing traffic...
  OK Setting IAM Policy...
Done.
Service [SERVICE]... has been deployed and is serving 100 percent of traffic.
Service URL: https://SERVICE-PROJECTHASH-REGIONID.a.run.app

এই কমান্ডটি দিয়ে আপনি সার্ভিস URL পেতে পারেন:

SERVICE_URL=$( \
  gcloud run services describe kittenbot \
  --platform managed \
  --region $REGION \
  --format "value(status.url)" \
)
echo $SERVICE_URL

URL-টির গঠন নিম্নরূপ:

https://kittenbot-PROJECTHASH-REGIONID.a.run.app

এই URL-টি স্ল্যাক ইভেন্টস এপিআই (Slack Events API) সক্রিয় করার জন্য মূল ভিত্তি হিসেবে ব্যবহৃত হবে। পরবর্তী ধাপে ব্যবহারের জন্য এটি আপনার ক্লিপবোর্ডে কপি করে নিন।

আপনার পরিষেবাটি এখন চালু এবং সর্বসাধারণের জন্য উপলব্ধ! আরও তথ্যের জন্য ক্লাউড রান কনসোলে যান। fee46ea7c8483d56.png

আপনি দেখতে পারেন শেষ সংস্করণটি কখন তৈরি করা হয়েছিল, এটি কী পরিমাণ ট্র্যাফিক পাচ্ছে এবং লগগুলোও দেখতে পারেন। লগগুলোতে ক্লিক করলে আমরা দেখতে পাব যে বটকিট কন্ট্রোলারটি চালু আছে এবং বার্তা গ্রহণ করার জন্য প্রস্তুত।

এখন আমাদের স্ল্যাক চ্যানেল থেকে মেসেজ পাঠানো শুরু করা যাক!

৯. স্ল্যাক ইভেন্ট সক্রিয় করুন

আমরা আগেই দেখেছি, আমাদের কিটেনবট কোড ওয়েবহুক টার্গেটের জন্য একটি রিলেটিভ এন্ডপয়েন্ট নির্দিষ্ট করে।

kittenbot.js

 const controller = new Botkit({
    webhook_uri: '/api/messages',
    adapter: adapter,
  });

এর মানে হলো, আমাদের সম্পূর্ণ URL-টি হবে Cloud Run সার্ভিসের মূল অংশের সাথে /api/messages যুক্ত হয়ে।

ইভেন্টগুলি সক্ষম করুন

অ্যাপস ম্যানেজমেন্ট পেজে , সাইডবারের ইভেন্টস সাবস্ক্রিপশন সেকশনে যান এবং ‘এনাবল ইভেন্টস’ টগলটি অন করুন। আপনার সার্ভিস ইউআরএল (URL) ইনপুট করুন:

PASTE_THE_SERVICE_URL/api/messages

5179a99339839999.png

আপনি কত দ্রুত ইউআরএলটি টাইপ করছেন তার উপর নির্ভর করে, আপনার টাইপ করা শেষ হওয়ার আগেই এটি যাচাই করার চেষ্টা করতে পারে। যদি এটি ব্যর্থ হয়, তাহলে "পুনরায় চেষ্টা করুন" (Retry) এ ক্লিক করুন।

সাবস্ক্রাইব করুন

মেসেজ বটের সকল ইভেন্টে সাবস্ক্রাইব করুন।

1e8f200390908a9b.png

পৃষ্ঠার নীচে থাকা 'পরিবর্তনগুলি সংরক্ষণ করুন' (Save Changes) বোতামে ক্লিক করুন। আপনাকে আপনার অ্যাপটি পুনরায় ইনস্টল করার জন্য অনুরোধ করা হবে। নির্দেশাবলী অনুসরণ করুন এবং 'অনুমতি দিন' (Allow) বোতামে ক্লিক করুন।

এই পর্যায়ে, আপনার বটটি সম্পূর্ণরূপে সমন্বিত হয়ে গেছে! ওয়ার্কস্পেসের মেসেজগুলো স্ল্যাককে আপনার ক্লাউড রান সার্ভিসে মেসেজ পাঠাতে উৎসাহিত করবে, যা জবাবে একটি সাধারণ শুভেচ্ছা বার্তা পাঠাবে।

১০. আপনার বট পরীক্ষা করুন

কিটেনবটকে সরাসরি বার্তা পাঠান:

1f442dd7fd7b5773.png

আপনার চ্যানেলে কিটেনবটকে যুক্ত করতে "@kittenbot" লিখে "Invite Them"-এ ক্লিক করুন।

9788d2167ce47167.png

এখন আপনার চ্যানেলের সবাই কিটেনবটের সাথে যোগাযোগ করতে পারবে!

9c0d1d7907a51767.png

স্ল্যাকের প্রতিটি মেসেজ একটি ইভেন্ট ট্রিগার করে এবং আমাদের ক্লাউড রান সার্ভিসে একটি HTTP POST মেসেজ পাঠায়। আপনি যদি ক্লাউড রান সার্ভিসের লগগুলো দেখেন, তাহলে দেখতে পাবেন যে প্রতিটি মেসেজের সাথে লগের একটি POST এন্ট্রি যুক্ত থাকে।

1ff0c2347bf464e8.png

কিটেনবট প্রতিটি বার্তার উত্তরে লেখে "মিউ। 😺"।

১১. বোনাস - আপনার বট আপডেট করুন

এই ঐচ্ছিক অংশটিতে কয়েক মিনিট সময় লাগবে। আপনি চাইলে সরাসরি পরিষ্করণ অংশে চলে যেতে পারেন।

কথোপকথনের থ্রেড

আমরা চাই বটটি যেন শুধু 'মিউ' বলার চেয়েও বেশি কিছু করে। কিন্তু ক্লাউড রানে চলমান কোনো কিছুর নতুন সংস্করণ কীভাবে স্থাপন করা যায়?

ডিরেক্টরি পরিবর্তন করে cloud-slack-bot/extra-credit এ যান:

cd ../extra-credit/

ক্লাউড শেল এডিটর-এ বর্তমান ফোল্ডারটি খুলুন:

cloudshell workspace .

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

সংলাপটি সংজ্ঞায়িত করুন

প্রথমে, ফাইলের শেষে কথোপকথনমূলক ফাংশনগুলো কীভাবে সংজ্ঞায়িত করা হয়েছে তা দেখুন:

// ...
const maxCats = 20;
const catEmojis = [
  ':smile_cat:',
  ':smiley_cat:',
  ':joy_cat:',
  ':heart_eyes_cat:',
  ':smirk_cat:',
  ':kissing_cat:',
  ':scream_cat:',
  ':crying_cat_face:',
  ':pouting_cat:',
  ':cat:',
  ':cat2:',
  ':leopard:',
  ':lion_face:',
  ':tiger:',
  ':tiger2:',
];

/**
 * Function to concatenate cat emojis
 * @param {number} numCats Number of cat emojis.
 * @return {string} The string message of cat emojis.
 */
function makeCatMessage(numCats) {
  let catMessage = '';
  for (let i = 0; i < numCats; i++) {
    // Append a random cat from the list
    catMessage += catEmojis[Math.floor(Math.random() * catEmojis.length)];
  }
  return catMessage;
}

/**
 * Function to create the kitten conversation
 * @param {Object} controller The botkit controller.
 * @return {Object} The BotkitConversation object.
 */
function createKittenDialog(controller) {
  const convo = new BotkitConversation('kitten-delivery', controller);

  convo.ask('Does someone need a kitten delivery?', [
    {
      pattern: 'yes',
      handler: async (response, convo, bot) => {
        await convo.gotoThread('yes_kittens');
      },
    },
    {
      pattern: 'no',
      handler: async (response, convo, bot) => {
        await convo.gotoThread('no_kittens');
      },
    },
    {
      default: true,
      handler: async (response, convo, bot) => {
        await convo.gotoThread('default');
      },
    },
  ]);

  convo.addQuestion(
    'How many would you like?',
    [
      {
        pattern: '^[0-9]+?',
        handler: async (response, convo, bot, message) => {
          const numCats = parseInt(response);
          if (numCats > maxCats) {
            await convo.gotoThread('too_many');
          } else {
            convo.setVar('full_cat_message', makeCatMessage(numCats));
            await convo.gotoThread('cat_message');
          }
        },
      },
      {
        default: true,
        handler: async (response, convo, bot, message) => {
          if (response) {
            await convo.gotoThread('ask_again');
          } else {
            // The response '0' is interpreted as null
            await convo.gotoThread('zero_kittens');
          }
        },
      },
    ],
    'num_kittens',
    'yes_kittens'
  );

  // If numCats is too large, jump to start of the yes_kittens thread
  convo.addMessage(
    'Sorry, {{vars.num_kittens}} is too many cats. Pick a smaller number.',
    'too_many'
  );
  convo.addAction('yes_kittens', 'too_many');

  // If response is not a number, jump to start of the yes_kittens thread
  convo.addMessage("Sorry I didn't understand that", 'ask_again');
  convo.addAction('yes_kittens', 'ask_again');

  // If numCats is 0, send a dog instead
  convo.addMessage(
    {
      text:
        'Sorry to hear you want zero kittens. ' +
        'Here is a dog, instead. :dog:',
      attachments: [
        {
          fallback: 'Chihuahua Bubbles - https://youtu.be/s84dBopsIe4',
          text: '<https://youtu.be/s84dBopsIe4|' + 'Chihuahua Bubbles>!',
        },
      ],
    },
    'zero_kittens'
  );

  // Send cat message
  convo.addMessage('{{vars.full_cat_message}}', 'cat_message');

  convo.addMessage('Perhaps later.', 'no_kittens');

  return convo;
}

এই নতুন কথোপকথনটি উত্তরের উপর ভিত্তি করে আলোচনার ধারাকে পরিচালিত করে। উদাহরণস্বরূপ, যদি ব্যবহারকারী বিড়ালছানা সংক্রান্ত প্রশ্নের উত্তরে "না" বলেন, তবে এটি সরাসরি "no_kittens" লেবেলযুক্ত বার্তাটিতে চলে যায়, যা সেই কথোপকথনের ধারার সমাপ্তি নির্দেশ করে।

কন্ট্রোলারে ডায়ালগটি যোগ করা

এখন যেহেতু কথোপকথনটি সংজ্ঞায়িত করা হয়েছে, দেখুন কীভাবে এটি কন্ট্রোলারে যুক্ত করতে হয়:

async function kittenbotInit() {
  // ...
  const controller = new Botkit({
    webhook_uri: '/api/messages',
    adapter: adapter,
  });

  // Add Kitten Dialog
  const convo = createKittenDialog(controller);
  controller.addDialog(convo);

  // Controller is ready
  controller.ready(() => {
    // ...
  });
}

ডায়ালগটি চালু করুন

এখন যেহেতু কন্ট্রোলারের ব্যবহারের জন্য ডায়ালগটি উপলব্ধ, দেখুন চ্যাটবট যখন 'kitten', 'kittens', 'cat', বা 'cats' শোনে তখন কথোপকথনটি কীভাবে শুরু হয়:

  // ...

  controller.ready(() => {
    controller.hears(
      ['hello', 'hi', 'hey'],
      ['message', 'direct_message'],
      async (bot, message) => {
        await bot.reply(message, 'Meow. :smile_cat:');
        return;
      }
    );

    // START: listen for cat emoji delivery
    controller.hears(
      ['cat', 'cats', 'kitten', 'kittens'],
      ['message', 'direct_message'],
      async (bot, message) => {
        // Don't respond to self
        if (message.bot_id !== message.user) {
          await bot.startConversationInChannel(message.channel, message.user);
          await bot.beginDialog('kitten-delivery');
          return;
        }
      }
    );
    // END: listen for cat emoji delivery

    // ...
  });

  // ...

অ্যাপটি আপডেট করুন

অ্যাপ্লিকেশনটি ক্লাউড রান-এ পুনরায় স্থাপন করুন:

gcloud run deploy kittenbot \
  --source . \
  --platform managed \
  --region $REGION \
  --set-env-vars PROJECT_ID=$PROJECT_ID \
  --allow-unauthenticated

চেষ্টা করে দেখুন

eca12b3463850d52.png

অভিনন্দন! আপনি এইমাত্র ক্লাউড রান-এ চালিত একটি স্ল্যাক বটকে নতুন সংস্করণে আপডেট করেছেন।

স্ল্যাশ কমান্ড

যদি আপনি ব্যবহারকারীর সাথে কথোপকথন করতে না চান? যদি আপনি কেবল একটি সাধারণ কমান্ডের মাধ্যমে কোনো কাজ শুরু করতে চান?

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

স্ল্যাক স্ল্যাশ কমান্ড সক্রিয় করুন

  • আপনার অ্যাপস ম্যানেজমেন্ট পেজের ফিচারস-এর অধীনে স্ল্যাশ কমান্ডস সেকশনে যান।
  • নতুন কমান্ড তৈরি করুন -এ ক্লিক করুন।
  • আপনার কিটেনবট সার্ভিস URL দিয়ে একটি /cats কমান্ড কনফিগার করুন। মনে রাখবেন, ইভেন্টস এপিআই (Events API) চালু করার জন্য আপনি যে এন্ডপয়েন্টটি ব্যবহার করেছিলেন, সেটিই এখানেও ব্যবহার করতে হবে! এটি হলো আপনার URL, এবং তার সাথে '/api/messages' যুক্ত হবে।

e34d393c14308f28.png

  • আপনার অ্যাপ এবং অনুমতিগুলো আপডেট করতে নির্দেশাবলী অনুসরণ করুন।

আপনার কন্ট্রোলারে স্ল্যাশ কমান্ড যোগ করুন

দেখুন কিভাবে controller.ready ফাংশনের ভিতরে স্ল্যাশ কমান্ডের জন্য একটি হ্যান্ডলার যোগ করা হয়েছিল:

  // ...

  // Controller is ready
  controller.ready(() => {
    // ...

    // START: slash commands
    controller.on('slash_command', async (bot, message) => {
      const numCats = parseInt(message.text);
      const response = makeCatMessage(numCats);
      bot.httpBody({ text: response });
    });
    // END: slash commands
  });

  // ...

চেষ্টা করে দেখুন

স্ল্যাশ কমান্ড পাঠাতে /cats এর সাথে একটি সংখ্যা টাইপ করুন। যেমন: /cats 8

c67f6fe1ffcafec8.png

বটটি ৮টি বিড়ালের ছবি দিয়ে উত্তর দেবে, যা শুধু আপনিই দেখতে পাবেন:

9c1b256987fd379a.png

১২. পরিচ্ছন্নতা

অভিনন্দন, আপনার একটি স্ল্যাক বট এখন ক্লাউড রান-এ চালু আছে। এখন ব্যবহৃত রিসোর্সগুলো পরিষ্কার করার পালা (খরচ বাঁচাতে এবং ক্লাউডের একজন ভালো ব্যবহারকারী হতে)।

প্রকল্পটি মুছে ফেলুন

আপনি সরাসরি ক্লাউড শেল থেকে সম্পূর্ণ প্রজেক্টটি মুছে ফেলতে পারেন:

gcloud projects delete $PROJECT_ID

বিকল্পভাবে, যদি আপনি বিভিন্ন রিসোর্সগুলো এক এক করে মুছে ফেলতে চান, তাহলে পরবর্তী বিভাগে যান।

ডিপ্লয়মেন্টটি মুছে ফেলুন

gcloud run services delete kittenbot --region $REGION

কমান্ড আউটপুট

Service [kittenbot] will be deleted.
Do you want to continue (Y/n)?  y
Deleted service [kittenbot].

আপনার ক্লায়েন্ট সাইনিং সিক্রেট মুছে ফেলুন

gcloud secrets delete client-signing-secret

কমান্ড আউটপুট

You are about to destroy the secret [client-signing-secret] and its
[1] version(s). This action cannot be reversed.
Do you want to continue (Y/n)?  y
Deleted secret [client-signing-secret].

আপনার বট টোকেন গোপনীয়তা মুছে ফেলুন

gcloud secrets delete bot-token

কমান্ড আউটপুট

You are about to destroy the secret [bot-token] and its [1]
version(s). This action cannot be reversed.
Do you want to continue (Y/n)?  y
Deleted secret [bot-token].

স্টোরেজ বাকেটগুলি মুছে ফেলুন

প্রথমে, বাকেট পাথ পেতে গুগল ক্লাউড স্টোরেজ বাকেটগুলির তালিকা করুন:

gsutil ls

কমান্ড আউটপুট

gs://[REGION.]artifacts.<PROJECT_ID>.appspot.com/
gs://<PROJECT_ID>_cloudbuild/

এখন, আর্টিফ্যাক্টস বাকেটটি ডিলিট করুন:

gsutil rm -r gs://[REGION.]artifacts.${PROJECT_ID}.appspot.com/

কমান্ড আউটপুট

Removing gs://[REGION.]artifacts.<PROJECT_ID>.appspot.com/...

অবশেষে, ক্লাউডবিল্ড বাকেটটি মুছে ফেলুন:

gsutil rm -r gs://${PROJECT_ID}_cloudbuild/

কমান্ড আউটপুট

Removing gs://<PROJECT_ID>_cloudbuild/...

১৩. অভিনন্দন!

528302981979de90.png

আপনি এখন জানেন ক্লাউড রানে কীভাবে একটি স্ল্যাক বট চালাতে হয়!

আমরা এই প্রযুক্তির কেবল প্রাথমিক ধারণা দিয়েছি এবং আমরা আপনাকে আপনার নিজস্ব ক্লাউড রান ডেপ্লয়মেন্টের মাধ্যমে আরও অন্বেষণ করতে উৎসাহিত করি।

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

  • স্ল্যাকে একটি বট কাস্টম ইন্টিগ্রেশন তৈরি করা
  • সিক্রেট ম্যানেজার দিয়ে আপনার স্ল্যাকের গোপনীয় তথ্য সুরক্ষিত করুন
  • ক্লাউড রানে আপনার স্ল্যাক বট স্থাপন করা

পরবর্তী পদক্ষেপ

আরও জানুন