কম্পিউটার টিউটোরিয়াল

AWS Lambda-এ Ruby দক্ষতা অর্জন: স্কেলেবল, ইভেন্ট-ড্রাইভড ফাংশন বিল্ড করুন

AWS Lambda আমাদেরকে ওভারহেড ন্যূনতম করে স্কেলেবল ফাংশন সেট আপ করতে দেয়। একটি পুরো Ruby on Rails অ্যাপ লিখে, হোস্ট করে এবং মেইনটেইন করার বদলে, আমরা ইনডিভিজুয়াল ইভেন্টসকে স্বাধীনভাবে রেসপন্ড করতে Lambda ফাংশন ব্যবহার করতে পারি। এই আর্টিকেলটি আপকে AWS নতুন ব্যবহারকারীর থেকে নিজস্ব Lambda ফাংশনে Ruby লিখতে নিয়ে যাবে।

Lambda আপনাকে সার্ভার ম্যানেজ না করে ইভেন্টসের রেসপন্সে কোড রান করতে দেয়। এই ইভেন্ট-ড্রাইভড আর্কিটেকচার নিশ্চিত করে যে আপনি শুধু তখনই পে করেন যখন আপনার কোড আপনার জন্য কাজ করছে, না যে আপনার কোড আইডল অবস্থায় থাকা সময়ে। Lambda সাধারণত AWS ইকোসিস্টেমের ভিতরের ইভেন্টস রেসপন্ড করতে ব্যবহৃত হয়, যেমন S3 বাকেটে ফাইল ডিলিট করা, কিন্তু এটিকে AWS API Gateway-এর সাথে কনফিগার করে API-র মতো কাজ করতেও ব্যবহার করা যায়।

Lambda ব্যবহার করে টাইম-বেজড টাস্ক অটোমেট করা যায়, যেমন Cron Jobs, বা ইভেন্টসের রেসপন্সে। এটি ডেটা প্রসেসিং-এ প্রসারিত হতে পারে, প্রায়শই অন্যান্য AWS সার্ভিসের সাথে, যেমন DynamoDB, বা এমনকি একটি স্কেলেবল API-তে। উদাহরণস্বরূপ, Amazon-এর ডকুমেন্টেশন থেকে নিচের ডায়াগ্রামটি একটি সিম্পল আর্কিটেকচার দেখায় যেখানে একটি মোবাইল ক্লায়েন্ট HTTP রিকোয়েস্ট করে, অনুমান করা যেতে পারে ডেটাবেসে কিছু CRUD অ্যাকশন পারফর্ম করতে। API Gateway রিকোয়েস্টটি সংশ্লিষ্ট Lambda ফাংশনে রাউট করে (যেমন Rails HTTP রিকোয়েস্ট কন্ট্রোলারে রাউট করে), এবং এটি বিজনেস লজিক পারফর্ম করে এবং AWS DynamoDB-এর সাথে কমিউনিকেট করে রিকোয়েস্ট পূরণ করে।

AWS Lambda-এ Ruby দক্ষতা অর্জন: স্কেলেবল, ইভেন্ট-ড্রাইভড ফাংশন বিল্ড করুন

যেহেতু আমাদের কোড একটি কন্টেইনারে রান হয়, Amazon-এর ইনফ্রাস্ট্রাকচার অটোমেটিক্যালি ফাংশনটিকে একটি সর্ট অফ স্লিপ মোডে রাখে যখন এটি ব্যবহার হচ্ছে না। যখন একটি নতুন রিকোয়েস্ট আসে, কন্টেইনারের কোল্ড স্টেট থেকে শুরু করতে হয়, যা এক্সিকিউশন টাইম ২০০০ ms পর্যন্ত বাড়াতে পারে। এটি কেবল রেসপন্স টাইমের দিক থেকে আপনার কোয়ারিটি অফ সার্ভিস ডিগ্রেড করে না, বরং আপনাকে টাকাও খরচ করতে পারে। এই কারণেই, ইউজার ইমেইল পাঠানো বা UI ইভেন্টস রেসপন্ড করার মতো টাইম-সেনসিটিভ টাস্কের জন্য Lambda ব্যবহার করা বটলনেক তৈরি করতে পারে। আপনি AWS CloudWatch শিডিউল করে পিরিওডিক রিকোয়েস্ট করে ফাংশনটি 'वार্ম' রাখতে পারেন এই সমস্যা মিটিগেট করতে, কিন্তু এটি হোস্টিং খরচ বাড়াবে।

