ডুয়েট এআই টেকনিক্যাল হ্যান্ডস অন ওয়ার্কশপ গাইড ফর ডেভেলপার কোডল্যাব

১. উদ্দেশ্যসমূহ

এই কর্মশালার উদ্দেশ্য হলো ব্যবহারকারী ও অনুশীলনকারীদের হাতে-কলমে ডুয়েট এআই শিক্ষা প্রদান করা।

এই কোডল্যাবে আপনি নিম্নলিখিত বিষয়গুলো শিখবেন:

  1. আপনার GCP প্রোজেক্টে Duet AI সক্রিয় করুন এবং IDE ও ক্লাউড কনসোলে ব্যবহারের জন্য এটি কনফিগার করুন।
  2. কোড তৈরি, সম্পূর্ণকরণ এবং ব্যাখ্যার জন্য ডুয়েট এআই ব্যবহার করুন।
  3. অ্যাপ্লিকেশনের কোনো সমস্যা ব্যাখ্যা করতে ও তার সমাধান করতে Duet AI ব্যবহার করুন।
  4. ডুয়েট এআই-এর ফিচারগুলোর মধ্যে রয়েছে আইডিই চ্যাট ও মাল্টি-টার্ন চ্যাট, চ্যাট বনাম ইনলাইন কোড জেনারেশন, কোড ব্যাখ্যা ও আবৃত্তি স্বীকৃতির মতো স্মার্ট অ্যাকশন এবং আরও অনেক কিছু।

আখ্যান

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

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

যেহেতু ডেভেলপারটি কোম্পানিতে নতুন, তাই তিনি কোড তৈরি, ব্যাখ্যা এবং ডকুমেন্টেশনের জন্য ডুয়েট এআই (Duet AI) ব্যবহার করবেন।

সার্ভিসটি কোড করার পরে, একজন প্ল্যাটফর্ম অ্যাডমিনিস্ট্রেটর ডুয়েট এআই (চ্যাট) ব্যবহার করে আর্টিফ্যাক্ট (ডকার কন্টেইনার) এবং GCP-তে আর্টিফ্যাক্টটি ডেপ্লয় করার জন্য প্রয়োজনীয় রিসোর্স (যেমন আর্টিফ্যাক্ট রেজিস্ট্রি, IAM পারমিশন, একটি কোড রিপোজিটরি, কম্পিউট ইনফ্রাস্ট্রাকচার অর্থাৎ GKE বা CloudRun ইত্যাদি) তৈরি করতে সাহায্য করবেন।

অ্যাপ্লিকেশনটি GCP-তে ডেপ্লয় করার পর, একজন অ্যাপ্লিকেশন অপারেটর/SRE নতুন পরিষেবাটির কোনো ত্রুটি সমাধান করতে Duet AI (এবং Cloud Ops) ব্যবহার করবেন।

ব্যক্তিত্ব

কর্মশালাটি নিম্নলিখিত ব্যক্তিত্বকে অন্তর্ভুক্ত করে:

  1. অ্যাপ্লিকেশন ডেভেলপার - প্রোগ্রামিং এবং সফটওয়্যার ডেভেলপমেন্ট সম্পর্কে কিছু জ্ঞান থাকা আবশ্যক।

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

২. পরিবেশ প্রস্তুত করা

ডুয়েট এআই সক্রিয় করা হচ্ছে

আপনি একটি GCP প্রোজেক্টে API (gcloud বা Terraform-এর মতো IaC টুল) অথবা ক্লাউড কনসোল UI-এর মাধ্যমে Duet AI সক্রিয় করতে পারেন।

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

জিক্লাউডের মাধ্যমে

ক্লাউড শেল সক্রিয় করুন:

আপনার PROJECT_IDUSER কনফিগার করুন এবং Cloud AI Companion API সক্রিয় করুন।

export PROJECT_ID=<YOUR PROJECT ID>
export USER=<YOUR USERNAME> # Use your full LDAP, e.g. name@example.com
gcloud config set project ${PROJECT_ID}
gcloud services enable cloudaicompanion.googleapis.com --project ${PROJECT_ID}

আউটপুটটি নিম্নরূপ:

Updated property [core/project].
Operation "operations/acat.p2-60565640195-f37dc7fe-b093-4451-9b12-934649e2a435" finished successfully.

USER অ্যাকাউন্টকে Cloud AI Companion User এবং Service Usage Viewer Identity and Access Management (IAM) রোল দুটি প্রদান করুন। আমরা IDE এবং কনসোলে যে ফিচারগুলো ব্যবহার করব, সেগুলোর পেছনে Cloud Companion API কাজ করে। কনসোলে UI সক্রিয় করার আগে দ্রুত যাচাই করার জন্য service Usage Viewer পারমিশনটি ব্যবহার করা হয় (যাতে Duet UI শুধুমাত্র সেইসব প্রোজেক্টে দেখা যায় যেখানে API সক্রিয় করা আছে)।

gcloud projects add-iam-policy-binding  ${PROJECT_ID} \
--member=user:${USER} --role=roles/cloudaicompanion.user

gcloud projects add-iam-policy-binding  ${PROJECT_ID} \
--member=user:${USER} --role=roles/serviceusage.serviceUsageViewer

আউটপুটটি নিম্নরূপ:

...
- members:
  - user:<YOUR USER ACCOUNT>
  role: roles/cloudaicompanion.user

...
- members:
  - user:<YOUR USER ACCOUNT>
  role: roles/serviceusage.serviceUsageViewer

ক্লাউড কনসোলের মাধ্যমে

এপিআইটি সক্রিয় করতে, গুগল ক্লাউড কনসোলে ক্লাউড এআই কম্প্যানিয়ন এপিআই পৃষ্ঠায় যান।

প্রজেক্ট সিলেক্টর থেকে একটি প্রজেক্ট নির্বাচন করুন।

সক্ষম করুন -এ ক্লিক করুন।

পৃষ্ঠাটি আপডেট হয়ে ' এনাবলড ' স্ট্যাটাস দেখাচ্ছে। নির্বাচিত গুগল ক্লাউড প্রজেক্টে ডুয়েট এআই এখন সেই সমস্ত ব্যবহারকারীদের জন্য উপলব্ধ, যাদের প্রয়োজনীয় আইএএম রোল রয়েছে।

Duet AI ব্যবহার করার জন্য প্রয়োজনীয় IAM রোলগুলো মঞ্জুর করতে, IAM পেজে যান।

প্রিন্সিপাল কলামে, আপনার সেই USER-কে খুঁজুন যার জন্য আপনি Duet AI-তে অ্যাক্সেস চালু করতে চান, এবং তারপর সেই সারিতে থাকা পেন্সিল আইকন ✏️-এ ক্লিক করে প্রিন্সিপাল সম্পাদনা করুন

এডিট অ্যাক্সেস প্যানে, ‘অ্যাড অ্যানাদার রোল’ (Add another role) -এ ক্লিক করুন।

'ভূমিকা নির্বাচন করুন'-এ, 'ক্লাউড এআই কম্প্যানিয়ন ব্যবহারকারী' নির্বাচন করুন।

Add another role-এ ক্লিক করুন এবং Service Usage Viewer নির্বাচন করুন।

