অ্যাপ ইঞ্জিন মেমক্যাশ থেকে ক্লাউড মেমোরিস্টোরে স্থানান্তর করুন (মডিউল 13)

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

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

এই কোডল্যাবের উদ্দেশ্য হলো পাইথন ২ অ্যাপ ইঞ্জিন ডেভেলপারদের দেখানো যে, কীভাবে অ্যাপ ইঞ্জিন মেমক্যাশ থেকে ক্লাউড মেমোরিস্টোরে ( রেডিসের জন্য) মাইগ্রেট করতে হয়। এর সাথে অ্যাপ ইঞ্জিন ndb থেকে ক্লাউড এনডিবি -তে একটি অন্তর্নিহিত মাইগ্রেশনও রয়েছে, কিন্তু সেটি মূলত মডিউল ২ কোডল্যাবে আলোচনা করা হয়েছে; আরও বিস্তারিত ধাপে ধাপে তথ্যের জন্য সেটি দেখে নিন।

আপনি শিখবেন কিভাবে

  • একটি ক্লাউড মেমোরিস্টোর ইনস্ট্যান্স সেট আপ করুন (ক্লাউড কনসোল বা gcloud টুল থেকে)
  • একটি ক্লাউড সার্ভারলেস ভিপিসি অ্যাক্সেস কানেক্টর সেট আপ করুন (ক্লাউড কনসোল বা gcloud টুল থেকে)
  • অ্যাপ ইঞ্জিন মেমক্যাশ থেকে ক্লাউড মেমোরিস্টোরে মাইগ্রেট করুন
  • একটি নমুনা অ্যাপে ক্লাউড মেমোরিস্টোর ব্যবহার করে ক্যাশিং বাস্তবায়ন করুন
  • অ্যাপ ইঞ্জিন ndb থেকে ক্লাউড এনডিবি-তে মাইগ্রেট করুন

আপনার যা যা লাগবে

জরিপ

আপনি এই টিউটোরিয়ালটি কীভাবে ব্যবহার করবেন?

শুধু একবার পড়ে দেখুন এটি পড়ুন এবং অনুশীলনগুলো সম্পূর্ণ করুন।

পাইথন নিয়ে আপনার অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

শিক্ষানবিশ মধ্যবর্তী দক্ষ

গুগল ক্লাউড পরিষেবা ব্যবহারের অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

শিক্ষানবিশ মধ্যবর্তী দক্ষ

২. পটভূমি

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

এই সিরিজের অন্যগুলোর তুলনায় এই মাইগ্রেশনটিতে বেশি পরিশ্রমের প্রয়োজন। অ্যাপ ইঞ্জিন মেমক্যাশের প্রস্তাবিত বিকল্প হলো ক্লাউড মেমোরিস্টোর , যা একটি সম্পূর্ণ পরিচালিত ক্লাউড-ভিত্তিক ক্যাশিং পরিষেবা। মেমোরিস্টোর দুটি জনপ্রিয় ওপেন সোর্স ক্যাশিং ইঞ্জিন, রেডিস এবং মেমক্যাশড সমর্থন করে। এই মাইগ্রেশন মডিউলটি রেডিসের জন্য ক্লাউড মেমোরিস্টোর ব্যবহার করে। আপনি মেমোরিস্টোর এবং রেডিস ওভারভিউ- তে এ বিষয়ে আরও জানতে পারবেন।

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

এই টিউটোরিয়ালটি পাইথন ২-এ লেখা মডিউল ১২ স্যাম্পল অ্যাপ দিয়ে শুরু হয়েছে এবং এরপর পাইথন ৩-এ একটি অতিরিক্ত, ঐচ্ছিক ও সামান্য আপগ্রেড রয়েছে। আপনি যদি পাইথন ৩ অ্যাপ ইঞ্জিন এসডিকে (SDK) ব্যবহার করে পাইথন ৩ থেকে অ্যাপ ইঞ্জিনের বান্ডেল করা সার্ভিসগুলো অ্যাক্সেস করতে আগে থেকেই পরিচিত হন, তাহলে আপনি এর পরিবর্তে মডিউল ১২ স্যাম্পল অ্যাপের পাইথন ৩ সংস্করণটি দিয়ে শুরু করতে পারেন। সেক্ষেত্রে এসডিকে-র ব্যবহার বাদ দিতে হবে, কারণ মেমোরিস্টোর (Memorystore) কোনো অ্যাপ ইঞ্জিন বান্ডেল করা সার্ভিস নয় । পাইথন ৩ অ্যাপ ইঞ্জিন এসডিকে কীভাবে ব্যবহার করতে হয় তা শেখা এই টিউটোরিয়ালের আওতার বাইরে।

এই টিউটোরিয়ালটিতে নিম্নলিখিত মূল ধাপগুলো রয়েছে:

  1. প্রস্তুতি/পূর্বপ্রস্তুতি
  2. ক্যাশিং পরিষেবা সেট আপ করুন
  3. কনফিগারেশন ফাইল আপডেট করুন
  4. প্রধান অ্যাপ্লিকেশন আপডেট করুন

৩. প্রস্তুতি/পূর্বপ্রস্তুতি

ক্লাউড প্রজেক্ট প্রস্তুত করুন

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

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

বেসলাইন নমুনা অ্যাপ পান

আমরা যে বেসলাইন মডিউল ১২ কোড থেকে শুরু করছি, এই কোডল্যাবটি আপনাকে ধাপে ধাপে মাইগ্রেশনের প্রক্রিয়াটি দেখিয়ে দেবে। এটি সম্পন্ন হলে, আপনি একটি কার্যকরী মডিউল ১৩ অ্যাপ পাবেন যা ফিনিশ ফোল্ডারগুলোর কোনো একটিতে থাকা কোডের সাথে অনেকটাই সাদৃশ্যপূর্ণ। সেই রিসোর্সগুলো নিচে দেওয়া হলো:

START ফোল্ডারে নিম্নলিখিত ফাইলগুলো থাকা উচিত:

$ ls
README.md               app.yaml                main.py                 requirements.txt        templates                

আপনি যদি পাইথন ২ সংস্করণ থেকে শুরু করেন, তাহলে একটি appengine_config.py ফাইলও থাকবে এবং আপনি যদি মডিউল ১২-এর কোডল্যাবটি সম্পন্ন করে থাকেন, তবে সম্ভবত একটি lib ফোল্ডারও থাকবে।

মডিউল ১২ অ্যাপ পুনরায় স্থাপন করুন

আপনার বাকি প্রস্তুতিমূলক ধাপগুলো হলো:

  1. (প্রয়োজন হলে) gcloud কমান্ড-লাইন টুলটির সাথে পুনরায় পরিচিত হয়ে নিন।
  2. (প্রয়োজন হলে) মডিউল ১২-এর কোড অ্যাপ ইঞ্জিনে পুনরায় ডেপ্লয় করুন।

পাইথন ২ ব্যবহারকারীদের এই কমান্ডগুলো ব্যবহার করে lib ফোল্ডারটি ডিলিট করে পুনরায় ইনস্টল করতে হবে:

rm -rf ./lib; pip install -t lib -r requirements.txt                

