Google App Engine Java অ্যাপ থেকে বিল্ডপ্যাক সহ ক্লাউড রানে স্থানান্তরিত হচ্ছে

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

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

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

অ্যাপ ইঞ্জিন থেকে ক্লাউড রানে স্থানান্তরের জন্য প্রয়োজনীয় ধাপগুলো শেখানোর পাশাপাশি, আপনি একটি জাভা ৮ অ্যাপ ইঞ্জিন অ্যাপকে জাভা ১৭-এ আপগ্রেড করার পদ্ধতিও শিখবেন।

আপনি যে অ্যাপ্লিকেশনটি মাইগ্রেট করতে আগ্রহী, সেটি যদি অ্যাপ ইঞ্জিনের লিগ্যাসি বান্ডেলড সার্ভিস বা অন্যান্য অ্যাপ ইঞ্জিন-নির্দিষ্ট ফিচার ব্যাপকভাবে ব্যবহার করে, তাহলে এই কোডল্যাবের চেয়ে ‘ Accessing App Engine bundled services for Java 11/17 ’ গাইডটি আপনার জন্য বেশি উপযুক্ত হতে পারে।

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

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

তোমার যা লাগবে

জরিপ

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

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

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

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

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

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

২. পটভূমি

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

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

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

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

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

১. প্রকল্প স্থাপন করুন

এই টিউটোরিয়ালের জন্য, আপনি একটি সম্পূর্ণ নতুন প্রজেক্টে appengine-java-migration-samples রিপোজিটরি থেকে একটি স্যাম্পল অ্যাপ ব্যবহার করবেন। নিশ্চিত করুন যে প্রজেক্টটির একটি সক্রিয় বিলিং অ্যাকাউন্ট আছে।

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

আপনার প্রোজেক্টের জন্য প্রয়োজনীয় API-গুলো সক্রিয় করতে নিম্নলিখিত কমান্ডটি চালান:

gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com run.googleapis.com

২. বেসলাইন নমুনা অ্যাপটি নিন

আপনার নিজের মেশিনে অথবা ক্লাউড শেলে স্যাম্পল অ্যাপটি ক্লোন করুন, তারপর বেসলাইন ফোল্ডারে যান।

নমুনাটি একটি জাভা ৮, সার্ভলেট-ভিত্তিক ডেটাস্টোর অ্যাপ যা অ্যাপ ইঞ্জিনে ডেপ্লয়মেন্টের জন্য তৈরি। অ্যাপ ইঞ্জিনে ডেপ্লয়মেন্টের জন্য এই অ্যাপটি কীভাবে প্রস্তুত করবেন, তা জানতে README-তে দেওয়া নির্দেশাবলী অনুসরণ করুন।

৩. (ঐচ্ছিক) বেসলাইন অ্যাপ স্থাপন করুন

ক্লাউড রানে স্থানান্তরের আগে অ্যাপটি অ্যাপ ইঞ্জিনে কাজ করে কিনা, তা নিশ্চিত করতে চাইলে নিম্নলিখিত বিষয়গুলো প্রয়োজন।

README.md-এ দেওয়া ধাপগুলো অনুসরণ করুন:

  1. gcloud CLI ইনস্টল করুন এবং এর সাথে পুনরায় পরিচিত হন।
  2. আপনার প্রোজেক্টের জন্য gcloud init দিয়ে gcloud CLI চালু করুন।
  3. gcloud app create ব্যবহার করে অ্যাপ ইঞ্জিন প্রজেক্টটি তৈরি করুন।
  4. নমুনা অ্যাপটি অ্যাপ ইঞ্জিনে স্থাপন করুন
./mvnw package appengine:deploy -Dapp.projectId=$PROJECT_ID
  1. অ্যাপটি অ্যাপ ইঞ্জিনে কোনো সমস্যা ছাড়াই চলে কিনা তা নিশ্চিত করুন।

৪. একটি আর্টিফ্যাক্ট রেজিস্ট্রি রিপোজিটরি তৈরি করুন

আপনার অ্যাপটিকে কন্টেইনারাইজ করার পর, আপনার ইমেজগুলো পুশ ও সংরক্ষণ করার জন্য একটি জায়গার প্রয়োজন হবে। গুগল ক্লাউডে এই কাজটি করার জন্য প্রস্তাবিত উপায় হলো আর্টিফ্যাক্ট রেজিস্ট্রি (Artifact Registry) ব্যবহার করা।

