ফায়ারবেজ ফাংশন নিয়ে বিস্তারিত

যারা ফায়ারবেজ নিয়ে কাজ করে, তাদের মাঝে মধ্যে ফায়ারবেজ ফাংশন নিয়ে কাজ করতে হয়। ফায়ারবেজ ফাংশন কি, কিভাবে লিখতে হয় এসব নিয়ে জানব এই লেখায়।

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

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

ফায়ারবেজ ফাংশন লেখা

ফায়ারবেজে গিয়ে নির্দিষ্ট প্রজেক্ট সিলেক্ট করব অথবা নতুন একটা প্রজেক্ট তৈরি করে নিব। এরপর Funtions এ ক্লিক করব।

দুই ভাবে ক্লাউড রান ফাংশন তৈরি করা যায়। গুগল ক্লাউড থেকে এবং নিজ কম্পিউটার থেকে কমান্ড লাইন ব্যবহার করে।

কমান্ডলাইন ইন্টারফেস ব্যবহার করে ক্লাউড ফাংশন তৈরি

কমান্ডলাইন ইন্টারফেস ব্যবহারের জন্য কম্পিউটারে Node.js ইন্সটল করা থাকতে হবে। এরপর Firebase CLI ইন্সটল করবঃ

npm install -g firebase-tools

এরপর প্রথমে ফায়ারবেজে লগিন করতে হবেঃ

firebase login

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

firebase init functions

এখানে আমাদের কয়েকটা স্টেপ ফলো করতে হবে। যেমন নতুন প্রজেক্ট তৈরি করব নাকি আগের কোন প্রজেক্টে কাজ করব। যদি আগের কোন প্রজেক্টে সিলেক্ট করি, তাহলে সব গুলো ফায়ারবেজ প্রজেক্টের লিস্ট দেখাবে। সেখান থেকে সিলেক্ট করতে পারব। এরপর জিজ্ঞেস করবে কোন ল্যাঙ্গুয়েজ ব্যবহার করব। এখানে জাভাস্ক্রিপ্ট, টাইপস্ক্রিপ্ট অথবা পাইথন সিলেক্ট করা যাবে। আমি জাভাস্ক্রিপ্ট সিলেক্ট করলাম।

এরপর জিজ্ঞেস করবে “Do you want to use ESLint to catch probable bugs and enforce style?”

ESLint হচ্ছে কোড এনালাইসিস টুল, যা এরর এবং বাগ ফিক্স করতে সাহায্য করবে। এটা অপশনাল। Y অথবা N যে কোন একটা সিলেক্ট করব। শুরুতে N দিয়ে শুরু করতে পারি। কারণ এই ESLint অনেক স্ট্রিক্ট। কোডিং স্ট্রাকচার একটু উল্টা পাল্টা হলেও ভুল ধরবে।

এরপর জিজ্ঞেস করবে “Do you want to install dependencies with npm now?”

আমরা যদি প্রজেক্ট ডিরেক্টরিতে যাই, দেখব package.json অনেক গুলো ডিপেন্ডেন্সি যোগ করা আছে। Y লিখে এন্টার প্রেস করলে এগুলো ইন্সটল হবে।

প্রজেক্টের index.js ফাইলে একটা স্যাম্পল ফাংশন লেখা থাকবেঃ

exports.helloWorld = onRequest((request, response) => {
  logger.info("Hello logs!", {structuredData: true});
  response.send("Hello from Firebase!");
});

যা আন-কমেন্ট করে নিব।। ফায়ারবেজে ফাংশন গুলো ডিপ্লয় করার আগে আমরা লোকালি ফাংশন গুলো রান করে দেখতে পারব। তার জন্য নিচের কমান্ড লিখবঃ

firebase emulators:start --only functions

সব ঠিক থাকলে নিচের মত দেখবঃ

এখানে http://127.0.0.1:5001/booklibrary-21e5c/us-central1/helloWorld হচ্ছে আমরা ফাংশনের লোকাল এড্রেস। ব্রাউজারে যদি এই এড্রেসে পয়েন্ট করি, তাহলে দেখব Hello from Firebase!। এই এড্রেসের ব্রেকডাউনঃ

function name: helloWorld
URL: http://localhost:5001/<your-project-id>/us-central1/helloWorld

এছাড়া ফায়ারবেজ ইমিউলেটর UI দেখা যাবে http://127.0.0.1:4000/ এড্রেসে।

এবার চাইলে এই ফাংশন আমরা ফায়ারবেজে ডিপ্লয় করতে পারব। তার জন্য লিখবঃ

firebase deploy --only functions

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

The following functions are found in your project but do not exist in your local source code:
...
If you are renaming a function or changing its region, it is recommended that you create the new function first before deleting the old one to prevent event loss. For more info, visit https://firebase.google.com/docs/functions/manage-functions#modify

✔ Would you like to proceed with deletion? Selecting no will continue the rest of the deployments.

ডিলেট করতে না চাইলে N প্রেস করে এন্টার প্রেস করব। আমাদের জন্য সেইফ অপশন হচ্ছে একটা নির্দিষ্ট ফাংশন ডিপ্লয় করা।

firebase deploy --only functions:functionName

একই ভাবে যদি আমাদের লোকাল প্রজেক্টে একাধিক ফাংশন থাকে, আমরা চাইলে শুধু মাত্র নির্দিষ্ট ফাংশন ডিপ্লয় করতে পারি। তার জন্য এভাবে কমান্ড লিখবঃ

firebase deploy --only functions:functionName