এখন সবাইকে (পাইথন ২ এবং ৩ ব্যবহারকারী) এই কমান্ডটি ব্যবহার করে অ্যাপ ইঞ্জিনে কোডটি আপলোড করতে হবে:

gcloud app deploy                

সফলভাবে ডেপ্লয় করার পর, নিশ্চিত করুন যে অ্যাপটি দেখতে ও কাজ করতে মডিউল ১২-এর অ্যাপটির মতোই হয়েছে; যেটি একটি ওয়েব অ্যাপ এবং একই ব্যবহারকারীর ভিজিট ট্র্যাক করে ও এক ঘণ্টার জন্য তা ক্যাশ করে রাখে।

dfe56a02ae59ddd8.png

যেহেতু সাম্প্রতিক ভিজিটগুলো ক্যাশ করা থাকে, তাই পেজ রিফ্রেশ করলে তা বেশ দ্রুত লোড হওয়ার কথা।

৪. ক্যাশিং পরিষেবা সেট আপ করুন

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

মেমোরিস্টোর ইনস্ট্যান্সটি আপনার অ্যাপ ইঞ্জিন অ্যাপ (ইনস্ট্যান্সগুলো) থেকে ভিন্ন একটি নেটওয়ার্কে রয়েছে, এবং সেই কারণেই একটি সার্ভারলেস ভিপিসি অ্যাক্সেস কানেক্টর তৈরি করতে হবে যাতে অ্যাপ ইঞ্জিন আপনার মেমোরিস্টোর রিসোর্সগুলো অ্যাক্সেস করতে পারে। ভিপিসি খরচ কমাতে, ইনস্ট্যান্স টাইপ ( f1-micro ) এবং অনুরোধ করার জন্য সর্বনিম্ন সংখ্যক ইনস্ট্যান্স বেছে নিন (আমরা সর্বনিম্ন ২টি , সর্বোচ্চ ৩টি ইনস্ট্যান্সের পরামর্শ দিই)। এছাড়াও ভিপিসি প্রাইসিং ইনফরমেশন পেজটি দেখে নিন।

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

7eb35ebf7248c010.png

উভয় রিসোর্সই প্রয়োজন, এবং আপনি কোনটি প্রথমে তৈরি করছেন তা গুরুত্বপূর্ণ নয়। আপনি যদি প্রথমে মেমোরিস্টোর ইনস্ট্যান্স তৈরি করেন, তাহলে আপনার অ্যাপ ইঞ্জিন অ্যাপ VPC কানেক্টর ছাড়া সেটিতে পৌঁছাতে পারবে না। একইভাবে, আপনি যদি প্রথমে VPC কানেক্টর তৈরি করেন, তাহলে সেই VPC নেটওয়ার্কে আপনার অ্যাপ ইঞ্জিন অ্যাপের যোগাযোগের জন্য কিছুই থাকবে না। এই টিউটোরিয়ালে প্রথমে মেমোরিস্টোর ইনস্ট্যান্স এবং তারপরে VPC কানেক্টর তৈরি করতে বলা হয়েছে।

একবার উভয় রিসোর্স অনলাইন হয়ে গেলে, আপনাকে app.yaml এ প্রাসঙ্গিক তথ্য যোগ করতে হবে যাতে আপনার অ্যাপ ক্যাশে অ্যাক্সেস করতে পারে। আপনি অফিসিয়াল ডকুমেন্টেশনে থাকা পাইথন ২ বা পাইথন ৩ গাইডগুলোও দেখতে পারেন। ক্লাউড এনডিবি মাইগ্রেশন পেজের ( পাইথন ২ বা পাইথন ৩ ) ডেটা ক্যাশিং গাইডটিও দেখে নেওয়া যেতে পারে।

একটি ক্লাউড মেমোরিস্টোর ইনস্ট্যান্স তৈরি করুন

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

  • সর্বনিম্ন পরিষেবা স্তর নির্বাচন করুন: বেসিক (কনসোল ডিফল্ট: "স্ট্যান্ডার্ড", gcloud ডিফল্ট: "বেসিক")।
  • সর্বনিম্ন স্টোরেজ পরিমাণ বেছে নিন: ১ জিবি (কনসোলের ডিফল্ট: ১৬ জিবি, gcloud ডিফল্ট: ১ জিবি)।
  • সাধারণত যেকোনো সফটওয়্যারের নতুনতম সংস্করণগুলোর জন্য সবচেয়ে বেশি রিসোর্সের প্রয়োজন হয়, কিন্তু সবচেয়ে পুরোনো সংস্করণটি নির্বাচন করাও সম্ভবত বাঞ্ছনীয় নয়। বর্তমানে দ্বিতীয় সর্বশেষ সংস্করণটি হলো রেডিস সংস্করণ ৫.০ (কনসোল ডিফল্ট: ৬.x)।

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

ক্লাউড কনসোল থেকে

ক্লাউড কনসোলে ক্লাউড মেমোরিস্টোর পৃষ্ঠায় যান (আপনাকে বিলিং তথ্য দিতে বলা হতে পারে)। আপনি যদি এখনও মেমোরিস্টোর চালু না করে থাকেন, তবে আপনাকে তা করতে বলা হবে:

68318997e3105db6.png

একবার আপনি এটি (এবং সম্ভবত বিলিং সহ) সক্রিয় করলে, আপনি মেমোরিস্টোর ড্যাশবোর্ডে পৌঁছে যাবেন। এখানেই আপনি আপনার প্রোজেক্টে তৈরি করা সমস্ত ইনস্ট্যান্স দেখতে পাবেন। নীচে দেখানো প্রোজেক্টটিতে কোনো ইনস্ট্যান্স নেই, তাই আপনি "প্রদর্শনের জন্য কোনো সারি নেই" দেখতে পাচ্ছেন। একটি মেমোরিস্টোর ইনস্ট্যান্স তৈরি করতে, উপরে থাকা 'Create instance'-এ ক্লিক করুন:

63547aa575838a36.png

এই পৃষ্ঠায় মেমোরিস্টোর ইনস্ট্যান্স তৈরি করার জন্য আপনার পছন্দসই সেটিংস পূরণ করার একটি ফর্ম রয়েছে:

b77d927287fdf4c7.png

এই টিউটোরিয়াল এবং এর স্যাম্পল অ্যাপের খরচ কম রাখতে, পূর্বে আলোচিত সুপারিশগুলো অনুসরণ করুন। আপনার পছন্দগুলো নির্বাচন করার পর, 'Create' বাটনে ক্লিক করুন। তৈরির প্রক্রিয়াটিতে কয়েক মিনিট সময় লাগে। এটি শেষ হলে, ইনস্ট্যান্সটির আইপি অ্যাড্রেস এবং পোর্ট নম্বর কপি করে app.yaml ফাইলে যোগ করুন।

কমান্ড-লাইন থেকে

ক্লাউড কনসোল থেকে মেমোরিস্টোর ইনস্ট্যান্স তৈরি করা দৃশ্যত তথ্যপূর্ণ হলেও, অনেকে কমান্ড-লাইন পছন্দ করেন। সামনে এগোনোর আগে নিশ্চিত হয়ে নিন যে আপনার gcloud ইনস্টল এবং ইনিশিয়ালাইজ করা আছে।