সংরক্ষণ করুন- এ ক্লিক করুন।

IDE সেট আপ করা

ডেভেলপাররা তাদের প্রয়োজন অনুসারে বিভিন্ন IDE থেকে বেছে নিতে পারেন। Duet AI কোড অ্যাসিস্ট্যান্স একাধিক IDE-তে উপলব্ধ, যেমন Visual Studio Code , JetBrains IDE (IntelliJ, PyCharm, GoLand, WebStorm এবং আরও), Cloud Workstations , Cloud Shell Editor

এই ল্যাবে আপনি ক্লাউড ওয়ার্কস্টেশন অথবা ক্লাউড শেল এডিটর ব্যবহার করতে পারেন।

এই কর্মশালায় ক্লাউড শেল এডিটর ব্যবহার করা হয়।

মনে রাখবেন, ক্লাউড ওয়ার্কস্টেশন সেট আপ করতে ২০-৩০ মিনিট সময় লাগতে পারে।

অবিলম্বে ব্যবহার করতে, ক্লাউড শেল এডিটর ব্যবহার করুন।

আপনার ক্লাউড শেলের উপরের মেনু বারে থাকা পেন্সিল আইকনে ✏️ ক্লিক করে ক্লাউড শেল এডিটর খুলুন।

ক্লাউড শেল এডিটরের UI এবং UX অনেকটাই VSCode-এর মতো।

d6a6565f83576063.png

সেটিংস প্যানে প্রবেশ করতে CTRL (উইন্ডোজে)/CMD (ম্যাকে) + , (কমা) চাপুন।

সার্চ বারে 'duet ai' টাইপ করুন।

ক্লাউডকোড নিশ্চিত করুন বা সক্ষম করুন › ডুয়েট এআই: সক্ষম করুন এবং ক্লাউডকোড › ডুয়েট এআই › ইনলাইন পরামর্শ: অটো সক্ষম করুন

111b8d587330ec74.png

নিচের স্ট্যাটাস বারে, ‘Cloud Code - Sign In’- এ ক্লিক করুন এবং সাইন ইন করার প্রক্রিয়াটি অনুসরণ করুন।

আপনি যদি আগে থেকেই সাইন ইন করে থাকেন, তাহলে স্ট্যাটাস বারে ‘Cloud Code - No project’ দেখাবে।

Cloud Code - No project-এ ক্লিক করুন এবং উপরে একটি অ্যাকশন ড্রপডাউন প্যানেল দেখা যাবে। Select a Google Cloud project- এ ক্লিক করুন।

3241a59811e3c84a.png

আপনার প্রজেক্ট আইডি টাইপ করা শুরু করুন এবং আপনার প্রজেক্টটি তালিকায় চলে আসবে।

c5358fc837588fe.png

প্রকল্পের তালিকা থেকে আপনার PROJECT_ID নির্বাচন করুন।

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

Duet AI আইকনে ক্লিক করুন d97fc4e7b594c3af.png বাম দিকের মেনু বারে ক্লিক করলে ডুয়েট এআই চ্যাট উইন্ডোটি দেখা যাবে। যদি 'Select GCP Project' লেখা কোনো মেসেজ আসে, তাহলে ক্লিক করে প্রজেক্টটি পুনরায় সিলেক্ট করুন।

আপনি এখন ডুয়েট এআই চ্যাট উইন্ডোটি দেখতে পাচ্ছেন।

781f888360229ca6.png

৩. অবকাঠামো স্থাপন করা

d3234d237f00fdbb.png

GCP-তে নতুন শিপিং পরিষেবাটি চালানোর জন্য আপনার নিম্নলিখিত GCP রিসোর্সগুলির প্রয়োজন হবে:

  1. ডাটাবেস সহ একটি ক্লাউড এসকিউএল ইনস্ট্যান্স।
  2. কন্টেইনারাইজড সার্ভিসটি চালানোর জন্য একটি GKE ক্লাস্টার।
  3. ডকার ইমেজ সংরক্ষণের জন্য একটি আর্টিফ্যাক্ট রেজিস্ট্রি।
  4. কোডের জন্য একটি ক্লাউড সোর্স রিপোজিটরি।

আপনার GCP প্রোজেক্টে পরিকাঠামো সেট আপ করার জন্য, ক্লাউড শেল টার্মিনালে নিম্নলিখিত রেপোটি ক্লোন করুন এবং নিচের কমান্ডগুলো চালান।

# Set your project
export PROJECT_ID=<INSERT_YOUR_PROJECT_ID>
gcloud config set core/project ${PROJECT_ID}

# Enable Cloudbuild and grant Cloudbuild SA owner role 
export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format 'value(projectNumber)')
gcloud services enable cloudbuild.googleapis.com
gcloud projects add-iam-policy-binding ${PROJECT_ID} --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com --role roles/owner

# Clone the repo
git clone https://github.com/duetailabs/dev.git ~/duetaidev
cd ~/duetaidev

# Run Cloudbuild to create the necessary resources
gcloud builds submit --substitutions=_PROJECT_ID=${PROJECT_ID}

# To destroy all GCP resources, run the following
# gcloud builds submit --substitutions=_PROJECT_ID=${PROJECT_ID} --config=cloudbuild_destroy.yaml

৪. একটি পাইথন ফ্লাস্ক সার্ভিস তৈরি করা

9745ba5c70782e76.png

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

  1. package-service.yaml - প্যাকেজ সার্ভিসের জন্য একটি ওপেন এপিআই স্পেক, যাতে উচ্চতা, প্রস্থ, ওজন এবং বিশেষ হ্যান্ডলিং নির্দেশাবলীর মতো ডেটা থাকে।
  2. data_model.py - প্যাকেজ-সার্ভিস এপিআই স্পেকের জন্য ডেটা মডেল। এটি product_details ডেটাবেসে packages টেবিলটিও তৈরি করে।
  3. connect_connector.py - ক্লাউডএসকিউএল সংযোগ (ইঞ্জিন, সেশন এবং বেস ORM নির্ধারণ করে)
  4. db_init.py - packages টেবিলে নমুনা ডেটা তৈরি করে।
  5. main.py - একটি পাইথন ফ্লাস্ক সার্ভিস, যার একটি GET এন্ডপয়েন্ট রয়েছে যা product_id-এর উপর ভিত্তি করে packages ডেটা থেকে প্যাকেজের বিবরণ সংগ্রহ করে।
  6. test.py - ইউনিট টেস্ট
  7. requirement.txt - পাইথনের প্রয়োজনীয়তা
  8. Dockerfile - এই অ্যাপ্লিকেশনটিকে কন্টেইনারাইজ করার জন্য

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

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

ক্লাউড শেল টার্মিনালে রিপোজিটরি ক্লোন করতে নিম্নলিখিত কমান্ডটি চালান।

cd ~
gcloud source repos clone shipping shipping
cd ~/shipping 

ক্লাউড শেল এডিটর-এর বাম দিকের মেনু থেকে ডুয়েট এআই চ্যাট সাইডবারটি খুলুন। আইকনটি দেখতে এইরকম 8b135a000b259175.png এখন আপনি কোড সহায়তার জন্য ডুয়েট এআই ব্যবহার করতে পারবেন।

