সার্ভারলেস কম্পিউটিং সার্ভার ম্যানেজ এবং প্রোভিশন করার কাজ ক্লাউড প্রোভাইডারের হাতে দিয়ে দেয় এবং এটি অধিকাংশ টেকনোলজি টিমের জন্য দ্রুত একটি ট্রেন্ড ব৮তে চলছে। AWS Lambda একটি সার্ভারলেস টেকনোলজি যা অনেক টেকনোলজি টিম ব্যবহার করে। AWS Lambda অধিকাংশ কোর প্রোগ্রামিং ল্যাঙ্গুয়েজ সাপোর্ট করে, যার মধ্যে NodeJS, Java, Python, এবং Ruby। যদিও কোর ল্যাঙ্গুয়েজগুলো সাপোর্ট করা হয়, এমন সময় হতে পারে আপনি এই ল্যাঙ্গুয়েজগুলোর সাথে বিল্ট ফ্রেমওয়ার্কের ফিচারগুলোর উপর নির্ভরশীল সার্ভারলেস ফাংশন চালাতে চান। এই পোস্টে, আমরা এক্সপ্লোর করব কীভাবে একটি রেইলস অ্যাপ্লিকেশন AWS Lambda-তে চালানো যায়। এই পোস্ট অনুমান করে যে আপনি সার্ভারলেস কম্পিউটিং এবং AWS Lambda-র সাথে কনভারসেন্ট এবং আপনি রেইলস Lambda-তে কীভাবে চালাবেন সেটি বের করতে চান। Lamby নামক একটি টুল রেইলস AWS Lambda-তে চালায়া প্রায় جهدলেশ করে, এবং আমরা কভার করব Lamby কীভাবে ব্যবহার করা যায় রেইলস Lambda-তে বিল্ড ও ডিপ্লয় করতে। আমি এটিকে "Rails on Lambda" বলব।
Lamby কি?
Lambda আপনাকে আপনার কোড ডিপ্লয় করতে দেয় এবং যেকোনো স্কেলে রান করতে দেয় সার্ভার মেইনটেইন ছাড়া। আপনি সিম্পলি আপনার কোড AWS-এ আপলোড করুন। এটি রান হবে যখনই ইভেন্ট দ্বারা ট্রিগার হবে, যেমন একজন ইউজার একটি ওয়েব পেজ রিকোয়েস্ট করল বা একটি জব কিউয়েড হয়।
Lambda আপনার কোড একটি নির্দিষ্টভাবে স্ট্রাকচারড থাকতে এক্সপেক্ট করে। তাই, যদি আপনি এটিকে রেইলস অ্যাপ হোস্ট করতে চান, আপনাকে Lamby-এর মতো একটি অ্যাডাপ্টার ব্যবহার করতে হবে।
Lamby একটি সিম্পল Rack অ্যাডাপ্টার। এটি আপনার রেইলস অ্যাপ এবং AWS Lambda-এর মাঝে বসে এবং Lambda ইনভোকেশন ইভেন্টগুলো বিভিন্ন AWS সোর্স থেকে (যেমন API Gateway বা অ্যাপ্লিকেশন লোড ব্যালেন্সার) Rack ইভেন্টে কনভার্ট করে যা আপনার রেইলস অ্যাপ শুনতে পারে।
Rails Lambda আর্কিটেকচার সোর্স: Lamby Docs
Lamby Docker এবং AWS SAM ব্যবহার করে রেইলস অ্যাপ বিল্ড, প্যাকেজ, এবং Lambda-তে ডিপ্লয় করে।
AWS Serverless Application Model (AWS SAM) একটি ওপেন-सোর্স ফ্রেমওয়ার্ক যা আপনি AWS-এ সার্ভারলেস অ্যাপ্লিকেশন বিল্ড করতে ব্যবহার করতে পারেন। একটি সার্ভারলেস অ্যাপ্লিকেশন হলো Lambda ফাংশন, ইভেন্ট সোর্স, এবং অন্যান্য রিসোর্সের কম্বিনেশন যা একসাথে কাজ করে টাস্ক সম্পন্ন করতে। মনে রাখবেন একটি সার্ভারলেস অ্যাপ্লিকেশন শুধু একটি Lambda ফাংশন নয়—এতে অতিরিক্ত রিসোর্সও থাকতে পারে, যেমন APIs, ডেটাবেস, এবং ইভেন্ট সোর্স ম্যাপিং। -- AWS SAM ডকুমেন্টেশন
Lamby-র সাথে শুরু করতে, আমাদের Docker ইনস্টল করতে হবে, একটি AWS একাউন্ট তৈরি করতে হবে, এবং আপনার AWS একাউন্টের প্রোগ্রাম্যাটিক এক্সেস কনফিগার করতে হবে।
Docker ইনস্টল করা
AWS SAM Docker ব্যবহার করে Lambda রানটাইম এনভায়রনমেন্ট সিমুলেট করে। Docker AWS CLI এবং SAM CLI ইনস্টল করার জটিলতাও কমিয়ে দেয়, যেগুলো উভয়ই পাইথনে ডিপেন্ডেন্ট। যদি আপনার ইতিমধ্যে Docker ইনস্টল করা না থাকে, Docker ইনস্টল করা সুপার ইজি, কারণ আপনি অফিশিয়াল ওয়েবসাইট থেকে ডাউনলোড ও ইনস্টল করতে পারেন। আপনার টার্মিনালে নিচের কমান্ড রান করে চেক করুন Docker ইনস্টল আছে কিনা। যদি Docker ইনস্টল থাকে, আপনি একটি ভার্সন নম্বর এবং বিল্ড দেখবেন নিচেরদিকের সাদৃশ্য:
$ docker --version
Docker ইনস্টলেশন কনফার্মেশন
AWS একাউন্ট সেটআপ
যদি আপনার ইতিমধ্যে AWS একাউন্ট না থাকে, তাহলে আপনাকে একটা সেটআপ করতে হবে। Amazon-এ একটি ফ্রি-টিয়ার প্ল্যান আছে, যা রেইলস অ্যাপ Lambda-তে তৈরি ও টেস্ট করার খরচ কভার করবে, এবং AWS একাউন্ট তৈরি ও এক্টিভেট করার গাইডও আছে। গাইড ফলো করে একাউন্ট সেটআপ করুন।
AWS প্রোগ্রাম্যাটিক এক্সেস সেটিং
এখন যেহেতু আপনার AWS একাউন্ট আছে, আপনাকে আপনার একাউন্টের AWS Access Key ID এবং AWS Secret Access Key ব্যবহার করে প্রোগ্রাম্যাটিক এক্সেস কনফিগার করতে হবে। যদি এগুলো ইতিমধ্যে না থাকে, নিচের ধাপগুলো ফলো করে তৈরি করতে পারেন।
- আপনার AWS একাউন্টে লগইন করুন।
- AWS Management Console-এ টুলবার থেকে "Services"-এ ক্লিক করুন।
- "IAM" সার্চ করে সিলেক্ট করুন।
- বাম হাতের নেভিগেশন থেকে "Users"-এ ক্লিক করুন।
- যদি "IAM" ইউজার ইতিমধ্যে থাকে, আপনার ইউজারনেম সিলেক্ট করুন।
- "Security credentials" ট্যাবে ক্লিক করুন।
- "Create access key" বাটনে ক্লিক করুন।
- আপনার কী আইডি এবং সিক্রেট একটি সিকিউর জায়গায় কপি করুন।
- যদি কোন "IAM" ইউজার না থাকে,
- "Add user"-এ ক্লিক করুন।
- একটি ইউজারনেম যোগ করুন এবং "Programmatic access" অপশন সিলেক্ট করুন।
- প্রম্পট ফলো করে প্রসেস সম্পন্ন করুন।
চলুন Docker ব্যবহার করে CLI প্রোগ্রাম্যাটিক এক্সেস কনফিগার করি। নিচের কোড টার্মিনালে কপি করুন। আপনাকে AWS Access Key ID এবং AWS Secret Access Key জন্য প্রম্পট করা হবে; পূর্বের ধাপ থেকে কীগুলো এন্টার করুন।
$ docker run \ --interactive \ --tty \ --rm \ --volume "${HOME}/.aws:/root/.aws" \ "amazon/aws-cli" \ configure 
নতুন রেইলস অ্যাপ্লিকেশন তৈরী
আমরা SAM CLI ব্যবহার করে আমাদের রেইলস প্রজেক্ট বুটস্ট্র্যাপ করব। AWS SAM CLI আপনাকে একটি GitHub রিপোজিটরি টেমপ্লেট থেকে একটি নতুন প্রজেক্ট ইনিশিয়ালাইজ করতে দেয়, যাকে সাধারণত কুকিকাটার বলা হয়। একটি নতুন SAM প্রজেক্ট শুরু করতে, আমরা একটি Docker কন্টেইনার ব্যবহার করব sam init রান করতে, যা Lamby Cookiecutter প্রজেক্ট টেমপ্লেট লিভারেজ করে একটি নতুন প্রজেক্ট ফোল্ডার কিকস্টার্ট করতে। আপনাকে প্রজেক্ট নাম প্রদান করতে বলবে, কিন্তু আমি "rails_on_lambda" ব্যবহার করেছি।
$ docker run \ --rm \ --interactive \ --volume "${PWD}:/var/task:delegated" \ lambci/lambda:build-ruby2.7 \ sam init --location "gh:customink/lamby-cookiecutter" 
আপনার নতুন SAM প্রজেক্ট ফোল্ডারে আপনার নতুন Rails on Lambda প্রজেক্টের জন্য সব কিছু আছে। হায়ার লেভেল থেকে, আপনার নতুন প্রজেক্টে কী জেনারেট হয়েছে সেটি:
- Docker সেটআপ Dockerfile এবং docker-compose দুটো দিয়ে।
- একটি ওয়ার্কিং রুবি প্রজেক্ট lib ডিরেক্টরি, বান্ডলার, এবং টেস্টসহ।
- একটি SAM
template.yamlফাইল।
সেট আপ এবং ডিপ্লয়
এখন যেহেতু আমরা একটি নতুন রেইলস অ্যাপ তৈরি করেছি, আমাদের এটিকে Lambda ডিপ্লয়মেন্টের জন্য সেট আপ করতে হবে। নিচের দুটি কমান্ড স্ক্রিপ্টগুলো রান করে যা একটি Docker ডেভেলপমেন্ট ইমেজ বিল্ড করে এবং জেম বান্ডল করে। bootstrap কমান্ড একবারেই প্রসেস, যেখানে setup কমান্ড প্রতিবার রান হবে আপনি নতুন প্রজেক্ট ডিপেন্ডেন্সি যোগ করলে।
$ ./bin/bootstrap $ ./bin/setup পূর্বের কমান্ডগুলো সফলভাবে এক্সিকিউট হলে, আপনার প্রজেক্ট SAM ব্যবহার করে ডিপ্লয়মেন্টের জন্য প্রস্তুত। ডিপ্লয়মেন্ট একটি Lamby স্ক্রিপ্ট দিয়ে হয় যা আপনার রেইলস অ্যাপ্লিকেশন বিল্ড, প্যাকেজ, এবং ডিপ্লয় করে।
./bin/deploy deploy কমান্ড একটি Lamby বিল্ড স্ক্রিপ্ট রান করে যা আপনার বর্তমান প্রজেক্ট ডিরেক্টরি একটি লোকাল .lamby ডিরেক্টরিতে ডুপ্লিকেট করে এবং আপনার অ্যাপ্লিকেশন ডিপ্লয় করতে তিনটি SAM কমান্ড রান করে।
- sam build
- sam package
- sam deploy
যদি স্ক্রিপ্টগুলো এক্সপেক্টেডভাবে রান হয়, আপনি SAM-এর CloudFormation ডিপ্লয়মেন্ট টাস্কের আউটপুট দেখবেন যেটি এমন কিছু দিয়ে শেষ হবে:

আপনার টার্মিনাল আউটপুটের অংশ হিসেবে একটি URLও দেখবেন। URLটি একটি API Gateway HTTP API এন্ডপয়েন্ট যা আপনার রেইলস অ্যাপ্লিকেশন Rack ব্যবহার করে ইনভোক করে। এটিকে ব্রাউজারে খুলুন, এবং আপনি знаком "Welcome to Rails" স্ক্রিন দেখবেন:

AWS কনসোল থেকে আপনার রেইলস অ্যাপ ইনভোক করা
আমরা আমাদের অ্যাপ Lambda ড্যাশবোর্ড থেকে ও টেস্ট করতে পারি। AWS Management Console-এ লগইন করুন:
- টুলবারে "Services"-এ ক্লিক করুন।
- "Lambda" ফাইন্ড সার্ভিসেস ফিল্ডে লিখুন, সিলেক্ট করুন।
এই পেজ থেকে, আপনি আপনার নতুন ডিপ্লয় করা "RailsOnLambda" প্রজেক্ট দেখবেন।

- "RailsOnLambda" ফাংশনটি খুলুন।
- উপরের ডানে "Test" বাটনে ক্লিক করুন।
- "Amazon API Gateway Proxy" ইভেন্ট টেমপ্লেট ব্যবহার করুন (নিচের JSON টেমপ্লেট ব্যবহার করে সংশ্লিষ্ট ফিল্ডগুলো আপডেট করুন)।
- এটিকে "RailsOnLambdaTest" নাম দিন।
- "Create" বাটনে ক্লিক করুন।
- আপনার Lambda ইনভোক করতে "Test" বাটনে ক্লিক করুন।
{ "body": "", "path": "/", "httpMethod": "GET", "queryStringParameters": {}, "multiValueQueryStringParameters": {}, "pathParameters": { "proxy": "/" }, "stageVariables": {}, "requestContext": { "path": "/", "httpMethod": "GET" } } যদি সব কিছু স্মুথলি চলে, আপনি নিচের মতো আউটপুট দেখবেন।