ক্লাউড কনসোলের মতোই, ক্লাউড মেমোরিস্টোর ফর রেডিস অবশ্যই সক্রিয় করতে হবে। gcloud services enable redis.googleapis.com কমান্ডটি দিন এবং এটি সম্পূর্ণ হওয়া পর্যন্ত অপেক্ষা করুন, যেমন এই উদাহরণে দেখানো হয়েছে:

$ gcloud services enable redis.googleapis.com
Operation "operations/acat.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.

যদি সার্ভিসটি ইতিমধ্যেই চালু করা থাকে, তাহলে কমান্ডটি (আবার) চালালে কোনো (নেতিবাচক) পার্শ্বপ্রতিক্রিয়া হয় না। সার্ভিসটি চালু হয়ে গেলে, চলুন একটি মেমোরিস্টোর ইনস্ট্যান্স তৈরি করি। সেই কমান্ডটি দেখতে এইরকম:

gcloud redis instances create NAME --redis-version VERSION \
    --region REGION --project PROJECT_ID

আপনার মেমোরিস্টোর ইনস্ট্যান্সের জন্য একটি নাম বেছে নিন; এই ল্যাবে নাম হিসেবে " demo-ms " এবং প্রজেক্ট আইডি হিসেবে " my-project " ব্যবহার করা হয়েছে। এই স্যাম্পল অ্যাপটির রিজিয়ন হলো us-central1 ( us-central এর মতোই), কিন্তু ল্যাটেন্সি নিয়ে উদ্বেগ থাকলে আপনি আপনার কাছাকাছি কোনো রিজিয়ন ব্যবহার করতে পারেন। আপনাকে অবশ্যই আপনার অ্যাপ ইঞ্জিন অ্যাপের মতো একই রিজিয়ন নির্বাচন করতে হবে। আপনি আপনার পছন্দের যেকোনো রেডিস ভার্সন বেছে নিতে পারেন, কিন্তু আমরা পূর্বের সুপারিশ অনুযায়ী ভার্সন ৫ ব্যবহার করছি। এই সেটিংসগুলো দেওয়া থাকলে, আপনাকে এই কমান্ডটি দিতে হবে (এবং এর সাথে সম্পর্কিত আউটপুটও দেওয়া হলো):

$ gcloud redis instances create demo-ms --region us-central1 \
    --redis-version redis_5_0 --project my-project

Create request issued for: [demo-ms]
Waiting for operation [projects/my-project/locations/us-central1/operations/operation-xxxx] to complete...done.
Created instance [demo-ms].

ক্লাউড কনসোলের ডিফল্ট সেটিংসের বিপরীতে, gcloud ডিফল্টরূপে ন্যূনতম রিসোর্স ব্যবহার করে। এর ফলে, ওই কমান্ডটিতে সার্ভিস টিয়ার বা স্টোরেজের পরিমাণ কোনোটিরই প্রয়োজন হয়নি। একটি মেমোরিস্টোর ইনস্ট্যান্স তৈরি হতে কয়েক মিনিট সময় লাগে, এবং এটি সম্পন্ন হলে ইনস্ট্যান্সটির আইপি অ্যাড্রেস ও পোর্ট নম্বর লিখে রাখুন, কারণ সেগুলো শীঘ্রই app.yaml ফাইলে যুক্ত করা হবে।

ইনস্ট্যান্স তৈরি নিশ্চিত করুন

ক্লাউড কনসোল বা কমান্ড-লাইন থেকে

আপনি আপনার ইনস্ট্যান্সটি ক্লাউড কনসোল বা কমান্ড-লাইন থেকে তৈরি করে থাকুন না কেন, এই কমান্ডটির মাধ্যমে আপনি নিশ্চিত করতে পারেন যে এটি উপলব্ধ এবং ব্যবহারের জন্য প্রস্তুত: gcloud redis instances list --region REGION

us-central1 অঞ্চলে ইনস্ট্যান্সগুলি পরীক্ষা করার কমান্ডটি এখানে দেওয়া হল, সাথে আমরা এইমাত্র তৈরি করা ইনস্ট্যান্সটি দেখানো প্রত্যাশিত আউটপুটও রয়েছে:

$ gcloud redis instances list --region us-central1
INSTANCE_NAME  VERSION    REGION       TIER   SIZE_GB  HOST         PORT  NETWORK  RESERVED_IP     STATUS  CREATE_TIME
demo-ms        REDIS_5_0  us-central1  BASIC  1        10.aa.bb.cc  6379  default  10.aa.bb.dd/29  READY   2022-01-28T09:24:45

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

c5a6948ec1c056ed.png

কম্পিউট ইঞ্জিন ভার্চুয়াল মেশিন থেকে

আপনার যদি একটি Compute Engine ভার্চুয়াল মেশিন (VM) থাকে, তবে সেটি কাজ করছে কিনা তা নিশ্চিত করার জন্য আপনি একটি VM থেকেও আপনার Memorystore ইনস্ট্যান্সে সরাসরি কমান্ড পাঠাতে পারেন। মনে রাখবেন যে, আপনি ইতিমধ্যে যে রিসোর্সগুলো ব্যবহার করছেন, তার বাইরেও একটি VM ব্যবহারের সাথে সংশ্লিষ্ট খরচ থাকতে পারে।

সার্ভারলেস ভিপিসি অ্যাক্সেস কানেক্টর তৈরি করুন

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

  • ইনস্ট্যান্সের সর্বনিম্ন সর্বোচ্চ সংখ্যা নির্বাচন করুন: (কনসোল ও gcloud ডিফল্ট: ১০)
  • সর্বনিম্ন খরচের মেশিনের ধরণ বেছে নিন: f1-micro (কনসোল ডিফল্ট: e2-micro , gcloud ডিফল্ট নয়)

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

ক্লাউড কনসোল থেকে

ক্লাউড কনসোলে ক্লাউড নেটওয়ার্কিং-এর "সার্ভারলেস ভিপিসি অ্যাক্সেস" পৃষ্ঠায় যান (আপনাকে বিলিং তথ্য দিতে বলা হতে পারে)। আপনি যদি এখনও এপিআই (API) সক্রিয় না করে থাকেন, তবে আপনাকে তা করতে বলা হবে:

e3b9c0651de25e97.png

একবার আপনি এপিআই (এবং সম্ভবত বিলিং সহ) চালু করলে, আপনি ড্যাশবোর্ডে পৌঁছে যাবেন যেখানে তৈরি করা সমস্ত ভিপিসি কানেক্টর প্রদর্শিত হবে। নীচের স্ক্রিনশটে ব্যবহৃত প্রজেক্টটিতে কোনো কানেক্টর নেই, তাই সেখানে লেখা আছে, "প্রদর্শনের জন্য কোনো সারি নেই"। আপনার কনসোলে, উপরে থাকা 'Create Connector'-এ ক্লিক করুন:

b74b49b9d73b7dcf.png

পছন্দসই সেটিংস দিয়ে ফর্মটি পূরণ করুন:

6b26b2aafa719f73.png

