ভিজ্যুয়াল স্টুডিও কোড ব্যবহার করে Node.js-এর জন্য ক্লাউড ফাংশন সহ স্থানীয় উন্নয়ন

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

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

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

ধাপে ধাপে নির্দেশিকা

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

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

  • নোড.জেএস-এর জন্য ফাংশন ফ্রেমওয়ার্ক।
  • স্থানীয়ভাবে একটি HTTP ক্লাউড ফাংশন তৈরি ও পরীক্ষা করুন।
  • আপনার স্থানীয় মেশিন থেকে একটি HTTP ফাংশন ডিবাগ করুন।
  • আপনার স্থানীয় মেশিন থেকে একটি HTTP ফাংশন স্থাপন করুন।

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

পূর্বশর্ত

খরচ

যদিও এই কোডল্যাবে একটি ডেপ্লয় করা ক্লাউড ফাংশনের মাত্র ১টি ইনভোকেশন প্রয়োজন, বিলিং কীভাবে কাজ করে তা বোঝার জন্য আপনার ক্লাউড ফাংশনস এপিআই-এর মূল্য সংক্রান্ত তথ্য দেখে নেওয়া উচিত।

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

৩. Node.js-এর জন্য ফাংশনস ফ্রেমওয়ার্ক ইনস্টল করুন

Node.js-এর জন্য ফাংশনস ফ্রেমওয়ার্ক হলো একটি ওপেন সোর্স FaaS (ফাংশন অ্যাজ আ সার্ভিস) ফ্রেমওয়ার্ক, যা গুগল ক্লাউড ফাংশনস টিমের তৈরি এবং পোর্টেবল Node.js ফাংশন লেখার জন্য ব্যবহৃত হয়।

ফাংশনস ফ্রেমওয়ার্ক আপনাকে হালকা ওজনের ফাংশন লিখতে দেয় যা বিভিন্ন পরিবেশে চলে, যার মধ্যে রয়েছে:

  • গুগল ক্লাউড ফাংশন
  • আপনার স্থানীয় উন্নয়ন যন্ত্র
  • ক্লাউড রান এবং জিকেই-তে ক্লাউড রান
  • স্থানীয়-ভিত্তিক পরিবেশ

একটি নতুন নোড.জেএস অ্যাপ তৈরি করুন।

npm init

ডিফল্টগুলো গ্রহণ করার সময়, আপনার অ্যাপের এন্ট্রি পয়েন্ট হিসেবে index.js ব্যবহার করতে ভুলবেন না।

এখন Node.js-এর জন্য ফাংশনস ফ্রেমওয়ার্কটি ইনস্টল করুন।

npm install @google-cloud/functions-framework

আপনার package.json ফাইলটি খুলুন। নিচের উদাহরণে দেখানো অনুযায়ী, functions framework-টি একটি ডিপেন্ডেন্সি হিসেবে তালিকাভুক্ত আছে কিনা তা যাচাই করুন।

"dependencies": {
   "@google-cloud/functions-framework": "^1.7.1"
 }

ফাংশনস ফ্রেমওয়ার্কটি এখন সফলভাবে ইনস্টল করা হয়েছে। আপনি এখন আপনার ক্লাউড ফাংশন তৈরি করার জন্য প্রস্তুত।

৪. স্থানীয়ভাবে একটি HTTP ক্লাউড ফাংশন তৈরি ও পরীক্ষা করুন

একটি স্থানীয় ক্লাউড ফাংশন তৈরি করুন

এই অংশে, আপনি একটি HTTP ফাংশন তৈরি ও পরীক্ষা করবেন যা HTTP অনুরোধের জবাব দেয়।

আপনার package.json ফাইলের ডিরেক্টরিতেই index.js নামে একটি নতুন ফাইল তৈরি করুন।

নিম্নলিখিতগুলি যোগ করুন:

exports.validateTemperature = async (req, res) => {
 try {
   if (req.body.temp < 100) {
     res.status(200).send("Temperature OK");
   } else {
     res.status(200).send("Too hot");
   }
 } catch (error) {
   //return an error
   console.log("got error: ", error);
   res.status(500).send(error);
 }
};

আপনি এখন ফাংশনটি পরীক্ষা করার জন্য প্রস্তুত।

ভিজ্যুয়াল স্টুডিও কোডে টেস্ট ফাংশন

এখন থেকে এই কোডল্যাবটিতে ভিজ্যুয়াল স্টুডিও কোডের ইন্টিগ্রেটেড টার্মিনাল ব্যবহার করা হবে।

ভিজ্যুয়াল স্টুডিও কোডে একটি টার্মিনাল উইন্ডো খুলুন।

নিম্নলিখিত কমান্ডটি চালান:

node node_modules/@google-cloud/functions-framework --target=validateTemperature