প্যাকেজ-পরিষেবা.yaml

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

নির্দেশ ১: একটি সংখ্যাসূচক প্রোডাক্ট আইডির ভিত্তিতে শিপিং এবং প্যাকেজ সম্পর্কিত তথ্য প্রদানকারী একটি সার্ভিসের জন্য একটি OpenAPI yaml স্পেসিফিকেশন তৈরি করুন। সার্ভিসটিতে প্যাকেজের উচ্চতা, প্রস্থ, গভীরতা, ওজন এবং হ্যান্ডলিং সংক্রান্ত কোনো বিশেষ নির্দেশনা থাকলে তার তথ্য অন্তর্ভুক্ত থাকতে হবে।

ba12626f491a1204.png

তৈরি হওয়া কোড উইন্ডোর উপরের ডানদিকে তিনটি অপশন তালিকাভুক্ত আছে।

আপনি হয় COPY করতে পারেন 71194556d8061dae.png কোডটি নিয়ে একটি ফাইলে পেস্ট করুন।

আপনি ADD করতে পারেন df645de8c65607a.png এডিটরে বর্তমানে খোলা ফাইলটির কোড।

অথবা আপনি OPEN পারেন a4c7ed6d845df343.png কোডটি একটি নতুন ফাইলে রাখুন।

OPEN এ ক্লিক করুন a4c7ed6d845df343.png কোডটি একটি নতুন ফাইলে রাখুন।

ফাইলটি সংরক্ষণ করতে CTRL/CMD + s চাপুন এবং অ্যাপ্লিকেশন ফোল্ডারে package-service.yaml নামে ফাইলটি সংরক্ষণ করুন। OK-তে ক্লিক করুন।

f6ebd5b836949366.png

চূড়ান্ত ফাইলটি এই কোডল্যাবের পরিশিষ্ট (APPENDIX) অংশে রয়েছে। যদি সেখানে না থাকে, তবে ম্যানুয়ালি প্রয়োজনীয় পরিবর্তনগুলো করে নিন।

ডুয়েট এআই-এর প্রতিক্রিয়া দেখার জন্য আপনি বিভিন্ন নির্দেশও চেষ্টা করে দেখতে পারেন।

ট্র্যাশ আইকনে ক্লিক করে ডুয়েট এআই চ্যাট হিস্ট্রি রিসেট করুন। f574ca2c1e114856.png Duet AI সাইডবারের শীর্ষে।

data_model.py

এরপরে, আপনি OpenAPI স্পেসিফিকেশনের উপর ভিত্তি করে সার্ভিসটির জন্য ডেটা মডেল পাইথন ফাইলটি তৈরি করবেন।

package-service.yaml ফাইলটি খোলা থাকা অবস্থায়, নিম্নলিখিত প্রম্পটটি প্রবেশ করান।

নির্দেশনা ১: পাইথন sqlalchemy ORM ব্যবহার করে এই API সার্ভিসের জন্য একটি ডেটা মডেল তৈরি করুন। এছাড়াও, ডাটাবেস টেবিলগুলো তৈরি করার জন্য একটি পৃথক ফাংশন এবং একটি প্রধান এন্ট্রিপয়েন্ট অন্তর্ভুক্ত করুন।

b873a6a28bd28ca1.png

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

প্রথমত, Base ধরনের Package নামক একটি ক্লাস আছে যা packages ডেটাবেসের জন্য ডেটা মডেলকে নিম্নরূপভাবে সংজ্ঞায়িত করে:

class Package(Base):
    __tablename__ = 'packages'

    id = Column(Integer, primary_key=True)
    product_id = Column(String(255))
    height = Column(Float)
    width = Column(Float)
    depth = Column(Float)
    weight = Column(Float)
    special_handling_instructions = Column(String(255))

এরপরে, আপনার এমন একটি ফাংশন প্রয়োজন যা ডাটাবেসে নিম্নলিখিতের মতো টেবিল তৈরি করবে:

def create_tables(engine):
    Base.metadata.create_all(engine)

অবশেষে, CloudSQL ডেটাবেসে টেবিলটি তৈরি করার জন্য আপনার একটি main ফাংশন প্রয়োজন হবে, যা create_tables ফাংশনটি চালাবে, যেমনটি নিচে দেখানো হলো:

if __name__ == '__main__':
    from sqlalchemy import create_engine

    engine = create_engine('sqlite:///shipping.db')
    create_tables(engine)

    print('Tables created successfully.')

লক্ষ্য করুন যে, main ফাংশনটি একটি স্থানীয় sqlite ডাটাবেস ব্যবহার করে একটি ইঞ্জিন তৈরি করছে। CloudSQL ব্যবহার করার জন্য, আপনাকে এটি পরিবর্তন করতে হবে। আপনি সেই কাজটি একটু পরে করবেন।

OPEN ব্যবহার করে a4c7ed6d845df343.png আগের মতোই কোডটি একটি নতুন ফাইল ওয়ার্কফ্লোতে চালান। কোডটি data_model.py নামের একটি ফাইলে সেভ করুন (লক্ষ্য করুন, নামের মধ্যে ড্যাশের পরিবর্তে আন্ডারস্কোর রয়েছে)।

ট্র্যাশ আইকনে ক্লিক করে ডুয়েট এআই চ্যাট হিস্ট্রি রিসেট করুন। f574ca2c1e114856.png Duet AI সাইডবারের শীর্ষে।

connect-Connector.py

CloudSQL কানেক্টরটি তৈরি করুন।

data_model.py ফাইলটি খোলা থাকা অবস্থায়, নিম্নলিখিত নির্দেশাবলী লিখুন।

নির্দেশনা ১: cloud-sql-python-connector লাইব্রেরি ব্যবহার করে এমন একটি ফাংশন তৈরি করুন যা Postgres-এর একটি Cloud SQL ইনস্ট্যান্সের জন্য একটি কানেকশন পুল ইনিশিয়ালাইজ করে।

ed05cb6ff85d34c5.png

উল্লেখ্য যে, এই উত্তরে cloud-sql-python-connector লাইব্রেরিটি ব্যবহার করা হয়নি। Duet-কে কিছুটা নির্দেশনা দেওয়ার জন্য, আপনি একই চ্যাট থ্রেডে নির্দিষ্ট তথ্য যোগ করে প্রম্পটগুলোকে আরও পরিমার্জিত করতে পারেন।

চলুন অন্য একটি প্রম্পট ব্যবহার করি।

নির্দেশ ২: অবশ্যই cloud-sql-python-connector লাইব্রেরিটি ব্যবহার করতে হবে।

d09095b44dde35bf.png

নিশ্চিত করুন যে এটি cloud-sql-python-connector লাইব্রেরিটি ব্যবহার করে।

OPEN ব্যবহার করে a4c7ed6d845df343.png আগের মতোই একটি নতুন ফাইল ওয়ার্কফ্লোতে কোডটি চালান। কোডটি connect_conector.py নামের একটি ফাইলে সেভ করুন। আপনার ম্যানুয়ালি pg8000 লাইব্রেরিটি ইম্পোর্ট করার প্রয়োজন হতে পারে, অনুগ্রহ করে নিচের ফাইলটি দেখুন।