আপনার নিজের অ্যাপ্লিকেশনের জন্য উপযুক্ত সেটিংস বেছে নিন। এই টিউটোরিয়াল এবং এর ন্যূনতম চাহিদাসম্পন্ন নমুনা অ্যাপটির জন্য খরচ কমানোই যুক্তিযুক্ত, তাই পূর্বে উল্লিখিত সুপারিশগুলো অনুসরণ করুন। আপনার নির্বাচন সম্পন্ন হলে, 'Create' এ ক্লিক করুন। একটি VPC কানেক্টরের জন্য অনুরোধ সম্পন্ন হতে কয়েক মিনিট সময় লাগবে।

কমান্ড-লাইন থেকে

VPC কানেক্টর তৈরি করার আগে, প্রথমে সার্ভারলেস VPC অ্যাক্সেস API সক্রিয় করুন। নিম্নলিখিত কমান্ডটি দেওয়ার পর আপনি অনুরূপ আউটপুট দেখতে পাবেন:

$ gcloud services enable vpcaccess.googleapis.com
Operation "operations/acf.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.

API সক্রিয় করা হলে, এইরকম দেখতে একটি কমান্ডের মাধ্যমে একটি VPC কানেক্টর তৈরি করা হয়:

gcloud compute networks vpc-access connectors create CONNECTOR_NAME \
    --range 10.8.0.0/28 --region REGION --project PROJECT_ID

আপনার কানেক্টরের জন্য একটি নাম এবং একটি অব্যবহৃত /28 CIDR ব্লকের প্রারম্ভিক আইপি অ্যাড্রেস বেছে নিন। এই টিউটোরিয়ালটি নিম্নলিখিত বিষয়গুলো ধরে নিচ্ছে:

  • প্রজেক্ট আইডি : my-project
  • VPC কানেক্টরের নাম : demo-vpc
  • সর্বনিম্ন ইনস্ট্যান্স সংখ্যা : ২ (ডিফল্ট) এবং সর্বোচ্চ ইনস্ট্যান্স সংখ্যা : ৩
  • ইনস্ট্যান্স টাইপ : f1-micro
  • অঞ্চল : us-central1
  • IPv4 CIDR ব্লক : 10.8.0.0/28 (ক্লাউড কনসোলে সুপারিশকৃত)

উপরোক্ত অনুমানগুলো মাথায় রেখে নিম্নলিখিত কমান্ডটি চালালে, আপনি নীচে যা দেখছেন তার অনুরূপ আউটপুট আশা করতে পারেন:

$ gcloud compute networks vpc-access connectors create demo-vpc \
    --max-instances 3 --range 10.8.0.0/28 --machine-type f1-micro \
    --region us-central1  --project my-project

Create request issued for: [demo-vpc]
Waiting for operation [projects/my-project/locations/us-central1/operations/xxx] to complete...done.
Created connector [demo-vpc].

উপরের কমান্ডটিতে ডিফল্ট মান, যেমন ন্যূনতম ২টি ইনস্ট্যান্স এবং default নামের একটি নেটওয়ার্ক, উল্লেখ করা হয়নি। একটি VPC কানেক্টর তৈরি হতে কয়েক মিনিট সময় লাগে।

কানেক্টর তৈরি হয়েছে কিনা তা নিশ্চিত করুন।

প্রক্রিয়াটি সম্পন্ন হয়ে গেলে, এটি তৈরি হয়েছে এবং ব্যবহারের জন্য প্রস্তুত কিনা তা নিশ্চিত করতে, us-central1 অঞ্চলের জন্য নিম্নলিখিত gcloud কমান্ডটি দিন:

$ gcloud compute networks vpc-access connectors list --region us-central1
CONNECTOR_ID  REGION       NETWORK  IP_CIDR_RANGE  SUBNET  SUBNET_PROJECT  MIN_THROUGHPUT  MAX_THROUGHPUT  STATE
demo-vpc      us-central1  default  10.8.0.0/28                            200             300             READY

একইভাবে, ড্যাশবোর্ডে এখন আপনার তৈরি করা কানেক্টরটি প্রদর্শিত হবে:

e03db2c8140ed014.png

ক্লাউড প্রজেক্ট আইডি, ভিপিসি কানেক্টরের নাম এবং অঞ্চলটি নোট করুন।

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

৫. কনফিগারেশন ফাইল আপডেট করুন

প্রথম ধাপ হলো কনফিগারেশন ফাইলগুলোতে সমস্ত প্রয়োজনীয় আপডেট করা। পাইথন ২ ব্যবহারকারীদের মাইগ্রেট করতে সাহায্য করাই এই কোডল্যাবের মূল লক্ষ্য, তবে সাধারণত নিচের প্রতিটি বিভাগে পাইথন ৩-এ পোর্ট করার বিষয়ে আরও তথ্য দেওয়া থাকে।

requirements.txt

এই অংশে, আমরা ক্লাউড মেমোরিস্টোর এবং ক্লাউড এনডিবি সমর্থন করার জন্য প্যাকেজ যুক্ত করছি। ক্লাউড মেমোরিস্টোর ফর রেডিস-এর জন্য, পাইথনের স্ট্যান্ডার্ড রেডিস ক্লায়েন্ট ( redis ) ব্যবহার করাই যথেষ্ট, কারণ এর জন্য নির্দিষ্ট কোনো ক্লাউড মেমোরিস্টোর ক্লায়েন্ট লাইব্রেরি নেই। মডিউল ১২ থেকে flask যুক্ত করে requirements.txt ফাইলে redis এবং google-cloud-ndb উভয়ই যোগ করুন:

flask
redis
google-cloud-ndb

এই requirements.txt ফাইলটিতে কোনো ভার্সন নম্বর নেই, যার মানে হলো সর্বশেষ ভার্সনগুলোই নির্বাচিত হয়েছে। যদি কোনো অসামঞ্জস্য দেখা দেয়, তবে কার্যকরী ভার্সনগুলো নিশ্চিত করতে ভার্সন নম্বর উল্লেখ করুন।

app.yaml

নতুন বিভাগ যোগ করা হবে

ক্লাউড এনডিবি-র মতো ক্লাউড এপিআই ব্যবহার করার জন্য পাইথন ২ অ্যাপ ইঞ্জিন রানটাইমের কিছু নির্দিষ্ট থার্ড-পার্টি প্যাকেজের প্রয়োজন হয়, যেমন— grpcio এবং setuptools । পাইথন ২ ব্যবহারকারীদের অবশ্যই app.yaml এই ধরনের বিল্ট-ইন লাইব্রেরিগুলোকে তাদের উপলব্ধ সংস্করণসহ তালিকাভুক্ত করতে হবে। আপনার যদি এখনও কোনো libraries সেকশন না থাকে, তবে একটি তৈরি করুন এবং নিচের মতো করে দুটি লাইব্রেরিই যোগ করুন:

libraries:
- name: grpcio
  version: latest
- name: setuptools
  version: latest

আপনার অ্যাপ মাইগ্রেট করার সময়, এতে আগে থেকেই একটি libraries সেকশন থাকতে পারে। যদি থাকে, এবং grpciosetuptools মধ্যে কোনো একটি অনুপস্থিত থাকে, তবে সেগুলোকে আপনার বিদ্যমান libraries সেকশনে যোগ করে দিন।