gcloud ব্যবহার করে নিম্নোক্তভাবে migration নামের রিপোজিটরিটি তৈরি করুন:

gcloud artifacts repositories create migration --repository-format=docker \
--description="Docker repository for the migrated app" \
--location="northamerica-northeast1"

উল্লেখ্য যে, এই রিপোজিটরিটি docker ফরম্যাট টাইপ ব্যবহার করে, কিন্তু আরও বিভিন্ন ধরনের রিপোজিটরি টাইপ উপলব্ধ রয়েছে।

এই পর্যায়ে, আপনার কাছে আপনার বেসলাইন অ্যাপ ইঞ্জিন অ্যাপটি রয়েছে এবং আপনার গুগল ক্লাউড প্রজেক্টটি ক্লাউড রানে মাইগ্রেট করার জন্য প্রস্তুত।

৪. অ্যাপ্লিকেশন ফাইলগুলি পরিবর্তন করুন

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

১. জাভা ১৭- এ আপগ্রেড করা

আপনার অ্যাপটি যদি জাভা ৮-এ চলে, তাহলে নিরাপত্তা আপডেট পেতে এবং নতুন ল্যাঙ্গুয়েজ ফিচারগুলো ব্যবহারের সুযোগ পেতে ১১ বা ১৭-এর মতো পরবর্তী কোনো এলটিএস সংস্করণে আপগ্রেড করার কথা বিবেচনা করতে পারেন।

প্রথমে আপনার pom.xml এর প্রোপার্টিগুলো আপডেট করে নিম্নলিখিত বিষয়গুলো অন্তর্ভুক্ত করুন:

<properties>
    <java.version>17</java.version>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
</properties>

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

২. একটি ওয়েব সার্ভার অন্তর্ভুক্ত করা

অ্যাপ ইঞ্জিন এবং ক্লাউড রানের মধ্যে বেশ কিছু পার্থক্য রয়েছে যা এদের মধ্যে যেকোনো একটি ব্যবহার করার সময় বিবেচনা করা উচিত। একটি পার্থক্য হলো, অ্যাপ ইঞ্জিনের জাভা ৮ রানটাইম তার হোস্ট করা অ্যাপগুলোর জন্য একটি জেটি (Jetty) সার্ভার সরবরাহ ও পরিচালনা করত, কিন্তু ক্লাউড রান তা করে না। আমরা একটি ওয়েব সার্ভার এবং সার্ভলেট কন্টেইনারের জন্য স্প্রিং বুট (Spring Boot) ব্যবহার করব।

নিম্নলিখিত নির্ভরতাগুলি যোগ করুন:

<dependencies>
<!-- ... -->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
       <version>2.6.6</version>
       <exclusions>
           <!-- Exclude the Tomcat dependency -->
           <exclusion>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-tomcat</artifactId>
           </exclusion>
       </exclusions>
   </dependency>
   <!-- Use Jetty instead -->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-jetty</artifactId>
       <version>2.6.6</version>
   </dependency>
<!-- ... -->
</dependencies>

Spring Boot ডিফল্টরূপে একটি Tomcat সার্ভার অন্তর্ভুক্ত করে, কিন্তু এই স্যাম্পলটি সেই অংশটি বাদ দেবে এবং শুধুমাত্র Jetty ব্যবহার করবে, যাতে মাইগ্রেশনের পরে ডিফল্ট আচরণে পার্থক্য ন্যূনতম রাখা যায়।

৩. স্প্রিং বুট সেটআপ

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

com.example.appengine প্যাকেজে নিম্নলিখিত MigratedServletApplication.java ক্লাসটি তৈরি করুন:

package com.example.appengine;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@ServletComponentScan
@SpringBootApplication
@EnableAutoConfiguration
public class MigratedServletApplication {
    public static void main(String[] args) {
        SpringApplication.run(MigratedServletApplication.class, args);
    }
}

উল্লেখ্য যে, এর মধ্যে @ServletComponentScan অ্যানোটেশনটি অন্তর্ভুক্ত রয়েছে, যা (ডিফল্টরূপে বর্তমান প্যাকেজে ) যেকোনো @WebServlets এর সন্ধান করবে এবং সেগুলোকে প্রত্যাশিতভাবে উপলব্ধ করে তুলবে।

৪. বিল্ড কনফিগারেশন

