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

AWS Lambda-এ Ruby লিভারেজ করুন ইফিশিয়েন্ট সার্ভারলেস ফাংশন জন্য

গতকাল AWS Lambda-এ Ruby সাপোর্ট ঘোষণা হলে, আমি তত এক্সসাইটেড ছিলাম যে আমাকে অবিলম্বে ট্রাই করতে 파িয়েছিল। আমরা Honeybadger-এ কিছু সময় ধরে Lambda ব্যবহার করছি, এবং আমি দীর্ঘদিন আশা করছিলাম আমাদের ফাংশনগুলো Ruby-এ লিখতে পারি। নতুন Ruby সাপোর্টের সাথে কয়েক ঘন্টা খেলা করার পর, আমি কনফিডেন্ট মনে করছি আমরা Node, Go, এবং Python-এ কম সময় বিতাবেন। :)

একটি কুইক উদাহরণ

AWS-এর ঘোষণা ব্লগ পোস্ট আপনাকে Ruby on Lambda দিয়ে দ্রুত আপ 앤 রানিং করতে পারবে, কিন্তু আমি Serverless ফ্রেমওয়ার্ক ব্যবহার করে আপনার Ruby Lambda ফাংশন ডিপ্লয় করার একটি উদাহরণ শেয়ার করতে চাইলাম। আমি এই ফ্রেমওয়ার্কটি Lambda ফাংশন নিয়ে কাজ করার অ্যানয়্যান্সগুলো দূর করতে ফ্যান্টাস্টিক কাজ করে বলে খুঁজে পেলাম। যদিও ফ্রেমওয়ার্কের করেন্ট ভার্সন (1.34) এ Ruby প্রজেক্টের জন্য টেমপ্লেট জেনারেশন রেডি নেই (PR কিছু ঘন্টা আগে মার্জ হয়েছিল আমি এই পোস্ট লেখা শুরু করার আগে), জেনারেটর ছাড়াও শুরু করা সহজ। এখানে একটি স্যাম্পেল কনফিগ ফাইল যা আমি এই ওয়াকথ্রু için ব্যবহার করব, যা একটি সিম্পল ফাংশন যা একটি DynamoDB টেবিল পপুলেট করবে S3 অবজেক্ট তৈরি হলে তাদের মেটাডেটা দিয়ে:

কনফিগের রিসোর্স সেকশন একটি নতুন DynamoDB টেবিল অটোমেটিক্যালি তৈরি করে, এবং নতুন তৈরি টেবিলের নাম ফাংশনের একটি এনভায়রনমেন্ট ভেরিয়েবলে রাখা হয়, যা আমরা কোডে ব্যবহার করব। ফাংশনটি SNS ইভেন্ট দিয়ে ট্রিগার হয় একটি SNS টপিকের জন্য যা পূর্বে তৈরি করা হয়েছে। সেই SNS টপিকটি S3 বাকেটে PUT ইভেন্টের জন্য নোটিফিকেশন পায়, যা ম্যানুয়ালি তৈরি করা হয়েছে।

এখানে Ruby কোড:

কোডটি অনেক কিছু করে না — এটি SNS ইভেন্ট রিসিভ করে, SNS মেসেজের রেকর্ডগুলো লুপ করে প্রতিটি S3 অবজেক্টের ইনফো পেতে, S3 অবজেক্টে একটি HEAD রিকোয়েস্ট করে মেটাডেটা পেতে, তারপর DynamoDB টেবিলে একটি আইটেম পুট (ক্রিয়েট বা আপডেট) করে। এই ফাংশনের একমাত্র ডিপেন্ডেন্সি AWS SDK, যা রানটাইম এনভায়রনমেন্টে ইনক্লুডেড, তাই আপনাকে Gemfile নিয়ে চিন্তা করতে হবে না। যিদি, আপনার যদি কিছু এডিশনাল জেম থাকে পার্টিতে আনার জন্য, সেটি করা সহজ। ডিপ্লয়মেন্টের কথা বলার সময় এডিশনাল জেম ইনক্লুড করা কীভাবে হবে সেটি দেখি।

ডিপ্লয়মেন্ট

এই কোডকে বর্তমান স্টেটে Lambda-তে পৌঁছানো সাপার ইজি, Serverless ফ্রেমওয়ার্কের কর্তৃক:

sls deploy 

এই একক কমান্ড আপনার জন্য এই সব করবে:

  • আপনার কোড জিপ আপ করবে
  • জিপ ফাইল S3-এ রাখবে
  • Lambda-এ ফাংশন ডিপ্লয় করবে (এনভায়রনমেন্ট ভেরিয়েবল এবং SNS ট্রিগারসহ)
  • IAM পলিসি তৈরি করবে
  • DynamoDB টেবিল তৈরি করবে

ডিপ্লয়মেন্ট হলে, বাকেটে অবজেক্ট তৈরি করলে DynamoDB টেবিলে নতুন আইটেম অ্যাড হবে।

ডিপেন্ডেন্সি

আপনার ডিপ্লয়ড ফাংশনের সাথে এডিশনাল জেম ডিপেন্ডেন্সি ইনক্লুড করা সহজ — আপনাকে শুধু একটি Gemfile তৈরি করতে হবে, আপনি যে জেমগুলো বান্ডল করতে চান সেগুলো অ্যাড করুন, এবং bundle install --path vendor/bundle চালান। এটি জেমগুলো লোকাল ডিরেক্টরিতে বান্ডল করবে, এবং সেগুলো আপনার কোডের সাথে জিপ আপ হয়ে ফাংশনে অ্যাড হয়ে যাবে।

ডিপেন্ডেন্সির জন্য একটা ক্যAVEAT হলো, যেসব জেম কিছু C এক্সটেনশন কম্পাইল করতে চায়। যেহেতু আপনার ডেভেলপমেন্ট এনভায়রনমেন্ট Lambda রানটাইম এনভায়রনমেন্ট থেকে ভিন্ন হওয়ার সম্ভাবনা বেশি, সেই এক্সটেনশনগুলো AWS-এ কাজ করার জন্য কম্পাইল করতে কিছু এক্সট্রা ওয়ার্ক করতে হবে। lambci Docker ইমেজ এবং আমি তাদের Ruby ইমেজের ওপর তৈরি করা আমার Docker ইমেজের সένario, তবে, এটি কঠিন নয়। আপনার ডিপেন্ডেন্সি বান্ডল করতে এবং সেগুলো সঠিকভাবে কম্পাইল করতে, শুধু আমার docker ইমেজ রান করুন, এরকম:

docker run --rm -v $(pwd):/var/task stympy/lambda-ruby2.5 

এটি উপরের বান্ডলার কমান্ড লাইন রান করে, তাই জেমগুলো vendor/bundle-এ রাখা হবে, deploy কমান্ড দ্বারা তৈরি ZIP ফাইলে ইনক্লুড হওয়ার জন্য রেডি।

এটোই! আশা করি আপনি Lambda-এ Ruby রান করার উপভোগ করবেন যত আমি করেছি। :)

  1. রুবি এক্সসেপশন দক্ষতা TracePoint দিয়ে: জটিল ত্রুটি পরিস্থিতি ডায়াগনোসिस

  2. রুবিতে AWS Lambda: এন্ড-টু-এন্ড বিল্ড, টেস্ট এবং ডিপ্লয় গাইড

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

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