এরপরে, আমাদের স্যাম্পল অ্যাপটির জন্য ক্লাউড মেমোরিস্টোর ইনস্ট্যান্স এবং ভিপিসি কানেক্টরের তথ্য প্রয়োজন, তাই আপনি কোন পাইথন রানটাইম ব্যবহার করছেন তা নির্বিশেষে app.yaml এ নিম্নলিখিত দুটি নতুন সেকশন যোগ করুন:

env_variables:
    REDIS_HOST: 'YOUR_REDIS_HOST'
    REDIS_PORT: 'YOUR_REDIS_PORT'

vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR

প্রয়োজনীয় আপডেটগুলো এই পর্যন্তই। আপনার আপডেট করা app.yaml এখন দেখতে এইরকম হবে:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

libraries:
- name: grpcio
  version: 1.0.0
- name: setuptools
  version: 36.6.0

env_variables:
    REDIS_HOST: 'YOUR_REDIS_HOST'
    REDIS_PORT: 'YOUR_REDIS_PORT'

vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR

নিচে একটি 'আগে ও পরের' চিত্র দেওয়া হলো, যা app.yaml এ আপনার প্রয়োগ করা উচিত এমন আপডেটগুলো তুলে ধরেছে:

ec2bb027a67debb6.png

পাইথন ৩ এর পার্থক্য

এই অংশটি ঐচ্ছিক এবং শুধুমাত্র যদি আপনি পাইথন ৩-এ পোর্ট করেন তবেই এটি প্রয়োজন। তা করতে হলে, আপনার পাইথন ২ কনফিগারেশনে বেশ কিছু পরিবর্তন করতে হবে। আপনি যদি এই মুহূর্তে আপগ্রেড না করেন, তবে এই অংশটি এড়িয়ে যান।

পাইথন ৩ রানটাইমের জন্য threadsafe বা api_version কোনোটিই ব্যবহৃত হয় না, তাই এই দুটি সেটিংই মুছে ফেলুন। সর্বশেষ অ্যাপ ইঞ্জিন রানটাইম বিল্ট-ইন থার্ড-পার্টি লাইব্রেরি বা নন -বিল্ট-ইন লাইব্রেরি কপি করা সমর্থন করে না। থার্ড-পার্টি প্যাকেজের জন্য একমাত্র শর্ত হলো requirements.txt ফাইলে সেগুলোর তালিকা দেওয়া। ফলে, app.yaml ফাইলের libraries সেকশনটি সম্পূর্ণ মুছে ফেলা যেতে পারে।