এই কমান্ডটি একটি লোকাল সার্ভার চালু করে, যা কোনো HTTP রিকোয়েস্ট পেলে validateTemperature ফাংশনটি কল করার জন্য প্রস্তুত থাকে।

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

Serving function...
Function: validateTemperature
URL: http://localhost:8080/

VS Code-এর টার্মিনাল উইন্ডো প্যানে থাকা ' New Terminal প্লাস আইকনে ক্লিক করে একটি দ্বিতীয় টার্মিনাল উইন্ডো তৈরি করুন। আপনি এই দুটি টার্মিনাল উইন্ডোর মধ্যে পরিবর্তন করবেন: প্রথমটি ফাংশনটি সার্ভ করার জন্য এবং দ্বিতীয়টি curl ব্যবহার করে ফাংশনটি কল করার জন্য।

bceb65f366d837ae.png

আপনি ড্রপ-ডাউন ব্যবহার করে টার্মিনাল উইন্ডোগুলোর মধ্যে পরিবর্তন করতে পারেন। যদি কোনো টার্মিনাল উইন্ডো বর্তমানে কোনো ফাংশন পরিচালনা করে, তাহলে ড্রপ-ডাউন তালিকাটি সেটিকে node হিসেবে উল্লেখ করে। অন্যথায়, এটিকে zsh (বা আপনার ব্যবহৃত শেল) হিসেবে উল্লেখ করা হয়।

দ্বিতীয় টার্মিনাল উইন্ডোতে, validateTemperature ফাংশনটি পরিবেশনকারী লোকাল সার্ভারে ৫০-এর একটি টেম্পারেচার পেলোড পাঠাতে নিম্নলিখিত কমান্ডটি চালান।

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"50"}'

ক্লাউড ফাংশন থেকে আপনি নিম্নলিখিত প্রতিক্রিয়াটি পাবেন:

Temperature OK

দ্বিতীয় টার্মিনাল উইন্ডোতে, নিচে দেখানো অনুযায়ী একটি "অতিরিক্ত উচ্চ" তাপমাত্রার পেলোড পাঠিয়ে ফাংশনটি পুনরায় পরীক্ষা করুন:

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"120"}'

ক্লাউড ফাংশন থেকে আপনি নিম্নলিখিত প্রতিক্রিয়াটি পাবেন:

Too hot

সবশেষে, কোনো পেলোড ছাড়া ফাংশনটি কল করে পরীক্ষা করুন।

curl -X POST http://localhost:8080

ক্লাউড ফাংশন থেকে আপনি নিম্নলিখিত প্রতিক্রিয়াটি পাবেন:

Too hot

আদর্শগতভাবে, কোনো তাপমাত্রা প্রদান করা না হলে ফাংশনটির "too hot" রিটার্ন করা উচিত নয়। আপনি কোডটিতে একটি বাগ খুঁজে পেয়েছেন।

আপনার ফাংশনটি চালু থাকা প্রথম টার্মিনাল উইন্ডোতে Ctrl + C চেপে এর চলমান অবস্থা বন্ধ করুন।

৫. আপনার স্থানীয় মেশিন থেকে একটি HTTP ফাংশন ডিবাগ করুন

ভিজ্যুয়াল স্টুডিও কোডে কমান্ড প্যালেট খুলুন। আপনি যদি ম্যাক ব্যবহার করেন, তাহলে Cmd + Shift + P ব্যবহার করুন। আর যদি উইন্ডোজ ব্যবহার করেন, তাহলে Ctrl + Shift + P. ব্যবহার করুন।

কমান্ড প্যালেটে auto attach টাইপ করুন এবং তালিকার উপরের আইটেমটি বেছে নিন।

601e542b4ec9f6f9.png

এই কোডল্যাবের জন্য, নিচের ছবিতে দেখানো অনুযায়ী Only With Flag বিকল্পটি বেছে নিন:

b9e6b762d150e62b.png

এখন, একদম ডানদিকে প্রদর্শিত সতর্কীকরণ আইকনটির উপর মাউস রেখে, VS Code-এ আপনার ফাংশনটি চালানোর জন্য ব্যবহৃত টার্মিনাল উইন্ডোটি রিলোড করুন।

Relaunch Terminal ক্লিক করুন।

37b61e3fb546fc76.png

পুনরায় লোড করা টার্মিনাল উইন্ডো থেকে, নিম্নলিখিত কমান্ডটি ব্যবহার করে আপনার ফাংশনটি সার্ভ করার জন্য ফাংশন ফ্রেমওয়ার্কটি পুনরায় চালান:

node --inspect node_modules/.bin/functions-framework --target=validateTemperature

যেখানে --inspect ফ্ল্যাগটি Node.js-কে একটি ডিবাগিং ক্লায়েন্টের জন্য অপেক্ষা করতে বলে। আরও তথ্যের জন্য, অনুগ্রহ করে ডিবাগিং বিষয়ে Node-এর ডকুমেন্টেশন দেখুন।