AWS Lambda কেন ব্যবহার করবেন

Amazon Web Services (AWS) বিশ্বের সবচেয়ে জনপ্রিয় ক্লাউড কম্পিউটিং সার্ভিস। এটি স্বাধীন ডেভেলপারদের জন্য যথেষ্ট সিম্পল কিন্তু বিশ্বের কিছু সবচেয়ে বড় কোম্পানির ইনফ্রাস্ট্রাকচার হিসেবে কাজ করার জন্য যথেষ্ট পাওয়ারফুল এবং স্কেলেবল।

AWS Lambda Amazon-এর একটি এমন অফারিং যা 'সার্ভারলেস কম্পিউট সার্ভিস' হিসেবে কাজ করে, যা আমাদেরকে শুধু ইভেন্টসের রেসপন্সে কোড রান করতে দেয়। এটি ওভারহেড কমায় এবং আমাদেরকে প্রোগ্রাম্যাটিক্যালি কোনো কিছুর রिए্যাক্ট করতে দেয়, যেমন একটি API কল, পুরো সার্ভার হোস্ট করা বা পুরো অ্যাপ বিল্ড করা ছাড়া।

সঠিক ইউজ কেসের জন্য, এই সার্ভারলেস আর্কিটেকচার খুব টাকা বাঁচাতে পারে। প্রাইসিং ক্যালকুলেট হয় কস্ট পার রিকোয়েস্ট এবং কম্পিউট টাইমের ডিউরেশনের কস্ট পার। প্রথম এক মিলিয়ন রিকোয়েস্টের পর প্রতিমাসে, প্রাইসিং হলো $০.২০ পার এক মিলিয়ন রিকোয়েস্ট প্লাস $০.০০০০১৬৬৬৬৭ প্রতি GB-সেকেন্ড কম্পিউট টাইম যা ফাংশনটি ব্যবহার করে। আপনি কল্পনা করতে পারেন, এই রেট-বেজড প্রাইসিং Lambda-এ একটি ছোট সার্ভিস রান করতে দারুণ সস্তা করে তোলে যখন একই রেটে অসীম স্কেল করার অপশন থাকে।

Ruby ডেভেলপাররা এই ক্লাউড সার্ভিস থেকে সুবিধা নিতে পারেন স্টেটলেস উপায়ে API কল বা অন্যান্য AWS ইভেন্টস রिए্যাক্ট করতে।

ট্রায়াল AWS একাউন্ট সেটআপ

AWS একটি দারুণ ফ্রি টিয়ার অফার করে যাতে এক মিলিয়ন ফ্রি রিকোয়েস্ট এবং AWS Lambda-তে মাসে ৩.২ মিলিয়ন সেকেন্ড কম্পিউট টাইম অন্তর্ভুক্ত! যদি আপনার ইতিমধ্যে একাউন্ট থাকে, এই ধাপ বাদ দিন, কিন্তু একাউন্ট খোলা খুব সিম্পল।

এখানে সাইন আপ করতে যান এবং আপনার ইনফরমেশন ফিল আপ করে শুরু করুন! AWS Lambda-এ Ruby দক্ষতা অর্জন: স্কেলেবল, ইভেন্ট-ড্রাইভড ফাংশন বিল্ড করুন

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

Ruby-তে Lambda ফাংশন তৈরি

রেজিস্টার হলে, Products এর ওপর হোভার করুন, তারপর Compute, এবং Lambda সিলেক্ট করুন।

AWS Lambda-এ Ruby দক্ষতা অর্জন: স্কেলেবল, ইভেন্ট-ড্রাইভড ফাংশন বিল্ড করুন

Lambda Console-এ যাওয়ার পর (হয়তো 'Get Started' হিট করতে হবে), আপনি ফাংশনগুলির একটি খালি লিস্ট দেখবেন যার সাথে একটি অরেঞ্জ বাটন "Create Function"। আপনি অনুমান করতে পারেন, আমরা সেটি প্রেস করব।

AWS Lambda-এ Ruby দক্ষতা অর্জন: স্কেলেবল, ইভেন্ট-ড্রাইভড ফাংশন বিল্ড করুন

তারপর, "Author from Scratch" বেছে নেব, কারণ Ruby-র জন্য এখনো কোনো টেমপ্লেট ফাংশন নেই, এবং স্ক্র্যাচ থেকে কাজ শুরু করা শেখার সেরা উপায়।