এরপর, পাইথন ৩ রানটাইমের জন্য এমন ওয়েব ফ্রেমওয়ার্ক ব্যবহার করা প্রয়োজন যা নিজস্ব রাউটিং করে, আর একারণেই আমরা মডিউল ১-এ ডেভেলপারদের দেখিয়েছিলাম কিভাবে webp2 থেকে Flask-এ মাইগ্রেট করতে হয় । ফলস্বরূপ, সমস্ত স্ক্রিপ্ট হ্যান্ডলারকে অবশ্যই auto তে পরিবর্তন করতে হবে। যেহেতু এই অ্যাপটি কোনো স্ট্যাটিক ফাইল সার্ভ করে না, তাই হ্যান্ডলার তালিকাভুক্ত করা "অর্থহীন" (কারণ সেগুলো সবই auto '), সুতরাং পুরো handlers সেকশনটিও সরিয়ে ফেলা যেতে পারে। এর ফলে, পাইথন ৩-এর জন্য পরিমার্জিত আপনার নতুন, সংক্ষিপ্ত app.yaml দেখতে এইরকম হবে:

runtime: python39

env_variables:
    REDIS_HOST: 'YOUR_REDIS_HOST'
    REDIS_PORT: 'YOUR_REDIS_PORT'

vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR

পাইথন ৩-এ পোর্ট করার সময় app.yaml এর পার্থক্যগুলোর সারসংক্ষেপ:

  • threadsafe এবং api_version সেটিংস মুছে ফেলুন
  • libraries বিভাগ মুছুন
  • handlers সেকশনটি মুছে ফেলুন (অথবা আপনার অ্যাপ যদি স্ট্যাটিক ফাইল পরিবেশন করে, তবে শুধু script হ্যান্ডলারগুলো মুছে ফেলুন)।

মানগুলি প্রতিস্থাপন করুন

মেমোরিস্টোর এবং ভিপিসি কানেক্টরের জন্য নতুন সেকশনগুলোর ভ্যালুগুলো শুধুমাত্র প্লেসহোল্ডার। এই ক্যাপিটালাইজড ভ্যালুগুলোকে ( YOUR_REDIS_HOST, YOUR_REDIS_PORT, PROJECT_ID, REGION, CONNECTOR_NAME ) আগে রিসোর্সগুলো তৈরি করার সময় সেভ করা ভ্যালু দিয়ে প্রতিস্থাপন করুন। আপনার মেমোরিস্টোর ইনস্ট্যান্সের ক্ষেত্রে, অবশ্যই HOST ( RESERVED_IP নয়) এবং PORT ব্যবহার করবেন। ইনস্ট্যান্সের নাম demo-ms এবং REGION us-central1 ধরে নিয়ে HOST এবং PORT পাওয়ার একটি দ্রুত কমান্ড-লাইন পদ্ধতি নিচে দেওয়া হলো:

$ gcloud redis instances describe demo-ms --region us-central1 \
    --format "value(host,port)"
10.251.161.51   6379

যদি আমাদের উদাহরণস্বরূপ Redis ইনস্ট্যান্সের IP অ্যাড্রেস 10.10.10.10 হতো, যা us-central1 অঞ্চলে অবস্থিত আমাদের my-project প্রোজেক্টে 6379 পোর্ট ব্যবহার করত এবং VPC কানেক্টরের নাম হতো demo-vpc , তাহলে app.yaml এর এই অংশগুলো দেখতে এইরকম হবে:

env_variables:
    REDIS_HOST: '10.10.10.10'
    REDIS_PORT: '6379'

vpc_access_connector:
    name: projects/my-project/locations/us-central1/connectors/demo-vpc

appengine_config.py তৈরি বা আপডেট করুন

অন্তর্নির্মিত তৃতীয় পক্ষের লাইব্রেরিগুলির জন্য সমর্থন যোগ করুন

আগে app.yaml সাথে আমরা যা করেছিলাম, ঠিক সেভাবেই grpcio এবং setuptools লাইব্রেরির ব্যবহার যোগ করুন। বিল্ট-ইন থার্ড-পার্টি লাইব্রেরি সমর্থন করার জন্য appengine_config.py পরিবর্তন করুন। যদি এটি পরিচিত মনে হয়, তার কারণ হলো মডিউল ২-এ অ্যাপ ইঞ্জিন ndb থেকে ক্লাউড এনডিবি-তে স্থানান্তরের সময়ও এটির প্রয়োজন হয়েছিল। প্রয়োজনীয় সঠিক পরিবর্তনটি হলো setuptools.pkg_resources ওয়ার্কিং সেটে lib ফোল্ডারটি যোগ করা:

4140b3800694f77e.png

পাইথন ৩ এর পার্থক্য

এই অংশটি ঐচ্ছিক এবং শুধুমাত্র যদি আপনি পাইথন ৩-এ পোর্ট করেন তবেই এটি প্রয়োজন। অ্যাপ ইঞ্জিনের দ্বিতীয় প্রজন্মের একটি স্বাগতযোগ্য পরিবর্তন হলো, (নন-বিল্ট-ইন) থার্ড-পার্টি প্যাকেজ কপি করা (যাকে কখনও কখনও "ভেন্ডরিং" বলা হয়) এবং app.yaml ফাইলে বিল্ট-ইন থার্ড-পার্টি প্যাকেজ রেফারেন্স করা এখন আর প্রয়োজনীয় নয়, যার অর্থ হলো আপনি সম্পূর্ণ appengine_config.py ফাইলটি মুছে ফেলতে পারেন।

৬. অ্যাপ্লিকেশন ফাইলগুলো আপডেট করুন

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

5d043768ba7be742.png

চলুন, একদম উপর থেকে শুরু করে এক এক করে এই অংশগুলো আলোচনা করা যাক।

আমদানি আপডেট করুন

মডিউল ১২-এর main.py ইম্পোর্ট সেকশনে Cloud NDB এবং Cloud Tasks ব্যবহৃত হয়; নিচে সেগুলোর ইম্পোর্টগুলো দেওয়া হলো:

পূর্বে:

from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb

মেমোরিস্টোরে স্যুইচ করার জন্য এনভায়রনমেন্ট ভেরিয়েবল পড়তে হয়, যার মানে আমাদের পাইথন os মডিউল এবং পাইথন রেডিস ক্লায়েন্ট redis ও প্রয়োজন হবে। যেহেতু রেডিস পাইথন অবজেক্ট ক্যাশ করতে পারে না, তাই pickle ব্যবহার করে সাম্প্রতিক ভিজিট তালিকাটি মার্শেল করুন, সুতরাং সেটিও ইম্পোর্ট করুন। মেমক্যাশের একটি সুবিধা হলো অবজেক্ট সিরিয়ালাইজেশন স্বয়ংক্রিয়ভাবে হয়, যেখানে মেমোরিস্টোরে আপনাকে নিজে থেকেই কিছু করতে হয়। সবশেষে, google.appengine.ext.ndb কে google.cloud.ndb দিয়ে প্রতিস্থাপন করে App Engine ndb থেকে Cloud NDB-তে আপগ্রেড করুন। এই পরিবর্তনগুলোর পরে, আপনার ইম্পোর্টগুলো এখন নিম্নরূপ দেখাবে:

পরে:

import os
import pickle
from flask import Flask, render_template, request
from google.cloud import ndb
import redis

আপডেট প্রারম্ভিককরণ

মডিউল ১২-এর প্রারম্ভিকীকরণের মধ্যে রয়েছে ` app নামক ফ্লাস্ক অ্যাপ্লিকেশন অবজেক্টটি ইনস্ট্যানশিয়েট করা এবং এক ঘণ্টার ক্যাশিংয়ের জন্য একটি কনস্ট্যান্ট সেট করা:

পূর্বে :

app = Flask(__name__)
HOUR = 3600

ক্লাউড এপিআই ব্যবহারের জন্য একটি ক্লায়েন্ট প্রয়োজন, তাই Flask-এর ঠিক পরেই একটি ক্লাউড এনডিবি ক্লায়েন্ট ইনস্ট্যানশিয়েট করুন। এরপর, app.yaml এ সেট করা এনভায়রনমেন্ট ভেরিয়েবল থেকে মেমোরিস্টোর ইনস্ট্যান্সের আইপি অ্যাড্রেস এবং পোর্ট নম্বর সংগ্রহ করুন। এই তথ্য হাতে নিয়ে একটি রেডিস ক্লায়েন্ট ইনস্ট্যানশিয়েট করুন। এই আপডেটগুলোর পর আপনার কোডটি দেখতে এইরকম হবে:

পরে:

app = Flask(__name__)
ds_client = ndb.Client()
HOUR = 3600
REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
REDIS_PORT = os.environ.get('REDIS_PORT', '6379')
REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)

পাইথন ৩ মাইগ্রেশন

এই অংশটি ঐচ্ছিক এবং এটি কেবল তখনই প্রয়োজন যদি আপনি মডিউল ১২ অ্যাপের পাইথন ৩ সংস্করণ থেকে শুরু করেন। সেক্ষেত্রে, ইম্পোর্ট এবং ইনিশিয়ালাইজেশন সম্পর্কিত বেশ কিছু আবশ্যক পরিবর্তন রয়েছে।

প্রথমত, যেহেতু মেমক্যাশ (Memcache) অ্যাপ ইঞ্জিনের (App Engine) একটি বান্ডেল করা পরিষেবা, তাই একটি পাইথন ৩ (Python 3) অ্যাপে এটি ব্যবহার করার জন্য অ্যাপ ইঞ্জিন এসডিকে (App Engine SDK) প্রয়োজন, বিশেষত ডব্লিউএসজিআই (WSGI) অ্যাপ্লিকেশনটিকে র‍্যাপ করার জন্য (এবং অন্যান্য প্রয়োজনীয় কনফিগারেশনের জন্যও):

পূর্বে:

from flask import Flask, render_template, request
from google.appengine.api import memcache, wrap_wsgi_app
from google.appengine.ext import ndb

app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)
HOUR = 3600

যেহেতু আমরা ক্লাউড মেমোরিস্টোরে (মেমক্যাশের মতো অ্যাপ ইঞ্জিনের কোনো বান্ডেলড সার্ভিস নয়) মাইগ্রেট করছি, তাই SDK-এর ব্যবহার অবশ্যই বাদ দিতে হবে। এটি করা খুবই সহজ, কারণ আপনাকে শুধু সেই পুরো লাইনটি ডিলিট করতে হবে যেখানে memcache এবং wrap_wsgi_app উভয়কেই ইম্পোর্ট করা হয়েছে। এছাড়াও, wrap_wsgi_app() কল করা লাইনটিও ডিলিট করে দিন। এই আপডেটগুলোর ফলে অ্যাপের এই অংশটি (আসলে, পুরো অ্যাপটিই) পাইথন ২ ভার্সনের মতোই থাকবে।

পরে:

import os
import pickle
from flask import Flask, render_template, request
from google.cloud import ndb
import redis

app = Flask(__name__)
ds_client = ndb.Client()
HOUR = 3600
REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
REDIS_PORT = os.environ.get('REDIS_PORT', '6379')
REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)

অবশেষে, app.yaml ( app_engine_apis: true লাইনটি মুছে দিন) এবং requirements.txt ( appengine-python-standard লাইনটি মুছে দিন) থেকে SDK-এর ব্যবহার সরিয়ে ফেলুন।

ক্লাউড মেমোরিস্টোর (এবং ক্লাউড এনডিবি)-তে স্থানান্তরিত করুন

ক্লাউড এনডিবি-র ডেটা মডেলটি অ্যাপ ইঞ্জিন ndb -র সাথে সামঞ্জস্যপূর্ণ হওয়ার উদ্দেশ্যে তৈরি করা হয়েছে, যার অর্থ হলো Visit অবজেক্টের সংজ্ঞা একই থাকে। মডিউল ২-এর ক্লাউড এনডিবি-তে মাইগ্রেশনকে অনুকরণ করে, store_visit() এবং fetch_visits() ফাংশনের সমস্ত ডেটাস্টোর কলকে বর্ধিত করা হয়েছে এবং একটি নতুন with ব্লকের মধ্যে এমবেড করা হয়েছে (কারণ ক্লাউড এনডিবি কনটেক্সট ম্যানেজারের ব্যবহার আবশ্যক)। এই পরিবর্তনের আগের কলগুলো নিচে দেওয়া হলো:

পূর্বে:

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    'get most recent visits'
    return Visit.query().order(-Visit.timestamp).fetch(limit)

উভয় ফাংশনে একটি ` with ds_client.context() ` ব্লক যোগ করুন, এবং ডেটাস্টোর কলগুলো এর ভিতরে (এবং ইনডেন্ট করে) রাখুন। এক্ষেত্রে, কলগুলোর নিজেদের মধ্যে কোনো পরিবর্তনের প্রয়োজন নেই:

পরে:

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    with ds_client.context():
        Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    'get most recent visits'
    with ds_client.context():
        return Visit.query().order(-Visit.timestamp).fetch(limit)

এরপর, চলুন ক্যাশিং-এর পরিবর্তনগুলো দেখে নেওয়া যাক। নিচে মডিউল ১২-এর main() ফাংশনটি দেওয়া হলো:

পূর্বে:

@app.route('/')
def root():
    'main application (GET) handler'
    # check for (hour-)cached visits
    ip_addr, usr_agt = request.remote_addr, request.user_agent
    visitor = '{}: {}'.format(ip_addr, usr_agt)
    visits = memcache.get('visits')

    # register visit & run DB query if cache empty or new visitor
    if not visits or visits[0].visitor != visitor:
        store_visit(ip_addr, usr_agt)
        visits = list(fetch_visits(10))
        memcache.set('visits', visits, HOUR)  # set() not add()

    return render_template('index.html', visits=visits)

Memcache-এর মতোই Redis-এরও "get" এবং "set" কল আছে। আমাদের শুধু সংশ্লিষ্ট ক্লায়েন্ট লাইব্রেরিগুলো অদলবদল করতে হবে, তাই না? প্রায় তাই। আগেই যেমন বলা হয়েছে, আমরা Redis দিয়ে একটি Python লিস্ট ক্যাশ করতে পারি না (কারণ এটিকে প্রথমে সিরিয়ালাইজ করতে হয়, যা Memcache স্বয়ংক্রিয়ভাবে করে থাকে), তাই set() কলে, pickle.dumps() ব্যবহার করে ভিজিটগুলোকে একটি স্ট্রিং-এ "পিকল" করতে হবে। একইভাবে, ক্যাশ থেকে ভিজিট পুনরুদ্ধার করার সময়, get() কলের ঠিক পরেই pickle.loads() দিয়ে এটিকে আনপিকল করতে হবে। এই পরিবর্তনগুলো প্রয়োগ করার পর মূল হ্যান্ডলারটি নিচে দেওয়া হলো:

পরে:

@app.route('/')
def root():
    'main application (GET) handler'
    # check for (hour-)cached visits
    ip_addr, usr_agt = request.remote_addr, request.user_agent
    visitor = '{}: {}'.format(ip_addr, usr_agt)
    rsp = REDIS.get('visits')
    visits = pickle.loads(rsp) if rsp else None

    # register visit & run DB query if cache empty or new visitor
    if not visits or visits[0].visitor != visitor:
        store_visit(ip_addr, usr_agt)
        visits = list(fetch_visits(10))
        REDIS.set('visits', pickle.dumps(visits), ex=HOUR)

    return render_template('index.html', visits=visits)

স্যাম্পল অ্যাপের Memcache-এর ব্যবহার Cloud Memorystore-এ রূপান্তর করার জন্য main.py তে প্রয়োজনীয় পরিবর্তন এখানেই শেষ। HTML টেমপ্লেট এবং Python 3-তে পোর্ট করার ব্যাপারে কী হবে?

এইচটিএমএল টেমপ্লেট ফাইল আপডেট করে পাইথন ৩-এ পোর্ট করা হবে?

অবাক হওয়ার কিছু নেই! এখানে কিছুই করার নেই, কারণ অ্যাপ্লিকেশনটি কোনো কোড পরিবর্তন বা কম্প্যাটিবিলিটি লাইব্রেরি ছাড়াই পাইথন ২ এবং ৩ উভয়টিতেই চলার জন্য ডিজাইন করা হয়েছে। আপনি mod13a (2.x) এবং mod13b (3.x) "FINISH" ফোল্ডার জুড়ে main.py হুবহু একই পাবেন। requirements.txt ফাইলের ক্ষেত্রেও একই কথা প্রযোজ্য, শুধুমাত্র ভার্সন নম্বরের (যদি ব্যবহৃত হয়ে থাকে) পার্থক্য ছাড়া। যেহেতু ইউজার ইন্টারফেস অপরিবর্তিত রয়েছে, তাই templates/index.html ফাইলেও কোনো আপডেট নেই।

পাইথন ৩ অ্যাপ ইঞ্জিনে এই অ্যাপটি চালানোর জন্য প্রয়োজনীয় সবকিছু আগেই কনফিগারেশনের সময় সম্পন্ন করা হয়েছে: app.yaml থেকে অপ্রয়োজনীয় নির্দেশাবলী সরিয়ে ফেলা হয়েছে এবং appengine_config.pylib ফোল্ডার উভয়ই মুছে ফেলা হয়েছে, কারণ পাইথন ৩-এ এগুলো ব্যবহৃত হয় না।

৭. সারসংক্ষেপ/পরিষ্কারকরণ

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

অ্যাপ্লিকেশনটি স্থাপন এবং যাচাই করুন

সর্বশেষ ধাপ হলো স্যাম্পল অ্যাপটি ডিপ্লয় করা। পাইথন ২ ডেভেলপারগণ: নিচের কমান্ডগুলো ব্যবহার করে lib ডিলিট করে পুনরায় ইনস্টল করুন। (যদি আপনার সিস্টেমে পাইথন ২ এবং ৩ উভয়ই ইনস্টল করা থাকে, তবে আপনাকে এর পরিবর্তে স্পষ্টভাবে pip2 চালাতে হতে পারে।)

rm -rf ./lib
pip install -t lib -r requirements.txt

পাইথন ২ এবং ৩ উভয় ডেভেলপারদের এখন থেকে নিম্নলিখিতভাবে তাদের অ্যাপ ডেপ্লয় করতে হবে:

gcloud app deploy

যেহেতু আপনি সম্পূর্ণ ভিন্ন একটি ক্যাশিং সার্ভিসের জন্য কেবল অভ্যন্তরীণ সংযোগগুলো পুনর্বিন্যাস করেছেন, তাই অ্যাপটি আপনার মডিউল ১২ অ্যাপের মতোই হুবহু কাজ করবে:

মডিউল ৭ ভিজিটমি অ্যাপ

এই ধাপে কোডল্যাব সম্পন্ন হলো। আপনার আপডেট করা স্যাম্পল অ্যাপটিকে মডিউল ১৩-এর যেকোনো একটি ফোল্ডার, mod13a (পাইথন ২) অথবা mod13b (পাইথন ৩)-এর সাথে তুলনা করার জন্য অনুরোধ করা হচ্ছে।

পরিষ্কার করা

সাধারণ

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

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

  • console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
  • console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
  • উপরের স্টোরেজ লিঙ্কগুলি আপনার PROJECT_ID এবং * LOC *-এর উপর নির্ভর করে, উদাহরণস্বরূপ, " us " যদি আপনার অ্যাপটি মার্কিন যুক্তরাষ্ট্রে হোস্ট করা হয়।

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

এই কোডল্যাবের জন্য নির্দিষ্ট

নীচে তালিকাভুক্ত পরিষেবাগুলি এই কোডল্যাবের জন্য অনন্য। আরও তথ্যের জন্য প্রতিটি পণ্যের ডকুমেন্টেশন দেখুন:

এই টিউটোরিয়ালটিতে চারটি ক্লাউড প্রোডাক্টের ব্যবহার অন্তর্ভুক্ত ছিল:

  • অ্যাপ ইঞ্জিন
  • ক্লাউড ডেটাস্টোর
  • ক্লাউড মেমোরিস্টোর
  • ক্লাউড ভিপিসি

এই রিসোর্সগুলো রিলিজ করার এবং বিলিং চার্জ এড়ানো বা কমানোর নির্দেশনা নিচে দেওয়া হলো।

মেমোরিস্টোর ইনস্ট্যান্স এবং ভিপিসি কানেক্টর বন্ধ করুন

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

ক্লাউড কনসোল থেকে

Memorystore ইনস্ট্যান্সটি ডিলিট করতে, Memorystore ড্যাশবোর্ডে ফিরে যান এবং ইনস্ট্যান্স আইডি-তে ক্লিক করুন:

2b09baf1aa2e0a25.png

একবার সেই ইনস্ট্যান্সের বিবরণ পৃষ্ঠায় গেলে, "মুছে ফেলুন"-এ ক্লিক করুন এবং নিশ্চিত করুন:

f9d9eb1c1d4c6107.png

VPC কানেক্টরটি ডিলিট করতে, এর ড্যাশবোর্ডে যান এবং যে কানেক্টরটি ডিলিট করতে চান তার পাশের চেকবক্সটি সিলেক্ট করুন, তারপর 'ডিলিট'-এ ক্লিক করে কনফার্ম করুন:

ca5fbd9f4c7c9b60.png

কমান্ড-লাইন থেকে

নিচের gcloud কমান্ডজোড়া যথাক্রমে Memorystore ইনস্ট্যান্স এবং VPC কানেক্টর উভয়কেই ডিলিট করে দেয়:

  • gcloud redis instances delete INSTANCE --region REGION
  • gcloud compute networks vpc-access connectors delete CONNECTOR --region REGION

যদি আপনি gcloud config set project ব্যবহার করে আপনার প্রজেক্ট আইডি সেট না করে থাকেন, তাহলে আপনাকে --project PROJECT_ID প্রদান করতে হতে পারে। যদি আপনার Memorystore ইনস্ট্যান্সের নাম demo-ms এবং VPC কানেক্টরের নাম demo-vpc হয়, এবং উভয়ই us-central1 অঞ্চলে থাকে, তাহলে নিচের দুটি কমান্ড দিয়ে নিশ্চিত করুন:

$ gcloud redis instances delete demo-ms --region us-central1
You are about to delete instance [demo-ms] in [us-central1].
Any associated data will be lost.

Do you want to continue (Y/n)?

Delete request issued for: [demo-ms]
Waiting for operation [projects/PROJECT/locations/REGION/operations/operation-aaaaa-bbbbb-ccccc-ddddd] to complete...done.
Deleted instance [demo-ms].
$
$ gcloud compute networks vpc-access connectors delete demo-vpc --region us-central1
You are about to delete connector [demo-vpc] in [us-central1].
Any associated data will be lost.

Do you want to continue (Y/n)?

Delete request issued for: [demo-vpc]
Waiting for operation [projects/PROJECT/locations/REGION/operations/aaaaa-bbbb-cccc-dddd-eeeee] to complete...done.
Deleted connector [demo-vpc].

Each request takes a few minutes to run. These steps are optional if you choose to shut down your entire Cloud project as described earlier, however you still incur billing until the shut down process has completed.

পরবর্তী পদক্ষেপ

Beyond this tutorial, other migration modules that focus on moving away from the legacy bundled services to consider include:

  • Module 2 : migrate from App Engine ndb to Cloud NDB
  • Modules 7-9 : migrate from App Engine Task Queue push tasks to Cloud Tasks
  • Modules 12-13 : migrate from App Engine Memcache to Cloud Memorystore
  • Modules 15-16 : migrate from App Engine Blobstore to Cloud Storage
  • Modules 18-19 : migrate from App Engine Task Queue (pull tasks) to Cloud Pub/Sub

App Engine is no longer the only serverless platform in Google Cloud. If you have a small App Engine app or one that has limited functionality and wish to turn it into a standalone microservice, or you want to break-up a monolithic app into multiple reusable components, these are good reasons to consider moving to Cloud Functions . If containerization has become part of your application development workflow, particularly if it consists of a CI/CD (continuous integration/continuous delivery or deployment) pipeline, consider migrating to Cloud Run . These scenarios are covered by the following modules:

  • Migrate from App Engine to Cloud Functions: see Module 11
  • Migrate from App Engine to Cloud Run: see Module 4 to containerize your app with Docker, or Module 5 to do it without containers, Docker knowledge, or Dockerfile s

Switching to another serverless platform is optional, and we recommend considering the best options for your apps and use cases before making any changes.

Regardless of which migration module you consider next, all Serverless Migration Station content (codelabs, videos, source code [when available]) can be accessed at its open source repo . The repo's README also provides guidance on which migrations to consider and any relevant "order" of Migration Modules.

৮. অতিরিক্ত সম্পদ

Listed below are additional resources for developers further exploring this or related Migration Module as well as related products. This includes places to provide feedback on this content, links to the code, and various pieces of documentation you may find useful.

Codelabs issues/feedback

এই কোডল্যাবে কোনো সমস্যা পেলে, অভিযোগ জানানোর আগে অনুগ্রহ করে সমস্যাটি অনুসন্ধান করুন। নতুন সমস্যা অনুসন্ধান ও তৈরি করার লিঙ্ক:

Migration resources

Links to the repo folders for Module 12 (START) and Module 13 (FINISH) can be found in the table below. They can also be accessed from the repo for all App Engine codelab migrations which you can clone or download a ZIP file.

Codelab

পাইথন ২

পাইথন ৩

মডিউল ১২

code

code

Module 13 (this codelab)

code

code

অনলাইন রেফারেন্স

এই টিউটোরিয়ালটির জন্য প্রাসঙ্গিক হতে পারে এমন কিছু অনলাইন রিসোর্স নিচে দেওয়া হলো:

অ্যাপ ইঞ্জিন

App Engine NDB and Cloud NDB

App Engine Memcache and Cloud Memorystore

ক্লাউড ভিপিসি

অন্যান্য ক্লাউড তথ্য

লাইসেন্স

এই কাজটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন ২.০ জেনেরিক লাইসেন্সের অধীনে রয়েছে।