ডিপ্লয় করলে ফাংশনের ধরণ অনুযায়ী ঐ ফাংশনের URL রিটার্ণ করবে। এছাড়া ফায়ারবেজ কনসোল > ফাংশন থেকেও ঐ ফাংশন এবং তা সম্পর্কে বিস্তারিত দেখতে পাবেন।

প্রজেক্ট পরিবর্তন

আমরা যদি প্রজেক্ট ইনিশিয়ালাইজের সময় একটা ফায়ারবেজ প্রজেক্ট সিলেক্ট করি, কিন্তু মূলত অন্য আরেকটা প্রজেক্টে কাজ করব, তখন ঐ প্রজেক্টটা পরিবর্তন করে নিতে পারি। প্রজেক্টের ভেতর .firebaserc নামে একটা ফাইল থাকবে। ঐ ফাইলে কোন প্রজেক্টে কাজ করছি, তা লেখা থাকে।

{
  "projects": {
    "default": "project name"
  }
}

তার জন্য লিখবঃ

firebase use --add

এখানে প্রথমে জিজ্ঞেস করবেঃ Which project do you want to add?। যে প্রজেক্টে কাজ করব, তা সিলেক্ট করব।

এরপর জিজ্ঞেস করবে What alias do you want to use for this project?। আমরা এখানে লিখব default। তাহলে ডিফল্ট ভাবে এই প্রজেক্টটা ব্যবহার করবে।

যদিও একই প্রজেক্টে একাধিক ফায়ারবেজ প্রজেক্ট যোগ করা যাবে। সেই ক্ষেত্রে What alias do you want to use for this project? জিজ্ঞেস করলে staging বা অন্য কোন নাম দিব। এরপর লিখবঃ

firebase use staging

তাহলে ফায়ারবেজের ঐ প্রজেক্টে সুইচ হবে।

গুগল ক্লাউড থেকে ক্লাউড রান প্রজেক্ট তৈরি

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

এরপর সাধারণত নিচের মত ইন্টারফেস দেখতে পাবো।

এখান থেকে View All Products এ ক্লিক করব।

সার্ভারলেস অপশনে গেলে Cloud Run Funtions দেখতে পাবো। এটাকে যদি পিন করে রাখি, তাহলে পরবর্তীতে সাইডবার থেকেও এক্সেস করতে পারব। এখানে ক্লাউড রান ফাংশনে ক্লিক করব। যদি কোন ফাংশন তৈরি করা থাকে, তাহলে এখানে দেখাবে। আমরা নতুন একটা ফাংশন তৈরি করব। তার জন্য উপর থেকে Write a funtion এ ক্লিক করব।

গুগল তাদের ইন্টারফেস অনেক সময় পরিবর্তন করে। ভবিষ্যতে হয়তো অন্য যায়গায় এই বাটন থাকবে।

  • এখানে গিটহাব বা ডকার থেকেও ফাংশন ডিপ্লয় করা যাবে। আমরা ইনলাইন ফাংশন তৈরি করব, তাই Funtion সিলেক্ট করব।
  • এরপর প্রজেক্টের নাম দিতে হবে। এই নাম ব্যবহার করে প্রজেক্টের ভেতর এই ফাংশনটাকে কল করা যাবে।
  • রিজিয়ন সিলেক্ট করে দিব। এখানে দেখতে হবে আমাদের ইউজার বেজ কোন রিজিয়নে বেশি, ঐ রিজিয়ন সিলেক্ট করলে ল্যাটেন্সি কম হবে। (অপশনাল, অটো সিলেক্ট থাকবে)
  • এরপর এই ফাংশন পাবলিকলি এক্সেস করা যাবে কিনা, তা সিলেক্ট করতে বলবে। আমরা আপাতত সিম্পল একটা ফাংশন তৈরি করব, যা পাবলিকলি এক্সেস করা যাবে। এই তো, কনফিগারেশন শেষ। এরপর ক্রিয়েট বাটনে ক্লিক করব।

ক্রিয়েট করার পর আমাদের ইনলাইন এডিটরে নিয়ে যাবে। যেখানে HelloWorld কোড লেখা থাকবেঃ

const functions = require('@google-cloud/functions-framework');

functions.http('helloHttp', (req, res) => {
  res.set('Content-Type', 'text/plain');
  res.send(`Hello ${req.query.name || req.body.name || 'World'}!`);
});

কোড লেখার পর উপরের দিকে Save and Deploy তে ক্লিক করব। তাহলে এই ক্লাউড রান ফাংশন ডিপ্লয় হবে। কিছু সময় নিবে ডিপ্লয় হতে।

এখানে একটা URL দেখব। ডিপ্লয় হলে আমরা ঐ URL এ ভিজিট করলে দেখাবে “Hello World”। আবার রিকোয়েস্ট বডিতে name ভ্যারিয়েবল পাঠালে ঐ নাম দেখাবে। যেমন

/?name=Your%20Name

ঐ URL এর শেষে যদি আমরা এই রিকোয়েস্ট বডি পাঠাই, তাহলে দেখাবে Hello Your Name!

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

বিদ্রঃ আমরা যদি গুগল ক্লাউড থেকে কোন ফাংশন তৈরি করি, তা কিন্তু ফায়ারবেজ ফাংশনের আন্ডারে দেখাবে না। যদিও ঐ ফাংশন দিয়ে আমরা ফায়ারবেজের সব কাজই করতে পারব। মানে হচ্ছে সকল ফায়ারবেজ ফাংশনই ক্লাউড ফাংশন। যখন ক্লাউড রান থেকে ফাংশন তৈরি করি, তখন ফায়ারবেজের জন্য হয়তো সঠিক লেভেল তৈরি করে না, তাই ফায়ারবেজ ফাংশনের আন্ডারে দেখায় না।

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

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

Leave a Comment