আপনার ফাংশনকে উপযুক্তভাবে নাম দিন এবং আপনি যে Ruby ভার্সনে কাজ করতে চান সেটি সিলেক্ট করুন। আমার ফাংশনটির নাম দিয়েছি FizzBuzz, বিখ্যাত প্রোগ্রামিং সমস্যার নামানুসারে।

নেভিগেশন পেনে lambda_function.rb ফাইলটিতে ডাবল-ক্লিক করতে হয়তে পারে সোর্স কোড দেখার জন্য।

ফাংশনটি প্রি-রিটেন থাকে এবং এর টাইটেল lambda_handler। যেন আছে, যখন এটি ইনভোক হবে, ফাংশনটি ২০০ রেসপন্স রিটার্ন করবে "Hello From Lambda!" টেক্সটসহ, নিচে দেখানো মত। AWS Lambda-এ Ruby দক্ষতা অর্জন: স্কেলেবল, ইভেন্ট-ড্রাইভড ফাংশন বিল্ড করুন

Lambda ফাংশনের জন্য টেস্ট ট্রিগার ব্যবহার

ইন্ট্রোতে আলোচনা করা হয়েছে, Lambda ফাংশনগুলো বিভিন্নভাবে ট্রিগার করা যেতে পারে। সবচেয়ে সাধারণ একটিতেই API কল। তবে এতে AWS API Gateway সেট আপ করতে হয়, যা এই আর্টিকেলের স্কোপের বাইরে। API Gateway Lambda-র সাথে দারুণভাবে কাজ করে খুব কম কনফিগারেশন এবং অসীম স্কেলেবিলিটির সাথে API তৈরি করতে।

শুক্রভাগ্যে, ফাংশন কনসোলের মাধ্যমে একটি API কল সিমুলেট করা 그리 কঠিন নয়, এবং একটি টেস্ট ইভেন্ট ইতিমধ্যে কিউয়াপ আছে।

ফাংশন ওভারভিউর নিচে একটি টুলবার আছে যেখানে বর্তমানে "Code" সিলেক্টেড। লাস্ট স্ক্রিনশটে দেখানো মত, "Code"-র পাশে ডানদিকে "Test" ট্যাব আছে। সেটি সিলেক্ট করুন, এবং টেস্ট কনসোলটি কোড সোর্সের জায়গায় দেখাবে।

AWS Lambda-এ Ruby দক্ষতা অর্জন: স্কেলেবল, ইভেন্ট-ড্রাইভড ফাংশন বিল্ড করুন

প্রি-কনফিগারড টেস্ট ইভেন্টটি একটি JSON অবজেক্ট যা Lambda ফাংশনে event অবজেক্ট হিসেবে পাঠানো হয়, যা ফাংশনটি প্যারামিটার হিসেবে নেয়। আপনি যদি API Gateway-এর মাধ্যমে একটি এন্ডপয়েন্ট কল করতেন, তবে এটি রিকোয়েস্টের বডি হত।

যেহেতু প্লেসহোল্ডার Lambda ফাংশনটি ইভেন্ট পড়ে না, তাই আমরা বডি হিসেবে কী পাঠাচ্ছি তা খুব মানে রাখে না। যেন আছে, লেখা অনুযায়ী অরেঞ্জ "Invoke" বাটন ট্যাপ করে এগিয়ে যান।

যদি আপনি ফাংশনটি সঠিকভাবে সেট আপ করেছেন, তবে আপনি একটি গ্রিন বক্স দেখবেন "Execution Succeeded" টাইটেলসহ, যা এক্সপ্যান্ড করলে আপনার ফাংশন থেকে JSON রেসপন্স দেখতে পাবেন।

FizzBuzz লিখুন

এখন আমরা নিশ্চিত করেছি আমাদের Lambda ফাংশনটি সঠিকভাবে কাজ করছে, আমরা নিজস্ব কাস্টম Ruby কোড দিয়ে কাস্টমাইজ করতে পারি। এই উদাহরণে, আমরা আমাদের Lambda ফাংশনকে বিখ্যাত FizzBuzz সমস্যার রেসপন্স দিতে বলব। FizzBuzz ইন্টারভিউর ফেভারিট, এবং প্রম্পটটি এমন কিছু:

১ থেকে ৫০ পর্যন্ত সংখ্যা প্রিন্ট করার একটি প্রোগ্রাম লিখুন। কিন্তু, তিনের গুণফলগুলো için "Fizz" প্রিন্ট করুন সংখ্যার বদলে, এবং পাঁচের গুণফলগুলো için "Buzz"। যেসব সংখ্যা তিন এবং পাঁচ উভয়ের গুণফল, সেসব জন্য "FizzBuzz" প্রিন্ট করুন।

আপনার Lambda ফাংশনের কোডটি আমার FizzBuzz সমাধানদিয়ে রিপ্লেস করুন -

require 'json'
def lambda_handler(event:, context:)
  max_val = event['max_val']
  textResponse = ''
  1.upto(max_val) do |i|
    if i % 5 == 0 and i % 3 == 0
      textResponse += "FizzBuzz"
    elsif i % 5 == 0
      textResponse += "Buzz"
    elsif i % 3 == 0
      textResponse += "Fizz"
    else
      textResponse += i.to_s
    end
  end
  { statusCode: 200, body: JSON.generate(textResponse) }
end

সাধারণ FizzBuzz-এ একটু স্পিন দিয়েছি। শুধু ৫০ পর্যন্ত লুপ না করে, আমরা ইভেন্টের সাথে পাঠানো সংখ্যা পর্যন্ত লুপ করছি। ইভেন্ট অবজেক্টটি ডিকশনারির মত পাস হয়, তাই event[max_val] চাইলে max_val কী-র ভ্যালু রিটার্ন করে। একদম শেষে, FizzBuzz সমাধান প্রিন্ট করার বদলে, আমরা সেটি একটি String-এ অ্যাপেন্ড করি যা JSON অবজেক্ট হিসেবে রিটার্ন হয়।

পরবর্তীতে, অরেঞ্জ "Deploy" বাটন হিট করা নিশ্চিত করুন আপনার Lambda ফাংশনকে নতুন কোডদিয়ে আপডেট করার জন্য।

সমাধান লিখে ডেপ্লอย করার পর, টেস্ট কনসোলে ফিরে যান। আপনার টেস্ট ইভেন্টকে শুধু একটি max_val কী/ভ্যালু পেয়ার পাস করতে বলুন। সেটি এরকম দেখাবে:

AWS Lambda-এ Ruby দক্ষতা অর্জন: স্কেলেবল, ইভেন্ট-ড্রাইভড ফাংশন বিল্ড করুন

JSON সিম্পলি

{ "max_val": 70 }

শেষে, "Invoke" হিট করুন আপনার টেস্ট রান করতে! রেজাল্ট এক্সপ্যান্ড করলে দেখবেন ফাংশনটি ইনপুট পড়েছে এবং FizzBuzz সমস্যার ফলাফল রিটার্ন করেছে।

সহজ ডেভেলপমেন্ট

ওয়েব কনসোলে কাজ করা শেখার উদ্দেশ্যে সুবিধাজনক হলেও, সেখানে সীমাবদ্ধ থাকা নাইটমেयर হত। AWS Lambda-র সাথে ডেভেলপ করার সবচেয়ে জনপ্রিয় উপায়ों এ একটি হলো CLI ব্যবহার করা, যা দাঁড়িয়ে Command Line Interface।

IAM রোলসের মাধ্যমে সঠিক পারমিশন তৈরি করুন, আপনার মেশিনে CLI ইনস্টল করুন এবং আপনার ক্রেডেনশিয়ালস দিয়ে কনফিগার করুন। তারপর, Lambda CLI ব্যবহার করে আপনার ফাংশন টেস্ট করুন লোকালি ডেভেলপ করার সময় (আপনার পছন্দের IDE-এ) এবং কমান্ড লাইন 통해 চেঞ্জস ডেপ্লয় করুন।

অন্য একটি জনপ্রিয় ডেভেলপমেন্ট মেথড হলো ফ্রেমওয়ার্ক ব্যবহার করা, যেমন Serverless। Serverless AWS-এর যে কামসামবোdh কনফিগারেশনগুলো হ্যান্ডেল করে, সেটি API Gateway সেট আপ করাও অন্তর্ভুক্ত যদি আপনার ফাংশনের জন্য দরকার হয়। Serverless লগিং এনহ্যান্স করে, Ruby Gem ম্যানেজমেন্ট সহজ করে, এবং CI/CD কনফিগারেশন অনুমতি দেয়, যাতে আপনি আপনার রিপোজিটরি থেকে পাইপলাইন বেজড অটোমেটিক্যালি ডেপ্লয় করতে পারেন।

