পাইথনের সাথে সিক্রেট ম্যানেজার ব্যবহার করা

1. ওভারভিউ

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

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

সিক্রেট ম্যানেজার কনফিগারেশন তথ্য যেমন ডাটাবেস পাসওয়ার্ড, API কী, বা রানটাইমে একটি অ্যাপ্লিকেশনের জন্য প্রয়োজনীয় TLS শংসাপত্র সংরক্ষণের জন্য ভাল কাজ করে।

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

  • ক্লাউড শেল কিভাবে ব্যবহার করবেন
  • পাইথনের জন্য সিক্রেট ম্যানেজার ক্লায়েন্ট লাইব্রেরি কীভাবে ইনস্টল করবেন
  • পাইথন ক্লায়েন্ট লাইব্রেরি ব্যবহার করে কীভাবে গোপনীয়তা তৈরি এবং অ্যাক্সেস করবেন
  • পাইথন ক্লায়েন্ট লাইব্রেরি ব্যবহার করে ক্লাউড ফাংশনে গোপনীয়তাগুলি কীভাবে অ্যাক্সেস করবেন

আপনি কি প্রয়োজন হবে

  • একটি Google ক্লাউড প্রকল্প
  • একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স
  • পাইথন 3 ব্যবহার করে পরিচিতি

সমীক্ষা

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

শুধুমাত্র মাধ্যমে এটি পড়ুন এটি পড়ুন এবং ব্যায়াম সম্পূর্ণ করুন

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

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

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

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

2. সেটআপ এবং প্রয়োজনীয়তা