লক্ষ্য করুন যে আপনি node_modules/ @google-cloud /functions-framework-এর পরিবর্তে node_modules/ .bin /functions-framework ব্যবহার করছেন। ইন্সপেক্ট মোড ব্যবহার করার জন্য আপনাকে /node_modules/.bin-এ থাকা স্বয়ংক্রিয়ভাবে সিমলিঙ্ক করা এক্সিকিউটেবলটি ব্যবহার করতে হবে।

এবার আপনি ভিএস কোডে একটি কমলা রঙের স্ট্যাটাস বার দেখতে পাবেন, যা নির্দেশ করে যে ডিবাগারটি সংযুক্ত হয়েছে।

লাইন নম্বরের বাম দিকের মার্জিনের ভেতরে ক্লিক করে ৩ নম্বর লাইনে একটি ব্রেকপয়েন্ট সেট করুন।

2fbb4d5916e1dbfa.png

ব্রেকপয়েন্ট আইকনটি উজ্জ্বল লাল রঙে আলোকিত হবে, যা নির্দেশ করে যে কোডের এই লাইনটি ডিবাগারের নাগালের মধ্যে রয়েছে।

846e6c5993cc87f9.png

দ্বিতীয় টার্মিনাল উইন্ডোতে, নিম্নলিখিত কার্ল (curl) কমান্ডটি চালিয়ে ব্রেকপয়েন্টটি হিট করুন।

curl -X POST http://localhost:8080 

আপনি ৩ নং লাইনের উপর একটি হলুদ হাইলাইট দেখতে পাবেন। এই হাইলাইটটি নির্দেশ করে যে, এই লাইনটিই হলো সেই স্টেটমেন্ট যা ডিবাগার দ্বারা বর্তমানে মূল্যায়ন করা হচ্ছে।

206c7ed1eb189e90.png

temp ভেরিয়েবলটির উপর মাউস নিয়ে গেলে এর বিষয়বস্তু undefined আছে কিনা তা যাচাই করতে পারবেন, কারণ অনুরোধটিতে কোনো তাপমাত্রা পেলোড প্রদান করা হয়নি।

97979025f4bf2842.png

পরবর্তী স্টেটমেন্টটি কার্যকর করতে স্টেপ-ওভার আইকনটিতে ক্লিক করুন।

আপনি দেখবেন বর্তমান স্টেটমেন্টটি if স্টেটমেন্টের else অংশে চলে যাবে।

cf0e8ce7e0388f98.png

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

ডিবাগার সংযোগ বিচ্ছিন্ন করতে ডিসকানেক্ট বোতামে ক্লিক করুন।

1070d059775ad769.png

আপনার প্রথম টার্মিনাল উইন্ডোতে, Ctrl + C চেপে চলমান ফাংশনটির সার্ভিং বন্ধ করুন।

আপনার ফাংশনটি আপডেট করে একটি if স্টেটমেন্ট যোগ করুন, যা নিচে দেখানো অনুযায়ী temperature অনির্ধারিত থাকলে একটি এক্সেপশন থ্রো করবে:

exports.validateTemperature = async (req, res) => {

 try {

   // add this if statement below line #2
   if (!req.body.temp) {
     throw "Temperature is undefined";
   }

 ...

আপনার প্রথম টার্মিনাল উইন্ডোতে, ডিবাগার সংযুক্ত হওয়া এড়াতে –inspect ফ্ল্যাগটি ছাড়া নিম্নলিখিত কমান্ডটি চালিয়ে আপনার ক্লাউড ফাংশনটি পুনরায় চালু করুন।

node node_modules/@google-cloud/functions-framework --target=validateTemperature

আপনার দ্বিতীয় টার্মিনাল উইন্ডোতে নিম্নলিখিত কমান্ডটি চালিয়ে একটি এক্সেপশন থ্রো হয়েছে কিনা তা যাচাই করুন:

curl -X POST http://localhost:8080 

আপনার অনুরোধ থেকে নিম্নলিখিত আউটপুটটি ফেরত আসবে:

Temperature is undefined

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

Serving function...
Function: validateTemperature
URL: http://localhost:8080/
got error:  Temperature is undefined

এখন আপনি আপনার প্রথম টার্মিনাল উইন্ডোতে Ctrl + C চেপে ফাংশনটি চালানো বন্ধ করতে পারেন।

৬. আপনার লোকাল মেশিন থেকে গুগল ক্লাউডে একটি HTTP ফাংশন ডিপ্লয় করুন

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

নিম্নলিখিত কমান্ডটি চালিয়ে যাচাই করুন যে আপনি ধাপ ২-এ তৈরি করা প্রজেক্টটি স্থানীয়ভাবে ব্যবহার করছেন:

gcloud config get-value project

ধাপ ২-এ আপনার নির্দিষ্ট করা প্রজেক্টটি যদি সক্রিয় কনফিগারেশন না হয়, তাহলে নিম্নলিখিত কমান্ডটি চালান:

gcloud config set project <project-name-created-step-2>

যেকোনো টার্মিনাল উইন্ডোতে নিম্নলিখিত কমান্ডটি চালান:

gcloud functions deploy validateTemperature --trigger-http --runtime nodejs12 --allow-unauthenticated

যেখানে প্যারামিটারগুলো নিম্নরূপভাবে ব্যাখ্যা করা হয়েছে:

  • deploy validateTemperature - এটি gcloud-এর একটি সাবকমান্ড, যা validateTemperature নামের একটি ক্লাউড ফাংশনকে validateTemperature নামক এন্ট্রি পয়েন্ট সহ ডিপ্লয় করার জন্য ব্যবহৃত হয়।
  • --trigger-http - ট্রিগারিং ইভেন্টের ধরণ
  • --runtime nodejs12 - এই ফাংশনের জন্য নির্ধারিত রানটাইম
  • --allow-unauthenticated - ফাংশনটি কল করার জন্য সর্বজনীন অ্যাক্সেসের অনুমতি দেয়

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

API [cloudfunctions.googleapis.com] not enabled on project 
[1057316433766]. Would you like to enable and retry (this will take a 
few minutes)? (y/N)? y 

ডেপ্লয়মেন্ট সম্পন্ন হলে, আপনি আউটপুটে নিম্নলিখিত বিষয়গুলো দেখতে পাবেন:

Deploying function (may take a while - up to 2 minutes)...done. 
availableMemoryMb: 256
buildId: <your-build-id>
entryPoint: validateTemperature
httpsTrigger:
  url: https://<your-region-and-project>.cloudfunctions.net/validateTemperature
...

আপনার টার্মিনাল উইন্ডোতে, curl ব্যবহার করে এই পাবলিক এন্ডপয়েন্টটি কল করুন।

curl -X POST https://<your-region-and-project>.cloudfunctions.net/validateTemperature -H "Content-Type:application/json"  -d '{"temp":"50"}'

এবং উপযুক্ত প্রতিক্রিয়া যাচাই করে নিশ্চিত করুন যে আপনার ক্লাউড ফাংশনটি সফলভাবে স্থাপন করা হয়েছে।

Temperature OK

৭. পরিষ্কার করুন

অনিচ্ছাকৃত চার্জ এড়াতে, যেমন যদি এই ক্লাউড ফাংশনটি ফ্রি টিয়ারে আপনার মাসিক ক্লাউড ফাংশন ব্যবহারের বরাদ্দের চেয়ে অনিচ্ছাকৃতভাবে বেশিবার চালু হয়ে যায়, তাহলে আপনি হয় ক্লাউড ফাংশনটি অথবা ধাপ ২-এ তৈরি করা প্রজেক্টটি ডিলিট করে দিতে পারেন।

ক্লাউড ফাংশনটি ডিলিট করতে, https://console.cloud.google.com/functions/ ঠিকানায় ক্লাউড ফাংশন ক্লাউড কনসোলে যান। নিশ্চিত করুন যে ধাপ ২-এ আপনার তৈরি করা প্রজেক্টটিই বর্তমানে নির্বাচিত প্রজেক্ট।

ধাপ ৬-এ আপনি যে validateTemperature ফাংশনটি স্থাপন করেছিলেন, সেটি নির্বাচন করুন। তারপর ডিলিট চাপুন।

4dada486485a935a.png

আপনি যদি পুরো প্রজেক্টটি মুছে ফেলতে চান, তাহলে https://console.cloud.google.com/cloud-resource-manager -এ গিয়ে, ধাপ ২-এ তৈরি করা প্রজেক্টটি নির্বাচন করুন এবং 'ডিলিট' (Delete) বিকল্পটি বেছে নিন। প্রজেক্টটি মুছে ফেললে, আপনাকে আপনার ক্লাউড এসডিকে (Cloud SDK)-তে প্রজেক্ট পরিবর্তন করতে হবে। আপনি 'gcloud projects list' কমান্ডটি চালিয়ে সমস্ত উপলব্ধ প্রজেক্টের তালিকা দেখতে পারেন।

৮. অভিনন্দন!

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

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

  • নোড.জেএস-এর জন্য ফাংশন ফ্রেমওয়ার্ক।
  • স্থানীয়ভাবে একটি HTTP ক্লাউড ফাংশন তৈরি ও পরীক্ষা করুন।
  • আপনার স্থানীয় মেশিন থেকে একটি HTTP ফাংশন ডিবাগ করুন।
  • আপনার স্থানীয় মেশিন থেকে একটি HTTP ফাংশন স্থাপন করুন।