অভিনন্দন! আপনার এখন Rails on Lambda আছে, যদিও Lambda-এ একটি রেইলস অ্যাপ্লিকেশন এখনও শুধু একটি সাধারণ রেইলস অ্যাপ্লিকেশন। একমাত্র পার্থক্য হচ্ছে Lamby gem API Gateway HTTP API, API Gateway REST API, এবং অ্যাপ্লিকেশন লোড ব্যালেন্সার টার্গেট ইভেন্টগুলো Rack-কম্প্যাটিবল env অবজেক্টে কনভার্ট করে এবং রেইলসে পাঠায়। রেইলস তারপর ইভেন্টের রেজাল্ট Lambda হ্যান্ডলারের কাছে ফেরত পাঠায় যা আপনার প্রজেক্টে ডিফাইন করা আছে।
def handler(event:, context:) Lamby.handler $app, event, context end Rails on Lambda কতটুকু পারফর্ম করে?
Rails on Lambda ডিপ্লয়মেন্টের পরে প্রথম রিকোয়েস্টের জন্য স্লো রেসপন্স টাইম এক্সপেরিয়েন্স করবে। এই ফеномেনাকে "কোল্ড স্টার্ট" বলা হয়। তবে, প্রথম রিকোয়েস্টের পরে, পারফরমেন্স এক্সিলেন্ট এবং EC2-কে মিট বা বিট করতে পারে। যদি প্রথম রিকোয়েস্টের পরে কোনো সাবসিকোয়েন্ট রিকোয়েস্ট না থাকে, রেইলস অ্যাপ সার্ভ করার সার্ভার রিসোর্স প্রায় ৫-৭ মিনিটের পর ডাইনামিকলি অন্য Lambda ফাংশনগুলোকে অ্যালোকেট করা হবে। এটি নতুন রিকোয়েস্টের জন্য কোল্ড স্টার্ট করে। কোল্ড স্টার্ট এড়াতে এবং রেইলস অ্যাপ ওয়ার্ম রাখতে একাদশ উপায় আছে।
CloudWatch টাইমার
আপনি একটি টাইমার সেট আপ করতে পারেন আপনার Rails on Lambda ফাংশনকে প্রতি মিনিট পিং করতে যাতে সেটি ওয়ার্ম থাকে। AWS কনসোল খুলুন এবং CloudWatch সার্চ করুন। সেখান থেকে Events-এ যান এবং Create rule-এ ক্লিক করুন। ইভেন্ট টাইপ সেট করুন Schedule, এবং আমরা এই ইভেন্ট প্রতি ১ মিনিটে রান করব।