স্ব-গতিসম্পন্ন পরিবেশ সেটআপ

  1. Google ক্লাউড কনসোলে সাইন-ইন করুন এবং একটি নতুন প্রকল্প তৈরি করুন বা বিদ্যমান একটি পুনরায় ব্যবহার করুন৷ আপনার যদি ইতিমধ্যেই একটি Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তাহলে আপনাকে অবশ্যই একটি তৈরি করতে হবে।

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • প্রকল্পের নাম এই প্রকল্পের অংশগ্রহণকারীদের জন্য প্রদর্শনের নাম। এটি একটি অক্ষর স্ট্রিং যা Google API দ্বারা ব্যবহৃত হয় না। আপনি যে কোনো সময় এটি আপডেট করতে পারেন.
  • সমস্ত Google ক্লাউড প্রজেক্ট জুড়ে প্রোজেক্ট আইডি অবশ্যই অনন্য হতে হবে এবং অপরিবর্তনীয় (সেট করার পরে পরিবর্তন করা যাবে না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত আপনি এটা কি যত্ন না. বেশিরভাগ কোডল্যাবে, আপনাকে প্রজেক্ট আইডি উল্লেখ করতে হবে (এটি সাধারণত PROJECT_ID হিসাবে চিহ্নিত করা হয়)। আপনি যদি জেনারেট করা আইডি পছন্দ না করেন, তাহলে আপনি অন্য এলোমেলো আইডি তৈরি করতে পারেন। বিকল্পভাবে, আপনি নিজের চেষ্টা করে দেখতে পারেন এবং এটি উপলব্ধ কিনা। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রকল্পের সময়কালের জন্য থাকবে।
  • আপনার তথ্যের জন্য, একটি তৃতীয় মান রয়েছে, একটি প্রকল্প নম্বর যা কিছু API ব্যবহার করে। ডকুমেন্টেশনে এই তিনটি মান সম্পর্কে আরও জানুন।
  1. এরপরে, ক্লাউড রিসোর্স/এপিআই ব্যবহার করতে আপনাকে ক্লাউড কনসোলে বিলিং সক্ষম করতে হবে। এই কোডল্যাবের মাধ্যমে চালানোর জন্য খুব বেশি খরচ করা উচিত নয়, যদি কিছু থাকে। রিসোর্স বন্ধ করতে যাতে এই টিউটোরিয়ালের বাইরে আপনার বিলিং খরচ না হয়, আপনি আপনার তৈরি করা রিসোর্স মুছে ফেলতে পারেন বা পুরো প্রোজেক্ট মুছে ফেলতে পারেন। Google ক্লাউডের নতুন ব্যবহারকারীরা $300 USD বিনামূল্যের ট্রায়াল প্রোগ্রামের জন্য যোগ্য৷

ক্লাউড শেল শুরু করুন

যদিও Google ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালিত হতে পারে, এই কোডল্যাবে আপনি Google ক্লাউড শেল ব্যবহার করবেন, একটি কমান্ড লাইন পরিবেশ যা ক্লাউডে চলছে।

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

  1. ক্লাউড কনসোল থেকে, ক্লাউড শেল সক্রিয় করুন ক্লিক করুন 853e55310c205094.png .

55efc1aaa7a4d3ad.png

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

9c92662c6a846a5c.png

ক্লাউড শেলের সাথে সংযোগ করতে এবং সংযোগ করতে এটির মাত্র কয়েক মুহূর্ত লাগবে৷

9f0e51b578fecce5.png

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

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

  1. আপনি প্রমাণীকৃত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud auth list

কমান্ড আউটপুট

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud কমান্ড আপনার প্রকল্প সম্পর্কে জানে তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud config list project

কমান্ড আউটপুট

[core]
project = <PROJECT_ID>

যদি এটি না হয়, আপনি এই কমান্ড দিয়ে এটি সেট করতে পারেন:

gcloud config set project <PROJECT_ID>

কমান্ড আউটপুট

Updated property [core/project].

3. সিক্রেট ম্যানেজার API সক্ষম করুন৷

আপনি সিক্রেট ম্যানেজার API ব্যবহার শুরু করার আগে, আপনাকে অবশ্যই API সক্ষম করতে হবে। ক্লাউড শেল ব্যবহার করে, আপনি নিম্নলিখিত কমান্ড দিয়ে API সক্ষম করতে পারেন:

gcloud services enable secretmanager.googleapis.com

আপনি এই মত আউটপুট দেখতে হবে:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

4. পাইথনের জন্য সিক্রেট ম্যানেজার ক্লায়েন্ট লাইব্রেরি ইনস্টল করা

সিক্রেট ম্যানেজার ক্লায়েন্ট লাইব্রেরি ইনস্টল করুন:

pip3 install --user google-cloud-secret-manager==2.10.0

5. ইন্টারেক্টিভ পাইথন শুরু করুন

এই টিউটোরিয়ালের অংশের জন্য, আপনি IPython নামে একটি ইন্টারেক্টিভ পাইথন ইন্টারপ্রেটার ব্যবহার করবেন, যা ক্লাউড শেল-এ পূর্বেই ইনস্টল করা আছে। ক্লাউড শেলে ipython চালিয়ে একটি সেশন শুরু করুন:

ipython

আপনি এই মত কিছু দেখতে হবে:

Python 3.9.2 (default, Feb 28 2021, 17:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.3.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

6. গোপনীয়তা তৈরি করা

একটি গোপনে এক বা একাধিক গোপন সংস্করণ থাকে। এগুলি gcloud কমান্ড-লাইন ব্যবহার করে তৈরি করা যেতে পারে, তবে সেগুলি পাইথন ব্যবহার করেও তৈরি করা যেতে পারে।

একটি গোপন ব্যবহার করার জন্য, আপনাকে প্রথমে গোপনটির নামের সাথে গোপনীয়তা তৈরি করতে হবে, তারপরে আপনি গোপনের একটি সংস্করণ যোগ করুন, গোপনের মান হচ্ছে।

IPython এর মধ্যে আপনার প্রকল্প আইডি সেট করুন:

PROJECT_ID = "<PROJECT_ID>"

একটি গোপন তৈরি করুন

আপনার IPython অধিবেশনে নিম্নলিখিত কোড অনুলিপি করুন:

from google.cloud import secretmanager

def create_secret(secret_id):
    # Create the Secret Manager client.
    client = secretmanager.SecretManagerServiceClient()

    # Build the resource name of the parent project.
    parent = f"projects/{PROJECT_ID}"

    # Build a dict of settings for the secret
    secret = {'replication': {'automatic': {}}}

    # Create the secret
    response = client.create_secret(secret_id=secret_id, parent=parent, secret=secret)

    # Print the new secret name.
    print(f'Created secret: {response.name}')   

my_secret_value নামে একটি নতুন সিক্রেট তৈরি করতে ফাংশনটিকে কল করুন :

create_secret("my_secret_value")

আপনি নিম্নলিখিত আউটপুট দেখতে হবে:

Created secret: projects/<PROJECT_NUM>/secrets/my_secret_value

একটি গোপন সংস্করণ যোগ করুন

এখন যেহেতু গোপনটি বিদ্যমান, আপনি একটি সংস্করণ তৈরি করে এটিকে একটি মান নির্ধারণ করতে পারেন।

আপনার IPython অধিবেশনে নিম্নলিখিত কোড অনুলিপি করুন:

def add_secret_version(secret_id, payload):
    # Create the Secret Manager client.
    client = secretmanager.SecretManagerServiceClient()

    # Build the resource name of the parent secret.
    parent = f"projects/{PROJECT_ID}/secrets/{secret_id}"

    # Convert the string payload into a bytes. This step can be omitted if you
    # pass in bytes instead of a str for the payload argument.
    payload = payload.encode('UTF-8')

    # Add the secret version.
    response = client.add_secret_version(parent=parent, payload={'data': payload})

    # Print the new secret version name.
    print(f'Added secret version: {response.name}')   

একটি নতুন গোপন সংস্করণ যোগ করতে ফাংশনটি কল করুন:

add_secret_version("my_secret_value", "Hello Secret Manager")

আপনি নিম্নলিখিত আউটপুট দেখতে হবে:

Added secret version: projects/<PROJECT_NUM>/secrets/my_secret_value/versions/1

সিক্রেটের একাধিক সংস্করণ থাকতে পারে। একটি ভিন্ন মান দিয়ে ফাংশনটিকে আবার কল করুন:

add_secret_version("my_secret_value", "Hello Again, Secret Manager")

আপনি নিম্নলিখিত আউটপুট দেখতে হবে:

Added secret version: projects/<PROJECT_NUM>/secrets/my_secret_value/versions/2

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

7. গোপনীয়তা অ্যাক্সেস করা

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

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

আপনি আমাদের গোপনীয়তার উপর ক্রিয়াকলাপ সম্পাদন করতে যাচ্ছেন, এটি সরাসরি মুদ্রণ না করেই এর মান মূল্যায়ন করছেন। পরিবর্তে আপনি গোপন মূল্যের একটি হ্যাশ প্রিন্ট আউট করবেন.

আপনার IPython অধিবেশনে নিম্নলিখিত কোড অনুলিপি করুন:

def access_secret_version(secret_id, version_id="latest"):
    # Create the Secret Manager client.
    client = secretmanager.SecretManagerServiceClient()

    # Build the resource name of the secret version.
    name = f"projects/{PROJECT_ID}/secrets/{secret_id}/versions/{version_id}"

    # Access the secret version.
    response = client.access_secret_version(name=name)

    # Return the decoded payload.
    return response.payload.data.decode('UTF-8')
    
import hashlib

def secret_hash(secret_value): 
  # return the sha224 hash of the secret value
  return hashlib.sha224(bytes(secret_value, "utf-8")).hexdigest()

এর মানের হ্যাশ হিসাবে গোপনটি পুনরুদ্ধার করতে ফাংশনটিকে কল করুন:

secret_hash(access_secret_version("my_secret_value"))

আপনি একটি হ্যাশের অনুরূপ আউটপুট দেখতে পাবেন (সঠিক মান এই আউটপুটের সাথে মেলে না):

83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11

যেহেতু আপনি একটি সংস্করণ নির্দিষ্ট করেননি, সর্বশেষ মান পুনরুদ্ধার করা হয়েছে৷

নিশ্চিত করতে প্রত্যাশিত সংস্করণ নম্বর যোগ করে ফাংশনটিতে কল করুন:

secret_hash(access_secret_version("my_secret_value", version_id=2))

আপনি শেষ কমান্ড হিসাবে একই আউটপুট দেখতে হবে:

83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11

ফাংশনটি আবার কল করুন, কিন্তু এইবার প্রথম সংস্করণ নির্দিষ্ট করে:

secret_hash(access_secret_version("my_secret_value", version_id=1))

আপনি এই সময় একটি ভিন্ন হ্যাশ দেখতে হবে, একটি ভিন্ন আউটপুট নির্দেশ করে:

9a3fc8b809ddc611c82aee950c636c7557e220893560ec2c1eeeb177

8. ক্লাউড ফাংশন সহ সিক্রেট ম্যানেজার ব্যবহার করা

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

আপনি ক্লাউড ফাংশনে পাইথন ব্যবহার করতে আগ্রহী হলে, আপনি পাইথন কোডল্যাবে HTTP Google ক্লাউড ফাংশন অনুসরণ করতে পারেন।

exit ফাংশন কল করে IPython বন্ধ করুন:

exit

আপনাকে আপনার ক্লাউড শেলে ফিরিয়ে দেওয়া উচিত:

yourname@cloudshell:~ (<PROJECT_ID>)$

আপনি ক্লাউড ফাংশন API ব্যবহার শুরু করার আগে, আপনাকে অবশ্যই API সক্ষম করতে হবে। ক্লাউড শেল ব্যবহার করে, আপনি নিম্নলিখিত কমান্ড দিয়ে API সক্ষম করতে পারেন:

gcloud services enable cloudfunctions.googleapis.com cloudbuild.googleapis.com

আমাদের ফাংশন তৈরি করতে একটি নতুন ফোল্ডার তৈরি করুন, এতে লিখতে খালি ফাইল তৈরি করুন:

mkdir secret-manager-api-demo
cd secret-manager-api-demo
touch main.py
touch requirements.txt

ক্লাউড শেলের উপরের ডান দিক থেকে কোড এডিটর খুলুন:

7651a97c51e11a24.png

secret-manager-api-demo ফোল্ডারের ভিতরে main.py ফাইলে নেভিগেট করুন। এই যেখানে আপনি আপনার সমস্ত কোড নির্বাণ করা হবে.

9. গোপনীয়তা অ্যাক্সেস করার জন্য একটি ক্লাউড ফাংশন লেখা

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

access_secret_version ফাংশনটি ব্যবহার করে আপনি আগে তৈরি করেছেন, আপনি এটিকে আপনার ক্লাউড ফাংশনের ভিত্তি হিসাবে ব্যবহার করতে পারেন।

নিম্নলিখিত কোডটি main.py ফাইলে অনুলিপি করুন:

main.py

import os

from google.cloud import secretmanager

project_id = os.environ["PROJECT_ID"]

client = secretmanager.SecretManagerServiceClient()
name = f"projects/{project_id}/secrets/my_secret_value/versions/latest"
response = client.access_secret_version(name=name)
my_secret_value = response.payload.data.decode("UTF-8")


def secret_hello(request):
    if "Again" in my_secret_value:
        return "We meet again!\n"

    return "Hello there.\n"

আপনি আপনার ফাংশন স্থাপন করার আগে, আপনাকে পরিবেশের সেটআপ চূড়ান্ত করতে হবে। এর জন্য আপনাকে আপনার ফাংশন নির্ভরতা সেট আপ করতে হবে।

requirements.txt নামে একটি নতুন ফাইল তৈরি করুন এবং এতে google-cloud-secret-manager প্যাকেজ যোগ করুন:

requirements.txt

google-cloud-secret-manager==2.10.0

আপনার এখন শুধু একটি main.py এবং একটি requirements.txt সম্বলিত একটি ফোল্ডার থাকা উচিত।

আপনার গোপন অ্যাক্সেসের অনুমতি দেওয়া

আপনি আপনার ফাংশন স্থাপন করার আগে, আপনাকে ক্লাউড ফাংশনগুলিকে আপনার গোপনীয়তা অ্যাক্সেস করার ক্ষমতা দিতে হবে৷

টার্মিনালে ফিরে যান:

c5b686edf94b5222.png

আপনার গোপনীয়তা অ্যাক্সেস করতে ক্লাউড ফাংশন পরিষেবা অ্যাকাউন্টে অ্যাক্সেস মঞ্জুর করুন:

export PROJECT_ID=$(gcloud config get-value core/project)

gcloud secrets add-iam-policy-binding my_secret_value \
    --role roles/secretmanager.secretAccessor \
    --member serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com

আপনি নিম্নলিখিত আউটপুট দেখতে হবে:

Updated IAM policy for secret [my_secret_value].
bindings:
- members:
  - serviceAccount:<PROJECT_ID>@appspot.gserviceaccount.com
  role: roles/secretmanager.secretAccessor
etag: BwWiRUt2oB4=
version: 1

10. আপনার ক্লাউড ফাংশন স্থাপন

পূর্ববর্তী বিভাগে আপনার সেটআপ দেওয়া, আপনি এখন আপনার ক্লাউড ফাংশন স্থাপন এবং পরীক্ষা করতে পারেন।

আপনার তৈরি করা দুটি ফাইল ধারণকারী ফোল্ডারের মধ্যে, ফাংশনটি স্থাপন করুন:

gcloud functions deploy secret_hello \
    --runtime python39 \
    --set-env-vars PROJECT_ID=${PROJECT_ID} \
    --trigger-http \
    --allow-unauthenticated

আপনি নিম্নলিখিত আউটপুট দেখতে হবে (কাটা):

Deploying function (may take a while - up to 2 minutes)...done.

...

entryPoint: secret_hello
httpsTrigger:
  url: https://<REGION>-<PROJECT_ID>.cloudfunctions.net/secret_hello
...
status: ACTIVE
...

নিম্নলিখিত কমান্ডের সাহায্যে আপনার ফাংশনের URL ( httpsTrigger.url মেটাডেটা) পুনরুদ্ধার করুন:

FUNCTION_URL=$(gcloud functions describe secret_hello --format 'value(httpsTrigger.url)')

এখন, আপনার ফাংশনটি কল করে প্রত্যাশিত রিটার্ন মান সহ ফাংশনটি অ্যাক্সেস করা যেতে পারে তা পরীক্ষা করুন:

curl $FUNCTION_URL

আপনি নিম্নলিখিত আউটপুট দেখতে হবে:

We meet again!

এই ফাংশনটি সিক্রেটের সাম্প্রতিকতম সংস্করণটি উল্লেখ করে, যা "আবার" স্ট্রিং ধারণ করার জন্য সেট করা হয়েছিল, তাই এই ফাংশনটি প্রত্যাশিত হিসাবে কাজ করছে৷

11. অভিনন্দন!

আপনি শিখেছেন কিভাবে পাইথন ব্যবহার করে সিক্রেট ম্যানেজার এপিআই ব্যবহার করতে হয়!

পরিষ্কার করুন

এই টিউটোরিয়ালে ব্যবহৃত সংস্থানগুলির জন্য আপনার Google ক্লাউড অ্যাকাউন্টে চার্জ এড়াতে:

  • ক্লাউড কনসোলে, সম্পদ পরিচালনা পৃষ্ঠাতে যান।
  • প্রকল্প তালিকায়, আপনার প্রকল্প নির্বাচন করুন তারপর মুছুন ক্লিক করুন।
  • ডায়ালগে, প্রকল্প আইডি টাইপ করুন এবং তারপরে প্রকল্পটি মুছে ফেলতে শাট ডাউন ক্লিক করুন।

আরও জানুন

লাইসেন্স

এই কাজটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন 2.0 জেনেরিক লাইসেন্সের অধীনে লাইসেন্সপ্রাপ্ত।