এরপরে, আমাদের অ্যাপ্লিকেশনটিকে WAR হিসেবে প্যাকেজ করার কনফিগারেশনটি সরিয়ে ফেলুন। এর জন্য খুব বেশি কনফিগারেশনের প্রয়োজন হবে না, বিশেষ করে যেসব প্রোজেক্টে বিল্ড টুল হিসেবে Maven ব্যবহৃত হয় — কারণ jar প্যাকেজিংই হলো ডিফল্ট আচরণ।

pom.xml ফাইল থেকে packaging ট্যাগটি সরিয়ে ফেলুন:

<packaging>war</packaging>

এরপরে, spring-boot-maven-plugin যোগ করুন:

<plugins>
<!-- ... -->
  <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.6.6</version>
  </plugin>
<!-- ... -->
</plugins>

৫. অ্যাপ ইঞ্জিন কনফিগারেশন, সার্ভিস এবং ডিপেন্ডেন্সি থেকে সরে আসা

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

নমুনা অ্যাপটি লিগ্যাসি বান্ডেল সার্ভিস ব্যবহার করে না, কিন্তু যেসব ব্যবহারকারীর অ্যাপে তা ব্যবহৃত হয়, তারা নিম্নলিখিত গাইডগুলো দেখতে পারেন:

যেহেতু আপনি এখন থেকে ক্লাউড রান-এ ডেপ্লয় করবেন, তাই appengine-maven-plugin সরিয়ে ফেলা যেতে পারে:

<plugin>
 <groupId>com.google.cloud.tools</groupId>
 <artifactId>appengine-maven-plugin</artifactId>
 <version>2.4.1</version>
 <configuration>
   <!-- can be set w/ -DprojectId=myProjectId on command line -->
   <projectId>${app.projectId}</projectId>
   <!-- set the GAE version or use "GCLOUD_CONFIG" for an autogenerated GAE version -->
   <version>GCLOUD_CONFIG</version>
 </configuration>
</plugin>

৫. অ্যাপ্লিকেশনটিকে কন্টেইনারাইজ ও ডিপ্লয় করুন

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

এই পূর্বশর্তগুলো পূরণ হয়ে গেলে, আপনার সোর্স ডিরেক্টরি থেকে নিম্নলিখিতটি চালান:

gcloud run deploy SERVICE --source .

`run deploy` কমান্ড চালানোর সময় আপনাকে কয়েকটি বিষয় জিজ্ঞাসা করা হবে, যেমন:

  • সোর্স কোডের অবস্থান প্রদান করা
  • পরিষেবার নাম প্রদান করা
  • ক্লাউড রান এপিআই সক্রিয় করা
  • আপনার অঞ্চল নির্বাচন করা

ওই নির্দেশাবলীতে সাড়া দেওয়ার পর বিল্ড এবং ডিপ্লয় প্রক্রিয়া শুরু হয়, এই সময়ে ক্লাউড বিল্ড নিম্নলিখিত কাজগুলো করে থাকে:

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

বিল্ড এবং ডিপ্লয় সম্পন্ন হয়ে গেলে, আপনি একটি বার্তা পাবেন যেখানে জানানো হবে যে একটি নতুন রিভিশন লাইভ হয়েছে এবং এটি ১০০% ট্র্যাফিক সামলাচ্ছে।

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

অভিনন্দন, আপনি আপনার অ্যাপটি আপগ্রেড, কন্টেইনারাইজ ও মাইগ্রেট করেছেন, এবং এর মাধ্যমেই এই টিউটোরিয়ালটি শেষ হলো!

এখান থেকে, পরবর্তী পদক্ষেপ হলো CI/CD এবং সফটওয়্যার সাপ্লাই চেইন সুরক্ষার বৈশিষ্ট্যগুলি সম্পর্কে আরও জানা, যা এখন ক্লাউড বিল্ডের মাধ্যমে স্থাপন করা আপনার নাগালের মধ্যে রয়েছে:

ঐচ্ছিক: পরিষ্করণ করুন এবং/অথবা পরিষেবা নিষ্ক্রিয় করুন

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

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

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

অ্যাপ ইঞ্জিন মাইগ্রেশন মডিউল কোডল্যাবস সমস্যা/মতামত

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

অভিবাসন সম্পদ

অনলাইন রিসোর্স

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

অ্যাপ ইঞ্জিন

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

ভিডিও

লাইসেন্স

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