Serverless বা সাদৃশ্য ফ্রেমওয়ার্ক ছাড়া, Ruby Gems ইনক্লুড করা কিছু হুপের মাধ্যমে যেতে হয়। আপনাকে আপনার ফাংশনকে একটি ফোল্ডার ইনভল্ভ করতে এক্সপ্যান্ড করতে হবে, এবং আপনার রুট ডিরেক্টরিতে একটি .bundle/config ফাইল তৈরি করতে হবে যাতে বান্ডলারকে বলা যায় জেমগুলো কোথায় রাখবে:

---
BUNDLE_PATH: "vendor/bundle"

তারপর, আপনি CLI ব্যবহার করে bundle add দিয়ে দরকারি জেমগুলো যোগ করতে পারেন এবং কোডে সরাসরি require করতে পারেন।

AWS Lambda-এর সীমাবদ্ধতা

অভিনন্দন, আপনি Ruby-তে আপনার প্রথম AWS Lambda ফাংশন লিখলেন! এর আগে, Ruby-তে API রান করার একমাত্র ফিজিবল সমাধান প্রায়শই একটি পুরো Rails অ্যাপ তৈরি করা হত। এখন, আপনি একটা একটা করে এন্ডপয়েন্ট তৈরি করতে পারেন, একটি ফুল অ্যাপ্লিকেশনের সাথে আসা সব ব্লোট স্কিপ করে। Lambda মাইক্রোসেকেন্ডে ইউজেজ বিল করে, তাই কুইক সমাধানের জন্য এটি দারুণ সস্তা। மேலும், এই ক্লাউড অফারিংর সুবিধা নেওয়া আমাদেরকে কম খরচে অপারেট করতে দেয় কিন্তু অবিশ্বাস্য দ্রুত স্কেল করতে পারা। AWS হলো কারণ Netflix পিক আওয়ার্সে কাজ করে সর্বোচ্চ ক্যাপাসিটির সার্ভার ব্যান্ডউইডথের জন্য কনস্ট্যান্টলি পে করা ছাড়া।

সব জিতের باড়তি, AWS Lambda ক্যাচ-অল সমাধান নয়। এটি নিজে API হিসেবে ফাংশন করবে না এবং এর স্টেট ক্যাপাবিলিটিগুলো সীমিত। Lambda ফাংশন ১৫ মিনিটের বেশি রান করতে পারবে না, এবং মেমরি ৬ GB-এ সীমাবদ্ধ। Lambda ফাংশন টেস্ট করা একটু চ্যালেঞ্জিং, কারণ আপনাকে প্রায়শই পুরো ইনফ্রাস্ট্রাকচার একটি আলাদা এনভায়রনমেন্টে ডুপ্লিকেট করতে হয়।

যদি আপনার এমন একটি অ্যাপ বা ফিচার থাকে যা ২৪/৭ রান করতে হয় না, তবে Lambda হওয়াতে পারে একটি ভাল ফিট। যদি আপনার ফাংশনকে কোনো কйнো স্টেট মেইনটেইন করতে হয় বা এমনকি AWS ইকোসিস্টেমের বাইরে ডেটা আপডেট করতে হয়, তবে Lambda ভাল ফিট নয়। Lambda ডিফল্টলি ১,০০০ কনকারেন্ট কানেকশনস আহ্বান করে, তাই যে অ্যাপ্লিকেশনটি কনসিস্টেন্টলি তার চেয়ে বেশি ব্যবহার দেখে, সেটি Lambda-এ খুব অনরিলায়বল হবে। সারসংক্ষেপে, Lambda শর্ট-লিভড ইভেন্ট-ড্রাইভড অটোমেশন টাস্কের জন্য সেরা যা পারসিস্টেন্ট স্টেট দরকার নয়।

Lambda ফাংশনগুলো একটি পাওয়ারফুল টুল হতে পারে, বিশেষ করে আপনার মত একটি Ruby ডেভেলপারের হাতে।

  1. রুবি অন রেইলস AWS Lambda-তে ডিপ্লয়: ধাপে ধাপে গাইড

  2. Bash ফাংশন মাস্টার করুন: শেল স্ক্রিপ্টিং-এ গভীরে যান (পার্ট VI)

  3. রুবি মেথড ব্যাখ্যা: কাস্টম ফাংশন সহজে তৈরি করুন

  4. রুবি ২.৬-এ ৯টি গুরুত্বপূর্ণ উন্নতির অন্বেষণ