প্রোভিশন্ড কনকারেন্সি
প্রোভিশন্ড কনকারেন্সি একটি AWS ফিচার যা আপনাকে টগল করতে দেয় এবং আরও পেমেন্ট করা kabul করলে AWS একটি অনইউজড কন্টেইনার সবসময় রানিং রাখবে। রেইলস অ্যাপের জন্য প্রোভিশন্ড কনকারেন্সি কনফিগার করতে, আপনার AWS কনসোল খুলুন এবং Lambda সার্ভিস পেজ খুলুন।
- একটি ফাংশন বেছে নিন (rails-on-lambda)।
- Configuration বেছে নিন এবং তারপর Concurrency বেছে নিন।
- Provisioned concurrency configurations-এর অধীনে Add configuration-এ ক্লিক করুন।
- Alias বা Version সিলেক্ট করুন।
- প্রোভিশন্ড কনকারেন্সির পরিমাণ লিখুন (যেমন ৫০০) অ্যালোকেট করতে।
- চেঞ্জ সেভ করুন। প্রোভিশন্ড কনকারেন্সি AWS CLI ব্যবহার করেও কনফিগার করা যায় নিচের কমান্ড দিয়ে:
aws lambda put-provisioned-concurrency-config --function-name my-function \ --qualifier BLUE --provisioned-concurrent-executions 100 AWS-এ Lambda-র খরচ কত?
AWS Lambda-এ, আপনি শুধু যা ব্যবহার করবেন তার জন্য পে করবেন। খরচ হলো রিকোয়েস্টের সংখ্যা এবং কোড এক্সিকিউশন ডিউরেশনের কম্বিনেশন। ডিউরেশন প্রাইস নির্ভর করে আপনি আপনার ফাংশনে কত মেমরি অ্যালোকেট করেছেন। মেমরি সাইজ ১২৮ MB থেকে ১০,২৪০ MB পর্যন্ত, এবং আপনি আপনার প্রয়োজন অনুযায়ী যেকোনো পরিমাণ মেমরি অ্যালোকেট করতে পারেন। নিচে একটি চার্ট দেওয়া আছে যা ১০০,০০০ ইনভোকেশন একটি Lambda ফাংশনের ভিন্ন ভিন্ন টাইমের জন্য খরচ দেখাচ্ছে।
Lambda খরচ
কখন রেইলস Lambda-তে চালাতে নয়
আমরা দেখেছি আমরা একটি রেইলস অ্যাপ AWS Lambda-তে চালাতে পারি, কিন্তু কি প্রতিটি রেইলস অ্যাপ্লিকেশন Lambda-তে চালাতে হবে? রেইলস অনুমান করে যে আপনার অ্যাপ্লিকেশন একটি ট্রেডিশনাল সার্ভারে রান করছে এবং সার্ভারলেস নয়। কিছু অপারেশন যা ট্রেডিশনাল রেইলস সার্ভার অ্যাপে সহজে কাজ করে সেগুলো সার্ভারলেসে কাজ নাও করতে পারে। উদাহরণস্বরূপ, ফাইল বা ইমেজ আপলোড রেইলস অন ল্যাম্বডা অ্যাপে কাজ করবে না কারণ অ্যাপটির পারসিস্টেন্ট ফাইলসিস্টেমে অ্যাক্সেস নেই। এছাড়া, WebSocket কমিউনিকেশন Lambda-তে কাজ করবে না কারণ রিকোয়েস্ট না থাকলে আপনার সার্ভার অস্তিত্বে নেই।
উপসংহার
আমরা শুধু একটি বেসিক রেইলস অ্যাপ্লিকেশন ডিপ্লয় করা দেখিয়েছি, কিন্তু লার্জ অ্যাপ্লিকেশনগুলোও একই প্রসেস ফলো করে। বিনামূল্যে কন্ট্রোলার এবং রুট যোগ করুন এবং কনসোল বা Postman এবং যেকোনো HTTP ক্লায়েন্ট থেকে টেস্ট করুন।