Duet AI চ্যাট হিস্ট্রি মুছে ফেলুন এবং connect_connector.py ফাইলটি খুলে অ্যাপ্লিকেশনটিতে ব্যবহার করার জন্য DB engine , sessionmaker এবং base ORM জেনারেট করুন।

নির্দেশ ১: connect_with_connector পদ্ধতি ব্যবহার করে একটি ইঞ্জিন, সেশনমেকার ক্লাস এবং বেস ORM তৈরি করুন।

6e4214b72ab13a63.png

প্রতিক্রিয়াটি ` engine , Session এবং Base connect_connector.py ফাইলে যুক্ত করতে পারে।

চূড়ান্ত ফাইলটি এই কোডল্যাবের পরিশিষ্ট (APPENDIX) অংশে রয়েছে। যদি সেখানে না থাকে, তবে ম্যানুয়ালি প্রয়োজনীয় পরিবর্তনগুলো করে নিন।

Duet AI-এর প্রতিক্রিয়ার সম্ভাব্য ভিন্নতা দেখতে আপনি বিভিন্ন নির্দেশও চেষ্টা করে দেখতে পারেন।

ট্র্যাশ আইকনে ক্লিক করে ডুয়েট এআই চ্যাট হিস্ট্রি রিসেট করুন। f574ca2c1e114856.png Duet AI সাইডবারের শীর্ষে।

data_model.py আপডেট করা হচ্ছে

CloudSQL ডেটাবেসে একটি টেবিল তৈরি করার জন্য, আপনাকে পূর্ববর্তী ধাপে তৈরি করা ইঞ্জিনটি ( connect_connector.py ফাইলে) ব্যবহার করতে হবে।

Duet AI চ্যাট হিস্ট্রি মুছে ফেলুন। data_model.py ফাইলটি খুলুন। নিচের প্রম্পটটি চেষ্টা করুন।

নির্দেশনা ১: main ফাংশনে, connect_connector.py থেকে ইঞ্জিনটি ইম্পোর্ট এবং ব্যবহার করুন।

2e768c9b6c523b9a.png

আপনার connect_connector (CloudSQL-এর জন্য) থেকে engine ইম্পোর্ট করার রেসপন্সটি দেখা উচিত। create_table ফাংশনটি সেই ইঞ্জিনটি ব্যবহার করে (ডিফল্ট sqlite লোকাল ডিবি-র পরিবর্তে)।

data_model.py ফাইলটি আপডেট করুন।

চূড়ান্ত ফাইলটি এই কোডল্যাবের পরিশিষ্ট (APPENDIX) অংশে রয়েছে। যদি সেখানে না থাকে, তবে ম্যানুয়ালি প্রয়োজনীয় পরিবর্তনগুলো করে নিন।

ডুয়েট এআই-এর বিভিন্ন প্রতিক্রিয়া দেখার জন্য আপনি নানা ধরনের নির্দেশও চেষ্টা করে দেখতে পারেন।

ট্র্যাশ আইকনে ক্লিক করে ডুয়েট এআই চ্যাট হিস্ট্রি রিসেট করুন। f574ca2c1e114856.png Duet AI সাইডবারের শীর্ষে।

requirements.txt

অ্যাপ্লিকেশনটির জন্য একটি requirements.txt ফাইল তৈরি করুন।

connect_connector.py এবং data_model.py উভয় ফাইল খুলুন এবং নিম্নলিখিত প্রম্পটটি প্রবেশ করান।

নির্দেশ ১: এই ডেটা মডেল এবং সার্ভিসের জন্য একটি পিপ রিকোয়ারমেন্টস ফাইল তৈরি করুন।

নির্দেশ ২: সর্বশেষ সংস্করণ ব্যবহার করে এই ডেটা মডেল এবং সার্ভিসের জন্য একটি পিপ রিকোয়ারমেন্টস ফাইল তৈরি করুন।

69fae373bc5c6a18.png

নাম এবং ভার্সন সঠিক আছে কিনা তা যাচাই করুন। উদাহরণস্বরূপ, উপরের উত্তরে google-cloud-sql-connecter নাম এবং ভার্সন উভয়ই ভুল। ভার্সনগুলো ম্যানুয়ালি ঠিক করুন এবং requirements.txt ফাইলটি তৈরি করুন যা দেখতে এইরকম হবে:

cloud-sql-python-connector==1.2.4
sqlalchemy==1.4.36
pg8000==1.22.0

কমান্ড টার্মিনালে নিম্নলিখিতটি চালান:

pip3 install -r requirements.txt

ট্র্যাশ আইকনে ক্লিক করে ডুয়েট এআই চ্যাট হিস্ট্রি রিসেট করুন। f574ca2c1e114856.png Duet AI সাইডবারের শীর্ষে।

CloudSQL-এ প্যাকেজ টেবিল তৈরি করা

CloudSQL ডাটাবেস কানেক্টরের জন্য এনভায়রনমেন্ট ভেরিয়েবল সেট করুন।

export INSTANCE_NAME=$(gcloud sql instances list --format='value(name)')
export INSTANCE_CONNECTION_NAME=$(gcloud sql instances describe ${INSTANCE_NAME} --format="value(connectionName)")
export DB_USER=evolution
export DB_PASS=evolution
export DB_NAME=product_details

এখন data_model.py চালান।

python data_model.py

আউটপুটটি নিচের মতো (প্রকৃতপক্ষে কী প্রত্যাশিত তা দেখতে কোডটি দেখুন):

Tables created successfully.

CloudSQL ইনস্ট্যান্সে সংযোগ করুন এবং ডেটাবেসটি তৈরি হয়েছে কিনা তা পরীক্ষা করুন।

gcloud sql connect ${INSTANCE_NAME} --user=evolution --database=product_details

পাসওয়ার্ড (এবং ইভোলিউশন ) প্রবেশ করানোর পর টেবিলগুলো নিন।

product_details=> \dt

আউটপুটটি নিম্নলিখিতের অনুরূপ:

           List of relations
 Schema |   Name   | Type  |   Owner   
--------+----------+-------+-----------
 public | packages | table | evolution
(1 row)

আপনি ডেটা মডেল এবং টেবিলের বিবরণও যাচাই করতে পারেন।

product_details=> \d+ packages

আউটপুটটি নিম্নলিখিতের অনুরূপ:

                                                                        Table "public.packages"
            Column             |       Type        | Collation | Nullable |               Default                | Storage  | Compression | Stats target | Description 
-------------------------------+-------------------+-----------+----------+--------------------------------------+----------+-------------+--------------+-------------
 id                            | integer           |           | not null | nextval('packages_id_seq'::regclass) | plain    |             |              | 
 product_id                    | integer           |           | not null |                                      | plain    |             |              | 
 height                        | double precision  |           | not null |                                      | plain    |             |              | 
 width                         | double precision  |           | not null |                                      | plain    |             |              | 
 depth                         | double precision  |           | not null |                                      | plain    |             |              | 
 weight                        | double precision  |           | not null |                                      | plain    |             |              | 
 special_handling_instructions | character varying |           |          |                                      | extended |             |              | 
Indexes:
    "packages_pkey" PRIMARY KEY, btree (id)
Access method: heap

CloudSQL থেকে বের হতে \q টাইপ করুন।

db_init.py

এরপরে, packages টেবিলে কিছু নমুনা ডেটা যোগ করা যাক।

Duet AI চ্যাট হিস্ট্রি মুছে ফেলুন। data_model.py ফাইলটি খোলা রেখে, নিচের নির্দেশাবলী অনুসরণ করুন।

নির্দেশ ১: এমন একটি ফাংশন তৈরি করুন যা ১০টি নমুনা প্যাকেজ সারি তৈরি করে এবং সেগুলোকে প্যাকেজেস টেবিলে কমিট করে।

নির্দেশ ২: connect_connector থেকে প্রাপ্ত সেশন ব্যবহার করে এমন একটি ফাংশন তৈরি করুন যা ১০টি নমুনা প্যাকেজ সারি তৈরি করে এবং সেগুলোকে packages টেবিলে কমিট করে।

34a9afc5f04ba5.png

OPEN ব্যবহার করে a4c7ed6d845df343.png আগের মতোই একটি নতুন ফাইল ওয়ার্কফ্লোতে কোডটি চালান। কোডটি db_init.py নামের একটি ফাইলে সেভ করুন।

চূড়ান্ত ফাইলটি এই কোডল্যাবের পরিশিষ্ট (APPENDIX) অংশে রয়েছে। যদি সেখানে না থাকে, তবে ম্যানুয়ালি প্রয়োজনীয় পরিবর্তনগুলো করে নিন।

ডুয়েট এআই-এর বিভিন্ন প্রতিক্রিয়া দেখার জন্য আপনি নানা ধরনের নির্দেশও চেষ্টা করে দেখতে পারেন।

ট্র্যাশ আইকনে ক্লিক করে ডুয়েট এআই চ্যাট হিস্ট্রি রিসেট করুন। f574ca2c1e114856.png Duet AI সাইডবারের শীর্ষে।

নমুনা প্যাকেজ ডেটা তৈরি করা

কমান্ড লাইন থেকে db_init.py ফাইলটি চালান।

python db_init.py

আউটপুটটি নিম্নলিখিতের অনুরূপ:

Packages created successfully.

CloudSQL ইনস্ট্যান্সে পুনরায় সংযোগ করুন এবং যাচাই করুন যে নমুনা ডেটা প্যাকেজ টেবিলে যুক্ত হয়েছে।

CloudSQL ইনস্ট্যান্সে সংযোগ করুন এবং ডেটাবেসটি তৈরি হয়েছে কিনা তা পরীক্ষা করুন।

gcloud sql connect ${INSTANCE_NAME} --user=evolution --database=product_details

পাসওয়ার্ড (এবং ইভোলিউশন ) প্রবেশ করানোর পর, প্যাকেজ টেবিল থেকে সমস্ত ডেটা সংগ্রহ করুন।

product_details=> SELECT * FROM packages;

আউটপুটটি নিম্নলিখিতের অনুরূপ:

 id | product_id | height | width | depth | weight |   special_handling_instructions   
----+------------+--------+-------+-------+--------+-----------------------------------
  1 |          0 |     10 |    10 |    10 |     10 | No special handling instructions.
  2 |          1 |     10 |    10 |    10 |     10 | No special handling instructions.
  3 |          2 |     10 |    10 |    10 |     10 | No special handling instructions.
  4 |          3 |     10 |    10 |    10 |     10 | No special handling instructions.
  5 |          4 |     10 |    10 |    10 |     10 | No special handling instructions.
  6 |          5 |     10 |    10 |    10 |     10 | No special handling instructions.
  7 |          6 |     10 |    10 |    10 |     10 | No special handling instructions.
  8 |          7 |     10 |    10 |    10 |     10 | No special handling instructions.
  9 |          8 |     10 |    10 |    10 |     10 | No special handling instructions.
 10 |          9 |     10 |    10 |    10 |     10 | No special handling instructions.
(10 rows)

CloudSQL থেকে বের হতে \q টাইপ করুন।

main.py

data_model.py , package-service.yaml এবং connect_connector.py ফাইলগুলো খোলা রেখে, অ্যাপ্লিকেশনটির জন্য একটি main.py তৈরি করুন।

নির্দেশনা ১: পাইথন ফ্লাস্ক লাইব্রেরি ব্যবহার করে এমন একটি ইমপ্লিমেন্টেশন তৈরি করুন যা এই সার্ভিসের জন্য http রেস্ট এন্ডপয়েন্ট ব্যবহার করে।

নির্দেশনা ২: পাইথন ফ্লাস্ক লাইব্রেরি ব্যবহার করে এমন একটি ইমপ্লিমেন্টেশন তৈরি করুন যা এই সার্ভিসের জন্য http রেস্ট এন্ডপয়েন্ট ব্যবহার করে। প্যাকেজ ডেটার জন্য connect_conector.py থেকে SessionMaker ইম্পোর্ট ও ব্যবহার করুন।

প্রম্পট ৩: পাইথন ফ্লাস্ক লাইব্রেরি ব্যবহার করে এমন একটি ইমপ্লিমেন্টেশন তৈরি করুন যা এই সার্ভিসের জন্য http রেস্ট এন্ডপয়েন্ট ব্যবহার করে। প্যাকেজের ডেটার জন্য data_model.py থেকে Package এবং connect_conector.py থেকে SessionMaker ইম্পোর্ট ও ব্যবহার করুন।

প্রম্পট ৪: পাইথন ফ্লাস্ক লাইব্রেরি ব্যবহার করে এমন একটি ইমপ্লিমেন্টেশন তৈরি করুন যা এই সার্ভিসের জন্য http রেস্ট এন্ডপয়েন্ট ব্যবহার করে। প্যাকেজের ডেটার জন্য data_model.py থেকে প্যাকেজ এবং connect_conector.py থেকে SessionMaker ইম্পোর্ট ও ব্যবহার করুন। app.run-এর জন্য হোস্ট আইপি 0.0.0.0 ব্যবহার করুন।

6d794fc52a90e6ae.png

main.py এর জন্য প্রয়োজনীয়তাগুলো হালনাগাদ করুন।

নির্দেশ: main.py-এর জন্য রিকোয়ারমেন্টস ফাইল তৈরি করুন।

1cc0b318d2d4ca2f.png

এটি requirements.txt ফাইলে যুক্ত করুন। Flask ভার্সন 3.0.0 ব্যবহার করা নিশ্চিত করুন।

OPEN ব্যবহার করে a4c7ed6d845df343.png আগের মতোই নতুন ফাইল ওয়ার্কফ্লোতে কোডটি চালান। কোডটি main.py নামের একটি ফাইলে সেভ করুন।

চূড়ান্ত ফাইলটি এই কোডল্যাবের পরিশিষ্ট (APPENDIX) অংশে রয়েছে। যদি সেখানে না থাকে, তবে ম্যানুয়ালি প্রয়োজনীয় পরিবর্তনগুলো করে নিন।

ট্র্যাশ আইকনে ক্লিক করে ডুয়েট এআই চ্যাট হিস্ট্রি রিসেট করুন। f574ca2c1e114856.png Duet AI সাইডবারের শীর্ষে।

৫. অ্যাপ্লিকেশনটি পরীক্ষা করা এবং চালানো

প্রয়োজনীয়তাগুলো ইনস্টল করুন।

pip3 install -r requirements.txt

main.py চালান।

python main.py

আউটপুটটি নিম্নলিখিতের অনুরূপ:

 * Serving Flask app 'main'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://10.88.0.3:5000
Press CTRL+C to quit

দ্বিতীয় একটি টার্মিনাল থেকে /packages/<product_id> এন্ডপয়েন্টটি পরীক্ষা করুন।

curl localhost:5000/packages/1

আউটপুটটি নিম্নলিখিতের অনুরূপ:

{"depth":10.0,"height":10.0,"special_handling_instructions":"No special handling instructions.","weight":10.0,"width":10.0}

আপনি আপনার নমুনা ডেটাতে অন্য যেকোনো প্রোডাক্ট আইডি-ও পরীক্ষা করতে পারেন।

টার্মিনালে চলমান ডকার কন্টেইনার থেকে বের হতে CTRL_C চাপুন।

ইউনিট টেস্ট তৈরি করা

main.py ফাইলটি খুলে ইউনিট টেস্টগুলো তৈরি করুন।

নির্দেশ ১: ইউনিট টেস্ট তৈরি করুন।

e861e5b63e1b2657.png

OPEN ব্যবহার করে a4c7ed6d845df343.png আগের মতোই কোডটি একটি নতুন ফাইলে ওয়ার্কফ্লোতে চালান। কোডটি test.py নামের একটি ফাইলে সেভ করুন।

test_get_package ফাংশনে একটি product_id অবশ্যই নির্ধারণ করতে হবে। আপনি এটি ম্যানুয়ালি যোগ করতে পারেন।

চূড়ান্ত ফাইলটি এই কোডল্যাবের পরিশিষ্ট (APPENDIX) অংশে রয়েছে। যদি সেখানে না থাকে, তবে ম্যানুয়ালি প্রয়োজনীয় পরিবর্তনগুলো করে নিন।

ট্র্যাশ আইকনে ক্লিক করে ডুয়েট এআই চ্যাট হিস্ট্রি রিসেট করুন। f574ca2c1e114856.png Duet AI সাইডবারের শীর্ষে।

ইউনিট পরীক্ষা চালানো হচ্ছে

ইউনিট টেস্টটি চালান।

python test.py

আউটপুটটি নিম্নলিখিতের অনুরূপ:

.
----------------------------------------------------------------------
Ran 1 test in 1.061s

OK

ক্লাউড শেল এডিটর-এর সমস্ত ফাইল বন্ধ করুন এবং ট্র্যাশ আইকনে ক্লিক করে চ্যাট হিস্ট্রি মুছে ফেলুন। 1ecccfe10d6c540.png উপরের স্ট্যাটাস বারে।

ডকারফাইল

এই অ্যাপ্লিকেশনটির জন্য একটি Dockerfile তৈরি করুন।

main.py খুলুন এবং নিচের নির্দেশাবলী অনুসরণ করুন।

নির্দেশ ১: এই অ্যাপ্লিকেশনটির জন্য একটি ডকারফাইল তৈরি করুন।

নির্দেশ ২: এই অ্যাপ্লিকেশনটির জন্য একটি ডকারফাইল তৈরি করুন। সমস্ত ফাইল কন্টেইনারে কপি করুন।

9c473caea437a5c3.png

আপনাকে INSTANCE_CONNECTION_NAME , DB_USER , DB_PASS এবং DB_NAME এর জন্য ENVARS ও সেট করতে হবে। আপনি এটি ম্যানুয়ালি করতে পারেন। আপনার Dockerfile-টি নিচের মতো দেখতে হবে:

FROM python:3.10-slim

WORKDIR /app

COPY . ./

RUN pip install -r requirements.txt

# Add these manually for your project
ENV INSTANCE_CONNECTION_NAME=YOUR_INSTANCE_CONNECTION_NAME
ENV DB_USER=evolution
ENV DB_PASS=evolution
ENV DB_NAME=product_details

CMD ["python", "main.py"]

OPEN ব্যবহার করে a4c7ed6d845df343.png আগের মতোই একটি নতুন ফাইল ওয়ার্কফ্লোতে কোডটি চালান। কোডটি Dockerfile নামের একটি ফাইলে সেভ করুন।

চূড়ান্ত ফাইলটি এই কোডল্যাবের পরিশিষ্ট (APPENDIX) অংশে রয়েছে। যদি সেখানে না থাকে, তবে ম্যানুয়ালি প্রয়োজনীয় পরিবর্তনগুলো করে নিন।

স্থানীয়ভাবে অ্যাপ্লিকেশনটি চালানো হচ্ছে

Dockerfile টি খোলা রেখে, নিম্নলিখিত প্রম্পটটি চেষ্টা করুন।

প্রশ্ন ১: এই ডকারফাইলটি ব্যবহার করে আমি কীভাবে স্থানীয়ভাবে একটি কন্টেইনার চালাব?

570fd5c296ca8c83.png

নির্দেশনাগুলো অনুসরণ করুন।

# Build
docker build -t shipping .
# And run
docker run -p 5000:5000 -it shipping

আউটপুটটি নিম্নলিখিতের অনুরূপ:

 * Serving Flask app 'main'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://172.17.0.2:5000
Press CTRL+C to quit

দ্বিতীয় একটি টার্মিনাল উইন্ডো থেকে কন্টেইনারটি অ্যাক্সেস করুন।

curl localhost:5000/packages/1

আউটপুটটি নিম্নলিখিতের অনুরূপ:

{"depth":10.0,"height":10.0,"special_handling_instructions":"No special handling instructions.","weight":10.0,"width":10.0}

কন্টেইনারাইজড অ্যাপ্লিকেশনটি কাজ করছে।

টার্মিনালে চলমান ডকার কন্টেইনার থেকে বের হতে CTRL_C চাপুন।

আর্টিফ্যাক্ট রেজিস্ট্রিতে কন্টেইনার ইমেজ তৈরি করা হচ্ছে

কন্টেইনার ইমেজটি তৈরি করুন এবং আর্টিফ্যাক্ট রেজিস্ট্রি-তে পুশ করুন।

cd ~/shipping
gcloud auth configure-docker us-central1-docker.pkg.dev
docker build -t us-central1-docker.pkg.dev/${PROJECT_ID}/shipping/shipping .
docker push us-central1-docker.pkg.dev/${PROJECT_ID}/shipping/shipping

অ্যাপ্লিকেশন কন্টেইনারটি এখন us-central1-docker.pkg.dev/${PROJECT_ID}/shipping/shipping এ অবস্থিত, যা GKE-তে ডেপ্লয় করা যাবে।

৬. GKE ক্লাস্টারে অ্যাপ্লিকেশন স্থাপন করা

এই ওয়ার্কশপের জন্য GCP রিসোর্সগুলো বিল্ড করার সময় একটি GKE অটোপাইলট ক্লাস্টার তৈরি করা হয়েছিল। GKE ক্লাস্টারটির সাথে সংযোগ করুন।

gcloud container clusters get-credentials gke1 \
    --region=us-central1

Kubernetes-এর ডিফল্ট সার্ভিস অ্যাকাউন্টটিকে Google সার্ভিস অ্যাকাউন্ট দিয়ে টীকাযুক্ত করুন।

kubectl annotate serviceaccount default iam.gke.io/gcp-service-account=cloudsqlsa@${PROJECT_ID}.iam.gserviceaccount.com

আউটপুটটি নিম্নলিখিতের অনুরূপ:

serviceaccount/default annotated

k8s.yaml ফাইলটি প্রস্তুত ও প্রয়োগ করুন।

cp ~/duetaidev/k8s.yaml_tmpl ~/shipping/.
export INSTANCE_NAME=$(gcloud sql instances list --format='value(name)')
export INSTANCE_CONNECTION_NAME=$(gcloud sql instances describe ${INSTANCE_NAME} --format="value(connectionName)")
export IMAGE_REPO=us-central1-docker.pkg.dev/${PROJECT_ID}/shipping/shipping
envsubst < ~/shipping/k8s.yaml_tmpl > k8s.yaml
kubectl apply -f k8s.yaml

আউটপুটটি নিম্নলিখিতের অনুরূপ:

deployment.apps/shipping created
service/shipping created

পডগুলো চালু হওয়া এবং সার্ভিসটিতে একটি এক্সটার্নাল লোড ব্যালেন্সার আইপি অ্যাড্রেস বরাদ্দ হওয়া পর্যন্ত অপেক্ষা করুন।

kubectl get pods
kubectl get service shipping

আউটপুটটি নিম্নলিখিতের অনুরূপ:

# kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
shipping-f5d6f8d5-56cvk   1/1     Running   0          4m47s
shipping-f5d6f8d5-cj4vv   1/1     Running   0          4m48s
shipping-f5d6f8d5-rrdj2   1/1     Running   0          4m47s

# kubectl get service shipping
NAME       TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)        AGE
shipping   LoadBalancer   34.118.225.125   34.16.39.182   80:30076/TCP   5m41s

GKE অটোপাইলট ক্লাস্টারের ক্ষেত্রে, রিসোর্সগুলো প্রস্তুত হওয়া পর্যন্ত কিছুক্ষণ অপেক্ষা করুন।

EXTERNAL-IP অ্যাড্রেসের মাধ্যমে পরিষেবাটি অ্যাক্সেস করুন।

export EXTERNAL_IP=$(kubectl get svc shipping --output jsonpath='{.status.loadBalancer.ingress[0].ip}')
curl http://${EXTERNAL_IP}/packages/1

আউটপুটটি নিম্নলিখিতের অনুরূপ:

{"depth":10.0,"height":10.0,"special_handling_instructions":"No special handling instructions.","weight":10.0,"width":10.0}

৭. অতিরিক্ত ক্রেডিট: অ্যাপ্লিকেশনটির সমস্যা সমাধান

cloudsqlsa সার্ভিস অ্যাকাউন্ট থেকে `CloudSQL Client IAM` রোলটি সরিয়ে দিন। এর ফলে `CloudSQL` ডেটাবেসে সংযোগ করতে ত্রুটি দেখা দেয়।

gcloud projects remove-iam-policy-binding ${PROJECT_ID} \
    --member="serviceAccount:cloudsqlsa@${PROJECT_ID}.iam.gserviceaccount.com" \
    --role="roles/cloudsql.client"

শিপিং পডটি পুনরায় চালু করুন।

kubectl rollout restart deployment shipping

পডটি পুনরায় চালু হওয়ার পর, shipping পরিষেবাটি আবার অ্যাক্সেস করার চেষ্টা করুন।

export EXTERNAL_IP=$(kubectl get svc shipping --output jsonpath='{.status.loadBalancer.ingress[0].ip}')
curl http://${EXTERNAL_IP}/packages/1 

আউটপুটটি নিম্নলিখিতের অনুরূপ:

...
<title>500 Internal Server Error</title>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.</p>

Kubernetes Engine > Workloads- এ গিয়ে লগগুলি পরীক্ষা করুন।

d225b1916c829167.png

shipping ডিপ্লয়মেন্টে ক্লিক করুন এবং তারপর লগস ট্যাবে যান।

1d0459141483d6a7.png

লগ এক্সপ্লোরারে ভিউ -তে ক্লিক করুন df8b9d19a9fe4c73.png স্ট্যাটাস বারের ডান পাশের আইকনটি একটি নতুন লগ এক্সপ্লোরার উইন্ডো খোলে।

e86d1c265e176bc4.png

Traceback ত্রুটির এন্ট্রিগুলোর মধ্যে একটিতে ক্লিক করুন, এবং তারপরে 'এই লগ এন্ট্রিটি ব্যাখ্যা করুন'- এ ক্লিক করুন।

d6af045cf03008bc.png

আপনি ত্রুটিটির ব্যাখ্যা পড়তে পারেন।

এরপর, ত্রুটিটি সমাধান করতে ডুয়েট এআই-এর সাহায্য নেওয়া যাক।

নিম্নলিখিত নির্দেশটি চেষ্টা করুন।

নির্দেশ ১: এই ত্রুটিটি সমাধান করতে আমাকে সাহায্য করুন।

9288dd6045369167.png

প্রম্পটে ত্রুটির বার্তাটি লিখুন।

প্রম্পট ২: নিষিদ্ধ: প্রমাণীকৃত IAM প্রিন্সিপালটি API অনুরোধ করার জন্য অনুমোদিত বলে মনে হচ্ছে না। যাচাই করুন যে আপনার GCP প্রোজেক্টের মধ্যে 'Cloud SQL Admin API' সক্রিয় করা আছে এবং IAM প্রিন্সিপালকে 'Cloud SQL Client' রোলটি প্রদান করা হয়েছে।

f1e64fbdc435d31c.png

এবং তারপর।

প্রশ্ন ৩: gcloud ব্যবহার করে একটি গুগল সার্ভিস অ্যাকাউন্টে কীভাবে ক্লাউড এসকিউএল ক্লায়েন্ট রোলটি অ্যাসাইন করব?

bb8926b995a8875c.png

cloudsqlsa কে Cloud SQL Client রোলটি বরাদ্দ করুন।

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member="serviceAccount:cloudsqlsa@${PROJECT_ID}.iam.gserviceaccount.com" \
    --role="roles/cloudsql.client"

কিছুক্ষণ অপেক্ষা করুন এবং অ্যাপ্লিকেশনটি পুনরায় অ্যাক্সেস করার চেষ্টা করুন।

export EXTERNAL_IP=$(kubectl get svc shipping --output jsonpath='{.status.loadBalancer.ingress[0].ip}')
curl http://${EXTERNAL_IP}/packages/1

আউটপুটটি নিম্নলিখিতের অনুরূপ:

{"depth":10.0,"height":10.0,"special_handling_instructions":"No special handling instructions.","weight":10.0,"width":10.0}

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

৮. উপসংহার

অভিনন্দন! আপনি এই কোডল্যাবটি সফলভাবে সম্পন্ন করেছেন।

এই কোডল্যাবে, আপনি নিম্নলিখিত বিষয়গুলো শিখেছেন:

  1. আপনার GCP প্রোজেক্টে Duet AI সক্রিয় করুন এবং IDE ও ক্লাউড কনসোলে ব্যবহারের জন্য এটি কনফিগার করুন।
  2. কোড তৈরি, সম্পূর্ণকরণ এবং ব্যাখ্যার জন্য ডুয়েট এআই ব্যবহার করুন।
  3. অ্যাপ্লিকেশনের কোনো সমস্যা ব্যাখ্যা করতে ও তার সমাধান করতে Duet AI ব্যবহার করুন।
  4. ডুয়েট এআই-এর ফিচারগুলোর মধ্যে রয়েছে আইডিই চ্যাট ও মাল্টি-টার্ন চ্যাট, চ্যাট বনাম ইনলাইন কোড জেনারেশন, কোড ব্যাখ্যা ও আবৃত্তি স্বীকৃতির মতো স্মার্ট অ্যাকশন এবং আরও অনেক কিছু।

৯. পরিশিষ্ট

প্যাকেজ-পরিষেবা.yaml

swagger: "2.0"
info:
 title: Shipping and Package Information API
 description: This API provides information about shipping and packages.
 version: 1.0.0
host: shipping.googleapis.com
schemes:
 - https
produces:
 - application/json
paths:
 /packages/{product_id}:
   get:
     summary: Get information about a package
     description: This method returns information about a package, including its height, width, depth, weight, and any special handling instructions.
     parameters:
       - name: product_id
         in: path
         required: true
         type: integer
         format: int64
     responses:
       "200":
         description: A successful response
         schema:
           type: object
           properties:
             height:
               type: integer
               format: int64
             width:
               type: integer
               format: int64
             depth:
               type: integer
               format: int64
             weight:
               type: integer
               format: int64
             special_handling_instructions:
               type: string
       "404":
         description: The product_id was not found

data_model.py

from sqlalchemy import Column, Integer, String, Float
from sqlalchemy.ext.declarative import declarative_base

from connect_connector import engine

Base = declarative_base()

class Package(Base):
    __tablename__ = 'packages'

    id = Column(Integer, primary_key=True)
    product_id = Column(Integer, nullable=False)
    height = Column(Float, nullable=False)
    width = Column(Float, nullable=False)
    depth = Column(Float, nullable=False)
    weight = Column(Float, nullable=False)
    special_handling_instructions = Column(String, nullable=True)

def create_tables():
    Base.metadata.create_all(engine)

if __name__ == '__main__':
    create_tables()

    print('Tables created successfully.')

connect_Connector.py

import os

from google.cloud.sql.connector import Connector, IPTypes
import sqlalchemy

# You may need to manually import pg8000 and Base as follows
import pg8000
from sqlalchemy.ext.declarative import declarative_base


def connect_with_connector() -> sqlalchemy.engine.base.Engine:
   """Initializes a connection pool for a Cloud SQL instance of Postgres."""
   # Note: Saving credentials in environment variables is convenient, but not
   # secure - consider a more secure solution such as
   # Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
   # keep secrets safe.
   instance_connection_name = os.environ[
       "INSTANCE_CONNECTION_NAME"
   ]  # e.g. 'project:region:instance'
   db_user = os.environ["DB_USER"]  # e.g. 'my-database-user'
   db_pass = os.environ["DB_PASS"]  # e.g. 'my-database-password'
   db_name = os.environ["DB_NAME"]  # e.g. 'my-database'

   ip_type = IPTypes.PRIVATE if os.environ.get("PRIVATE_IP") else IPTypes.PUBLIC

   connector = Connector()

   def getconn() -> sqlalchemy.engine.base.Engine:
       conn: sqlalchemy.engine.base.Engine = connector.connect(
           instance_connection_name,
           "pg8000",
           user=db_user,
           password=db_pass,
           db=db_name,
           ip_type=ip_type,
       )
       return conn

   pool = sqlalchemy.create_engine(
       "postgresql+pg8000://",
       creator=getconn,
       # ...
   )
   return pool

# Create a connection pool
engine = connect_with_connector()

# Create a sessionmaker class to create new sessions
SessionMaker = sqlalchemy.orm.sessionmaker(bind=engine)

# Create a Base class for ORM
# You may need to manually fix the following
Base = declarative_base()

db_init.py

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from connect_connector import engine

from data_model import Package

def create_packages():
    # Create a session
    session = sessionmaker(bind=engine)()

    # Create 10 sample packages
    for i in range(10):
        package = Package(
            product_id=i,
            height=10.0,
            width=10.0,
            depth=10.0,
            weight=10.0,
            special_handling_instructions="No special handling instructions."
        )

        # Add the package to the session
        session.add(package)

    # Commit the changes
    session.commit()

if __name__ == '__main__':
    create_packages()

    print('Packages created successfully.')

main.py

from flask import Flask, request, jsonify

from data_model import Package
from connect_connector import SessionMaker

app = Flask(__name__)

session_maker = SessionMaker()

@app.route("/packages/<int:product_id>", methods=["GET"])
def get_package(product_id):
  """Get information about a package."""

  session = session_maker

  package = session.query(Package).filter(Package.product_id == product_id).first()

  if package is None:
    return jsonify({"message": "Package not found."}), 404

  return jsonify(
      {
          "height": package.height,
          "width": package.width,
          "depth": package.depth,
          "weight": package.weight,
          "special_handling_instructions": package.special_handling_instructions,
      }
  ), 200

if __name__ == "__main__":
  app.run(host="0.0.0.0")

test.py

import unittest

from data_model import Package
from connect_connector import SessionMaker

from main import app

class TestPackage(unittest.TestCase):

    def setUp(self):
        self.session_maker = SessionMaker()

    def tearDown(self):
        self.session_maker.close()

    def test_get_package(self):
        """Test the `get_package()` function."""

        package = Package(
        product_id=11, # Ensure that the product_id different from the sample data
        height=10,
        width=10,
        depth=10,
        weight=10,
        special_handling_instructions="Fragile",
        )

        session = self.session_maker

        session.add(package)
        session.commit()

        response = app.test_client().get("/packages/11")

        self.assertEqual(response.status_code, 200)

        self.assertEqual(
            response.json,
            {
                "height": 10,
                "width": 10,
                "depth": 10,
                "weight": 10,
                "special_handling_instructions": "Fragile",
            },
        )

if __name__ == "__main__":
    unittest.main()

requirements.txt

cloud-sql-python-connector==1.2.4
sqlalchemy==1.4.36
pg8000==1.22.0
Flask==3.0.0
gunicorn==20.1.0
psycopg2-binary==2.9.3

ডকারফাইল

FROM python:3.10-slim

WORKDIR /app

COPY . ./

RUN pip install -r requirements.txt

# Add these manually for your project
ENV INSTANCE_CONNECTION_NAME=YOUR_INSTANCE_CONNECTION_NAME
ENV DB_USER=evolution
ENV DB_PASS=evolution
ENV DB_NAME=product_details

CMD ["python", "main.py"]