১. সিএফটি ১০১-এর পরিচিতি

সর্বশেষ হালনাগাদ: ২০২২-০২-১১
ক্লাউড ফাউন্ডেশন টুলকিট কী?
মূলত, গুগল ক্লাউড প্ল্যাটফর্মে দ্রুত কাজ শুরু করার জন্য সিএফটি সেরা অনুশীলন টেমপ্লেট সরবরাহ করে। এই টিউটোরিয়ালে, আপনি শিখবেন কীভাবে ক্লাউড ফাউন্ডেশন টুলকিটে অবদান রাখতে হয়।
তোমার যা লাগবে
- একটি গিটহাব অ্যাকাউন্ট।
- আপনার মেশিনে ডকার ইনস্টল করা আছে অথবা ক্লাউড শেল ব্যবহার করুন ( ম্যাক ইনস্টল , উইন্ডোজ ইনস্টল )
- কোড সম্পাদনার জন্য কোড এডিটর (উদাহরণ: ভিজ্যুয়াল স্টুডিও কোড )
- গিট এবং গিটহাব সম্পর্কে প্রাথমিক ধারণা
- টেরাফর্ম এবং ইনফ্রাস্ট্রাকচার অ্যাজ কোড নিয়ে কিছু অভিজ্ঞতা
- একটি সার্ভিস অ্যাকাউন্টে প্রজেক্ট ক্রিয়েটর রোল প্রদান করার অনুমতি
- একটি গুগল ক্লাউড অর্গানাইজেশন, একটি টেস্ট ফোল্ডার, এবং একটি বিলিং অ্যাকাউন্ট
আপনি যা তৈরি করবেন
এই কোডল্যাবে, আপনি শিখবেন কীভাবে ক্লাউড ফাউন্ডেশন টুলকিট (CFT)-এ অবদান রাখতে হয়।
আপনি করবেন:
- CFT-তে অবদান রাখার জন্য একটি ডেভ এনভায়রনমেন্ট সেটআপ করুন।
- একটি CFT মডিউলে একটি বৈশিষ্ট্য যোগ করুন
- নতুন ফিচারের জন্য টেস্ট যোগ করুন।
- CFT-তে ইন্টিগ্রেশন টেস্টগুলো সম্পাদন করুন
- লিন্ট টেস্টগুলি চালান
- গিটহাবে কোড কমিট করুন এবং একটি পুল রিকোয়েস্ট (PR) জমা দিন।
আপনি গুগল ক্লাউড স্টোরেজ সিএফটি মডিউলে একটি নতুন ফিচার যোগ করার মাধ্যমে উপরের সমস্ত ধাপগুলো সম্পন্ন করবেন। আপনি "silly_label" নামে একটি লেবেল যোগ করবেন, যা জিসিএস সিএফটি মডিউলের মাধ্যমে তৈরি করা সমস্ত বাকেটে স্বয়ংক্রিয়ভাবে যুক্ত হয়ে যাবে। আপনার ফিচারটি যাচাই করতে এবং এন্ড-টু-এন্ড ইন্টিগ্রেশন নিশ্চিত করতে আপনি টেস্ট লেখার সুযোগও পাবেন।
২. ডেভেলপমেন্ট এনভায়রনমেন্ট সেটআপ করুন
আপনি চাইলে আপনার ডেভেলপমেন্টের কাজে ক্লাউড শেল ব্যবহার করতে পারেন। যদি আপনি CFT-তে অবদান রাখার জন্য ক্লাউড শেল ব্যবহার করতে না চান, তবে আপনি আপনার নিজের মেশিনে ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ করে নিতে পারেন।
গিট সেট আপ করুন
গিটহাব গিট নামক একটি ওপেন সোর্স ভার্সন কন্ট্রোল সিস্টেম (VCS)-এর উপর ভিত্তি করে তৈরি। আপনার মেশিনে বা আপনার ক্লাউড শেলে স্থানীয়ভাবে গিটহাব-সম্পর্কিত যা কিছু ঘটে, তার সবকিছুর দায়িত্বে থাকে গিট।
- আপনি যখন ক্লাউড শেল ব্যবহার করেন, তখন গিট ইনস্টল করার প্রয়োজন হয় না, কারণ এটি আগে থেকেই ইনস্টল করা থাকে।
$ git --version
# This will display the git version on the Cloud Shell.
আপনি যদি আপনার মেশিনে ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ করেন, তাহলে আপনাকে Git ইনস্টল করতে হবে।
গিট-এ আপনার ইউজারনেম এবং ইমেল সেট করা
গিট কমিটগুলোকে একটি পরিচয়ের সাথে যুক্ত করতে ইউজারনেম ব্যবহার করে। গিট ইউজারনেম এবং আপনার গিটহাব ইউজারনেম এক নয়।
আপনি git config কমান্ড ব্যবহার করে আপনার গিট কমিটগুলোর সাথে যুক্ত নামটি পরিবর্তন করতে পারেন। git config ব্যবহার করে আপনার গিট কমিটগুলোর সাথে যুক্ত নামটি পরিবর্তন করলে তা শুধুমাত্র ভবিষ্যতের কমিটগুলোর উপর প্রভাব ফেলবে এবং অতীতের কমিটগুলোর জন্য ব্যবহৃত নামটি পরিবর্তন করবে না।
আপনি সফলভাবে গিট সেট আপ করেছেন এবং আপনার ব্রাঞ্চ ফর্ক, তৈরি ও ক্লোন করতে পারার কথা। এই কোডল্যাবে আমরা ব্যাপকভাবে গিট ব্যবহার করব।
৩. CFT-এর GCS রিপোজিটরি ফর্ক করুন
একটি CFT রিপোজিটরি ফর্ক করুন
আপনি আগের ধাপে আপনার লোকাল মেশিনে অথবা ক্লাউড শেলে গিট সেট আপ করেছেন। এখন কন্ট্রিবিউশন শুরু করার জন্য আপনাকে গুগল ক্লাউড স্টোরেজ সিএফটি রিপোটি ফর্ক করতে হবে।
ফর্ক হলো একটি রিপোজিটরির অনুলিপি। একটি রিপোজিটরি ফর্ক করার মাধ্যমে আপনি মূল প্রজেক্টকে প্রভাবিত না করেই এতে অবাধে বিভিন্ন পরিবর্তন নিয়ে পরীক্ষা-নিরীক্ষা করতে পারেন।
সাধারণত, অন্য কারো প্রকল্পে পরিবর্তনের প্রস্তাব দিতে অথবা নিজের ধারণার সূচনা বিন্দু হিসেবে অন্য কারো প্রকল্পকে ব্যবহার করতে ফর্ক ব্যবহার করা হয়।
উদাহরণস্বরূপ, কোনো বাগ সংশোধনের সাথে সম্পর্কিত পরিবর্তন প্রস্তাব করার জন্য আপনি ফর্ক ব্যবহার করতে পারেন। একটি বাগ সংশোধন করতে, আপনি যা করতে পারেন:
- রিপোজিটরিটি ফর্ক করুন।
- সমাধানটি করুন।
- প্রজেক্ট ওনারের কাছে একটি পুল রিকোয়েস্ট জমা দিন।
একটি CFT রিপো ফোর্ক করার ধাপসমূহ:
- আপনার ওয়েব ব্রাউজার খুলুন এবং terraform-google-modules/terraform-google-cloud-storage রিপোজিটরিতে যান। আমরা সম্পূর্ণ কোডল্যাবের জন্য এই রিপোটি ব্যবহার করব।
- পেজের উপরের ডান কোণায়, Fork-এ ক্লিক করুন।

- আপনাকে ফর্কটি কোথায় করতে চান তার একটি বিকল্প দেওয়া হবে, আপনার প্রোফাইল বেছে নিন এবং রিপোটি ফর্ক হয়ে যাবে।
আপনার ফর্কটি স্থানীয়ভাবে ক্লোন করুন
আপনার তৈরি করা ফর্কটি হলো GCS মডিউল রিপোজিটরির একটি অনুলিপি। আপনার নতুন ফিচারটি যোগ করার জন্য এখন আপনি এই রিপোজিটরিটি আপনার স্থানীয় পরিবেশে ক্লোন করবেন।
আপনার ফর্ক ক্লোন করার ধাপসমূহ:
- আপনার ওয়েব ব্রাউজার খুলুন এবং terraform-google-modules/terraform-google-cloud-storage- এ আপনার ফর্কটিতে যান।
- উপরের ডান কোণায় আপনি 'কোড' বাটনটি দেখতে পাবেন, সেটিতে ক্লিক করুন।

- 'কোড' বোতামে ক্লিক করার পর, ফর্কটির URL কপি করতে 'কপি' আইকনে ক্লিক করুন। আপনার লোকাল এনভায়রনমেন্টে ফর্কটি ক্লোন করতে আপনি এই URL-টি ব্যবহার করবেন।

- আপনার VSCode বা মেশিনের টার্মিনালে গিয়ে ফর্কটি ক্লোন করুন।
$ git clone <url>
# This command will clone your fork locally.
# Paste the copied URL from the previous step.
- এখন যেহেতু আপনি আপনার ফর্কটি স্থানীয়ভাবে ক্লোন করেছেন, আপনার রেপোতে গিয়ে ফর্কটির উপর ভিত্তি করে একটি নতুন ব্রাঞ্চ তৈরি করুন এবং সেই অস্থায়ী ব্রাঞ্চটিতে কোডে পরিবর্তন আনুন।
প্রচলিত রীতি অনুসারে, আপনি আপনার শাখার নাম নিম্নলিখিতভাবে রাখতে পারেন:
- ফিচার অনুরোধের জন্য:
feature/feature-name - অভ্যন্তরীণ আপডেটের জন্য,
internal/change-name - বাগ ফিক্সের জন্য:
bugfix/issue-name
যেহেতু আপনি একটি নতুন ফিচার যোগ করছেন, তাই আপনার টেম্পোরারি ব্রাঞ্চের feature/silly_label রাখতে পারেন।
$ cd terraform-google-cloud-storage
# This command takes you into the cloned directory on your local machine.
$ git branch
# This command tells your current branch
# When you run this for the first time after you have cloned, your
# output should say "master", that is your fork.
$ git checkout -b feature/silly_label
# This command creates a new branch on your fork and switches your
# branch to the newly created branch.
$ git branch
# This command will confirm your current branch to be "feature/silly_label"
আপনি এখন ক্লাউড ফাউন্ডেশন টুলকিটে কাজ শুরু করার জন্য সম্পূর্ণরূপে প্রস্তুত!
৪. একটি পরীক্ষার পরিবেশ তৈরি করুন
স্ট্যান্ডার্ড CFT ডেভেলপমেন্ট প্রক্রিয়াটি টেস্টিংয়ের জন্য একটি বিচ্ছিন্ন টেস্ট প্রজেক্ট ব্যবহারের উপর ভিত্তি করে তৈরি। এই ধাপে আপনাকে একটি সার্ভিস অ্যাকাউন্টের মাধ্যমে (একটি স্ট্যান্ডার্ড কনফিগারেশনের উপর ভিত্তি করে) টেস্ট প্রজেক্টটি তৈরি করার প্রক্রিয়াটি দেখানো হবে।
০. ডকার ইঞ্জিন ইনস্টল করুন
আপনি যদি আপনার মেশিনটি ডেভেলপমেন্টের কাজে ব্যবহার করেন, তাহলে আপনাকে ডকার ইঞ্জিন ইনস্টল করতে হবে।
১. গুগল ক্লাউড এসডিকে ইনস্টল করুন
আপনি যদি GCP Cloud Shell ব্যবহার করেন, তাহলে আপনার Google Cloud SDK ইনস্টল করার প্রয়োজন নেই।
Google Cloud SDK- তে যান এবং আপনার প্ল্যাটফর্মের জন্য ইন্টারেক্টিভ ইনস্টলারটি ডাউনলোড করুন।
২. কনফিগারেশন সেট করুন
একটি টেস্ট এনভায়রনমেন্ট তৈরি করার জন্য আপনার একটি গুগল ক্লাউড অর্গানাইজেশন, একটি টেস্ট ফোল্ডার এবং একটি বিলিং অ্যাকাউন্ট প্রয়োজন হবে। এই মানগুলি এনভায়রনমেন্ট ভেরিয়েবলের মাধ্যমে সেট করতে হবে:
export TF_VAR_org_id="your_org_id"
export TF_VAR_folder_id="your_folder_id"
export TF_VAR_billing_account="your_billing_account_id"
৩. আপনার পরিষেবা অ্যাকাউন্ট তৈরি করুন
টেস্ট এনভায়রনমেন্ট তৈরি করার আগে, আপনাকে আপনার টেস্ট এনভায়রনমেন্টে একটি সার্ভিস অ্যাকাউন্ট কী ডাউনলোড করতে হবে। এই সার্ভিস অ্যাকাউন্টের জন্য প্রজেক্ট ক্রিয়েটর, বিলিং অ্যাকাউন্ট ইউজার এবং অর্গানাইজেশন ভিউয়ার রোলগুলোর প্রয়োজন হবে। এই ধাপগুলো আপনাকে একটি নতুন সার্ভিস অ্যাকাউন্ট তৈরি করতে সাহায্য করে, তবে আপনি একটি বিদ্যমান অ্যাকাউন্টও পুনরায় ব্যবহার করতে পারেন।
৩.১ সিড জিসিপি প্রজেক্ট তৈরি বা নির্বাচন করুন
আপনার সার্ভিস অ্যাকাউন্ট তৈরি করার আগে, এটিকে হোস্ট করার জন্য আপনাকে একটি প্রজেক্ট নির্বাচন করতে হবে। আপনি একটি নতুন প্রজেক্টও তৈরি করতে পারেন।
gcloud config set core/project YOUR_PROJECT_ID
৩.২ গুগল ক্লাউড এপিআই সক্রিয় করুন
আপনার সিড প্রজেক্টে নিম্নলিখিত গুগল ক্লাউড এপিআইগুলো সক্রিয় করুন:
gcloud services enable cloudresourcemanager.googleapis.com
gcloud services enable iam.googleapis.com
gcloud services enable cloudbilling.googleapis.com
৩.৩ পরিষেবা অ্যাকাউন্ট তৈরি করুন
পরীক্ষার পরিবেশ পরিচালনা করার জন্য একটি নতুন পরিষেবা অ্যাকাউন্ট তৈরি করুন:
# Creating a service account for CFT.
gcloud iam service-accounts create cft-onboarding \
--description="CFT Onboarding Terraform Service Account" \
--display-name="CFT Onboarding"
# Assign SERVICE_ACCOUNT environment variable for later steps
export SERVICE_ACCOUNT=cft-onboarding@$(gcloud config get-value core/project).iam.gserviceaccount.com
আপনার পরিষেবা অ্যাকাউন্ট তৈরি হয়েছে কিনা যাচাই করুন:
gcloud iam service-accounts list --filter="EMAIL=${SERVICE_ACCOUNT}"
৩.৪ সার্ভিস অ্যাকাউন্টে প্রজেক্ট ক্রিয়েটর, বিলিং অ্যাকাউন্ট ইউজার এবং অর্গানাইজেশন ভিউয়ার রোলসমূহ প্রদান করুন:
gcloud resource-manager folders add-iam-policy-binding ${TF_VAR_folder_id} \
--member="serviceAccount:${SERVICE_ACCOUNT}" \
--role="roles/resourcemanager.projectCreator"
gcloud organizations add-iam-policy-binding ${TF_VAR_org_id} \
--member="serviceAccount:${SERVICE_ACCOUNT}" \
--role="roles/billing.user"
gcloud beta billing accounts add-iam-policy-binding ${TF_VAR_billing_account} \
--member="serviceAccount:${SERVICE_ACCOUNT}" \
--role="roles/billing.user"
gcloud organizations add-iam-policy-binding ${TF_VAR_org_id} \
--member="serviceAccount:${SERVICE_ACCOUNT}" \
--role="roles/resourcemanager.organizationViewer"
এখন আপনার একটি সার্ভিস অ্যাকাউন্ট আছে যা টেস্ট এনভায়রনমেন্ট পরিচালনার জন্য ব্যবহার করা যাবে।
৪. টেরাফর্ম ক্রেডেনশিয়াল প্রস্তুত করুন
টেস্ট এনভায়রনমেন্ট তৈরি করার জন্য, আপনাকে সার্ভিস অ্যাকাউন্ট কী-টি আপনার শেল-এ ডাউনলোড করতে হবে।
৪.১ পরিষেবা অ্যাকাউন্ট কী
টেরাফর্মের জন্য একটি সার্ভিস অ্যাকাউন্ট কী তৈরি এবং ডাউনলোড করুন
gcloud iam service-accounts keys create cft.json --iam-account=${SERVICE_ACCOUNT}
৪.২ টেরাফর্ম ক্রেডেনশিয়াল সেটআপ করুন
SERVICE_ACCOUNT_JSON এনভায়রনমেন্ট ভেরিয়েবলটি ব্যবহার করে Terraform-এ কী-টি সরবরাহ করুন এবং এর ভ্যালু হিসেবে আপনার সার্ভিস অ্যাকাউন্ট কী-এর বিষয়বস্তু সেট করুন।
export SERVICE_ACCOUNT_JSON=$(< cft.json)
এনভায়রনমেন্ট ভেরিয়েবলে ক্রেডেনশিয়াল তথ্য সংরক্ষণ করার পর, কীফাইলটি মুছে ফেলুন। পরবর্তীতে প্রয়োজন হলে উপরের একই কমান্ড ব্যবহার করে আপনি একটি কী পুনরায় তৈরি করতে পারবেন।
rm -rf cft.json
৫. টেরাফর্ম ডিপ্লয়মেন্টের জন্য টেস্ট প্রজেক্ট তৈরি করুন
এখন যেহেতু সবকিছু প্রস্তুত, আপনি একটিমাত্র কমান্ড দিয়েই টেস্ট প্রজেক্টটি তৈরি করতে পারবেন। terraform-google-cloud-storage ডিরেক্টরির রুট থেকে এই কমান্ডটি চালান:
make docker_test_prepare
make docker_test_prepare রান করলে আপনি নিচের আউটপুটটি দেখতে পাবেন। শেষে আপনি তৈরি হওয়া টেস্ট প্রজেক্ট আইডিটি পাবেন, যেখানে আপনি আপনার নতুন ফিচারসহ ক্লাউড স্টোরেজ মডিউলটি ডেপ্লয় ও টেস্ট করবেন। বিলিং অ্যাকাউন্ট লিঙ্ক করতে সমস্যা হলে, ট্রাবলশুটিং ধাপগুলো দেখুন।
macbookpro3:terraform-google-cloud-storage user$ make docker_test_prepare
docker run --rm -it \
-e SERVICE_ACCOUNT_JSON \
-e TF_VAR_org_id \
-e TF_VAR_folder_id \
-e TF_VAR_billing_account \
-v /Users/cft/terraform-google-cloud-storage:/workspace \
gcr.io/cloud-foundation-cicd/cft/developer-tools:0.8.0 \
/usr/local/bin/execute_with_credentials.sh prepare_environment
Activated service account credentials for: [cft-onboarding@<project_id>.iam.gserviceaccount.com]
Activated service account credentials for: [cft-onboarding@<project_id>.iam.gserviceaccount.com]
Initializing modules...
Initializing the backend...
Initializing provider plugins...
The following providers do not have any version constraints in configuration,
so the latest version was installed.
To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.
* provider.google-beta: version = "~> 3.9"
* provider.null: version = "~> 2.1"
* provider.random: version = "~> 2.2"
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
module.project.module.project-factory.null_resource.preconditions: Refreshing state... [id=8723188031607443970]
module.project.module.project-factory.null_resource.shared_vpc_subnet_invalid_name[0]: Refreshing state... [id=5109975723938185892]
module.project.module.gsuite_group.data.google_organization.org[0]: Refreshing state...
module.project.module.project-factory.random_id.random_project_id_suffix: Refreshing state... [id=rnk]
module.project.module.project-factory.google_project.main: Refreshing state... [id=<project-id>]
module.project.module.project-factory.google_project_service.project_services[0]: Refreshing state... [id=<project-id>/storage-api.googleapis.com]
module.project.module.project-factory.google_project_service.project_services[1]: Refreshing state... [id=<project-id>/cloudresourcemanager.googleapis.com]
module.project.module.project-factory.google_project_service.project_services[2]: Refreshing state... [id=<project-id>/compute.googleapis.com]
module.project.module.project-factory.data.null_data_source.default_service_account: Refreshing state...
module.project.module.project-factory.google_service_account.default_service_account: Refreshing state... [id=projects/ci-cloud-storage-ae79/serviceAccounts/project-service-account@<project-id>.iam.gserv
iceaccount.com]
module.project.module.project-factory.google_project_service.project_services[3]: Refreshing state... [id=<project-id>/serviceusage.googleapis.com]
module.project.module.project-factory.null_resource.delete_default_compute_service_account[0]: Refreshing state... [id=3576396874950891283]
google_service_account.int_test: Refreshing state... [id=projects/<project-id>/serviceAccounts/cft-onboarding@<project-id>.iam.gserviceaccount.com]
google_service_account_key.int_test: Refreshing state... [id=projects/<project-id>/serviceAccounts/cft-onboarding@<project-id>.iam.gserviceaccount.com/keys/351009a1e011e88049ab2097994d1c627a61
6961]
google_project_iam_member.int_test[1]: Refreshing state... [id=<project-id>/roles/iam.serviceAccountUser/serviceaccount:cft-onboarding@<project-id>.iam.gserviceaccount.com]
google_project_iam_member.int_test[0]: Refreshing state... [id=<project-id>/roles/storage.admin/serviceaccount:cft-onboarding@<project-id>.iam.gserviceaccount.com]
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
project_id = <test-project-id>
sa_key = <sensitive>
Found test/setup/make_source.sh. Using it for additional explicit environment configuration.
আপনি এখন একটি টেস্ট প্রজেক্ট তৈরি করেছেন, যা project_id দ্বারা নির্দেশিত, যেমনটি আপনি কনসোল আউটপুটে দেখতে পাচ্ছেন। আপনার ডেভেলপমেন্ট এবং টেস্ট এনভায়রনমেন্ট সেটআপ করা হয়ে গেছে।
৫. সিএফটি মডিউলে একটি নতুন বৈশিষ্ট্য যোগ করুন
এখন আপনার ডেভেলপমেন্ট এবং টেস্ট এনভায়রনমেন্ট সেটআপ করা হয়ে গেছে, চলুন google-cloud-storage CFT মডিউলে আপনার 'silly_label' ফিচারটি যোগ করা শুরু করি।
নিশ্চিত করুন যে আপনি terraform-google-cloud-storage-এ আছেন এবং নিচে দেখানো ফোল্ডার কাঠামো অনুযায়ী main.tf ফাইলটি খুলুন।

যেহেতু 'silly_label' একটি লেবেল, তাই আপনি main.tf ফাইলের ২৭ নম্বর লাইনে 'labels' ভেরিয়েবলে ফিচারটি যোগ করবেন, যেমনটি নিচে দেখানো হয়েছে:
টেরাফর্ম-গুগল-ক্লাউড-স্টোরেজ/main.tf
resource "google_storage_bucket" "buckets" {
<...>
storage_class = var.storage_class
// CODELAB:Add silly label in labels variable
labels = merge(var.labels, { name = replace("${local.prefix}${lower(each.value)}", ".", "-") }, { "silly" = var.silly_label })
force_destroy = lookup(
<...>
}
এখন, আপনি উপরের ফোল্ডার কাঠামোতে দেখানো variables.tf ফাইলটিতে silly_label ভেরিয়েবলটি যোগ করবেন।
নিচের কোডটি কপি করে variables.tf ফাইলের ৩১ নম্বর লাইনে পেস্ট করুন এবং নিশ্চিত করুন যে আপনার যোগ করা ভেরিয়েবল ব্লকের উপরে ও নিচে একটি নতুন লাইন ক্যারেক্টার (new line character) আছে।
টেরাফর্ম-গুগল-ক্লাউড-স্টোরেজ/ভেরিয়েবলস.টিএফ
variable "names" {
description = "Bucket name suffixes."
type = list(string)
}
// CODELAB: Add "silly_label" variable to variables.tf between "names" and "location"
variable "silly_label" {
description = "Sample label for bucket."
type = string
}
variable "location" {
description = "Bucket location."
default = "EU"
}
৬. স্টোরেজ বাকেটের উদাহরণে একটি নতুন বৈশিষ্ট্য যোগ করুন
আপনি মডিউলের main.tf ফাইলে আপনার ফিচারটি যুক্ত করেছেন এবং এখন একটি উদাহরণের মাধ্যমে আপনার ফিচারটি পরীক্ষা করবেন।
'silly_label' টি examples/multiple-buckets/main.tf ফাইলে যোগ করতে হবে।
এই উদাহরণটি পরবর্তী ধাপে ইন্টিগ্রেশন টেস্ট সম্পাদন করতে ব্যবহার করা হবে।
ফোল্ডার স্ট্রাকচারে যেমন দেখানো হয়েছে, সেই অনুযায়ী terraform-google-cloud-storage/examples/multiple-buckets/ ফোল্ডারের main.tf ফাইলের ২৭ নম্বর লাইনে নিচের silly_label ভ্যারিয়েবলের লাইনটি কপি-পেস্ট করুন।
terraform-google-cloud-storage/examples/multiple-buckets/main.tf
module "cloud_storage" {
<...>
// CODELAB: Add "silly_label" as an example to main.tf.
silly_label = "awesome"
<..>
}
৭. ফিচারটি যাচাই করার জন্য ব্লুপ্রিন্ট টেস্ট আপডেট করুন।
আপনি মডিউলের main.tf-এ আপনার ফিচারটি যুক্ত করেছেন এবং এরপর multiple_buckets উদাহরণটিতেও ফিচারটি যোগ করেছেন। এখন, আপনাকে Golang-এ লেখা একটি ব্লুপ্রিন্ট ইন্টিগ্রেশন টেস্টের মাধ্যমে আপনার ফিচারটি পরীক্ষা করতে হবে।
আপনাকে আপনার নতুন টেস্টগুলো নিচের ফোল্ডার কাঠামোতে থাকা multiple_buckets_test.go ফাইলে যোগ করতে হবে:

আপনি multiple_buckets মডিউলের মাধ্যমে তৈরি করা সমস্ত বাকেটে "silly_label" যোগ করেছেন এবং এখন নতুন ফিচারটি পরীক্ষা করার জন্য আপনাকে টেস্ট লিখতে হবে।
নিচের কোডে, আপনি `gcloud alpha storage` কমান্ডের মাধ্যমে প্রতিটি বাকেটের লেবেল নিচ্ছেন এবং তারপর কমান্ড থেকে প্রাপ্ত আউটপুটটি যাচাই করছেন।
test/integration/multiple_buckets/multiple_buckets_test.go
func TestMultipleBuckets(t *testing.T) {
<..>
op := gcloud.Run(t, fmt.Sprintf("alpha storage ls --buckets gs://%s", bucketName), gcloudArgs).Array()[0]
// verify silly label on each bucket
assert.Equal("awesome", op.Get("metadata.labels.silly").String(), "should have silly label set to awesome")
// verify lifecycle rules
...
}
৮. CFT-তে ইন্টিগ্রেশন টেস্টগুলো সম্পাদন করুন।
ইন্টিগ্রেশন টেস্টিং
রুট মডিউল, সাবমডিউল এবং উদাহরণগুলোর আচরণ যাচাই করার জন্য ইন্টিগ্রেশন টেস্ট ব্যবহার করা হয়। কোনো সংযোজন, পরিবর্তন এবং সংশোধনের সাথে অবশ্যই টেস্ট থাকতে হবে।
ইন্টিগ্রেশন টেস্টগুলো ব্লুপ্রিন্ট টেস্ট ফ্রেমওয়ার্ক ব্যবহার করে লেখা হয় এবং CFT CLI ব্যবহার করে চালানো হয়। সুবিধার জন্য এই টুলগুলো একটি ডকার ইমেজের মধ্যে প্যাকেজ করা থাকে।
এই পরীক্ষাগুলোর সাধারণ কৌশল হলো উদাহরণ মডিউলগুলোর আচরণ যাচাই করা, যার মাধ্যমে নিশ্চিত করা যায় যে রুট মডিউল, সাবমডিউল এবং উদাহরণ মডিউল—সবগুলোই কার্যকারিতার দিক থেকে সঠিক।
ইন্টারেক্টিভ এক্সিকিউশনে, আপনি একাধিক কমান্ডের মাধ্যমে প্রতিটি ধাপ সম্পাদন করেন।
- ইন্টারেক্টিভ মোডে টেস্টিং ডকার কন্টেইনারটি চালু করতে
make docker_runচালান।
Make হলো একটি বিল্ড অটোমেশন টুল যা Makefile নামক ফাইল পড়ে সোর্স কোড থেকে স্বয়ংক্রিয়ভাবে এক্সিকিউটেবল প্রোগ্রাম এবং লাইব্রেরি তৈরি করে। এই ফাইলগুলোতে নির্দিষ্ট করা থাকে কীভাবে টার্গেট প্রোগ্রামটি তৈরি করতে হবে। যখন আপনি Make ফাইলে কোনো পরিবর্তন করেন, তখন ডকার কন্টেইনারটি অবশ্যই স্বয়ংক্রিয়ভাবে আপডেট হতে হবে।
যখন আপনি make docker_run চালান, তখন আপনার ডকার কন্টেইনারে একটি ওয়ার্কস্পেস তৈরি হয় এবং আপনার সার্ভিস অ্যাকাউন্টের ক্রেডেনশিয়ালগুলো সক্রিয় হয়ে যায়। পরবর্তী ধাপগুলোতে টেস্ট চালানোর জন্য এই ওয়ার্কস্পেসটি ব্যবহার করা হবে।
আপনার টার্মিনালে নিচের আউটপুটটি দেখতে পাবেন:
Activated service account credentials for: [cft@<PROJECT_ID>.iam.gserviceaccount.com]
- প্রকাশিত মডিউলগুলোর পরিবর্তে আপনার স্থানীয় ফাইলগুলো থেকে মডিউল ইম্পোর্ট করার জন্য উদাহরণ
main.tfফাইলগুলো পরিবর্তন করতেmodule-swapper -registry-prefix=terraform-google-modulesচালান।
আপনার টার্মিনালে নিম্নলিখিতের মতো আউটপুট দেখতে পাবেন:
[root@<CONTAINER_ID> workspace]# module-swapper -registry-prefix=terraform-google-modules
2025/08/04 19:26:29 Module name set from remote to cloud-storage
2025/08/04 19:26:29 Modifications made to file /workspace/examples/multiple_buckets/main.tf
2025/08/04 19:26:29 --- Original
+++ Modified
@@ -21,7 +21,7 @@
}
module "cloud_storage" {
- source = "terraform-google-modules/cloud-storage/google"
+ source = "../.."
# [restore-marker] version = "~> 10.0"
project_id = var.project_id
- আপনার ওয়ার্কস্পেসের সমস্ত ব্লুপ্রিন্ট টেস্টের তালিকা দেখতে
cft test listচালান।
আপনার টার্মিনালে নিচের আউটপুটটি দেখতে পাবেন:
[root@CONTAINER_ID workspace]# cft test list
NAME | CONFIG | LOCATION
--------------------------------+---------------------------+------------------------------------------------------------
TestAll/examples/simple_bucket | examples/simple_bucket | test/integration/discover_test.go
TestMultipleBuckets | examples/multiple_buckets | test/integration/multiple_buckets/multiple_buckets_test.go
- উদাহরণটি শুরু করতে
cft test run <EXAMPLE_NAME> --stage initচালান। এক্ষেত্রে,TestMultipleBucketsটেস্ট রান শুরু করতেcft test run TestMultipleBuckets --stage init। টেস্ট চালানোর সময় অতিরিক্ত তথ্য পেতে আপনি--verboseফ্ল্যাগটিও ব্যবহার করতে পারেন।
এই ইনিট পর্যায়টি টেরাফর্ম উদাহরণটিকে প্রারম্ভিকীকরণ করে।
আপনি আপনার টার্মিনালে নিচের আউটপুটটি দেখতে পাবেন।
[root@<CONTAINER_ID> workspace]# cft test run TestMultipleBuckets --stage init --verbose
INFO[02-09|08:24:31] using test-dir: test/integration
...
TestMultipleBuckets 2022-02-09T08:24:35Z command.go:179: Terraform has been successfully initialized!
...
TestMultipleBuckets 2022-02-09T08:24:35Z command.go:100: Running command terraform with args [validate]
TestMultipleBuckets 2022-02-09T08:24:36Z command.go:179: Success! The configuration is valid.
...
--- PASS: TestMultipleBuckets (4.05s)
- উদাহরণ মডিউলটি প্রয়োগ করতে
cft test run <EXAMPLE_NAME> --stage applyচালান।
এই ধাপে, কোডল্যাবে আগে তৈরি করা GCP প্রজেক্টটিতে পূর্ববর্তী পর্যায়ে শুরু করা উদাহরণটি প্রয়োগ করা হয়।
আপনি আপনার টার্মিনালে নিচের আউটপুটটি দেখতে পাবেন।
[root@<CONTAINER_ID> workspace]# cft test run TestMultipleBuckets --stage apply --verbose
INFO[02-09|08:28:11] using test-dir: test/integration
...
TestMultipleBuckets 2022-02-09T08:28:19Z command.go:179: Apply complete! Resources: 6 added, 0 changed, 0 destroyed.
TestMultipleBuckets 2022-02-09T08:28:19Z command.go:179:
TestMultipleBuckets 2022-02-09T08:28:19Z command.go:179: Outputs:
TestMultipleBuckets 2022-02-09T08:28:19Z command.go:179:
TestMultipleBuckets 2022-02-09T08:28:19Z command.go:179: names = {
TestMultipleBuckets 2022-02-09T08:28:19Z command.go:179: "one" = "multiple-buckets-erp1-eu-one"
...
--- PASS: TestMultipleBuckets (6.51s)
PASS
ok github.com/terraform-google-modules/terraform-google-cloud-storage/test/integration/multiple_buckets 6.548s
- উদাহরণটি প্রত্যাশিত পরিকাঠামো তৈরি করেছে কিনা তা যাচাই করতে
cft test run <EXAMPLE_NAME> --stage verifyচালান।
এই ধাপে TestMultipleBuckets মধ্যে verify ফাংশনটি চালানো হবে। সাধারণত, কোনো রিসোর্সের বর্তমান অবস্থার জন্য JSON আউটপুট পেতে একটি gcloud কমান্ড চালানোর মাধ্যমে এবং বর্তমান অবস্থাটি উদাহরণে ঘোষিত অবস্থার মতোই কিনা তা যাচাই করার মাধ্যমে ভেরিফিকেশন করা হয়।
যদি কোনো ত্রুটি দেখা দেয়, তাহলে আপনি দেখতে পাবেন যে পরীক্ষার জন্য কমান্ডটি কী প্রত্যাশা করেছিল এবং কী গ্রহণ করেছে।
আপনি আপনার টার্মিনালে নিচের আউটপুটটি দেখতে পাবেন।
[root@<CONTAINER_ID> workspace]# cft test run TestMultipleBuckets --stage verify --verbose
INFO[02-09|08:30:19] using test-dir: test/integration
...
TestMultipleBuckets 2022-02-09T08:30:27Z command.go:100: Running command terraform with args [output -no-color -json names_list]
TestMultipleBuckets 2022-02-09T08:30:27Z command.go:179: ["multiple-buckets-erp1-eu-one","multiple-buckets-erp1-eu-two"]
TestMultipleBuckets 2022-02-09T08:30:27Z command.go:100: Running command gcloud with args [alpha storage ls --buckets gs://multiple-buckets-erp1-eu-one --project ci-cloud-storage-8ce9 --json]
TestMultipleBuckets 2022-02-09T08:30:28Z command.go:179: [
TestMultipleBuckets 2022-02-09T08:30:28Z command.go:179: {
TestMultipleBuckets 2022-02-09T08:30:28Z command.go:179: "url": "gs://multiple-buckets-erp1-eu-one/",
...
TestMultipleBuckets 2022-02-09T08:30:33Z command.go:179: ]
2022/02/09 08:30:33 RUN_STAGE env var set to verify
2022/02/09 08:30:33 Skipping stage teardown
--- PASS: TestMultipleBuckets (12.32s)
PASS
ok github.com/terraform-google-modules/terraform-google-cloud-storage/test/integration/multiple_buckets 12.359s
- উদাহরণটি টিয়ারডাউন করতে
cft test run <EXAMPLE_NAME> --stage teardownচালান।
এই ধাপে আপনি পূর্ববর্তী ধাপগুলোতে যে পরিকাঠামো তৈরি করেছেন তা ধ্বংস করে দেওয়া হবে। এই ধাপে প্রজেক্টে তৈরি করা GCS বাকেটগুলো এবং GCS মডিউলে আপনার যোগ করা লেবেলটিও ধ্বংস হয়ে যাবে।
আপনি আপনার টার্মিনালে নিচের আউটপুটটি দেখতে পাবেন।
[root@<CONTAINER_ID> workspace]# cft test run TestMultipleBuckets --stage teardown --verbose
INFO[02-09|08:36:02] using test-dir: test/integration
...
TestMultipleBuckets 2022-02-09T08:36:06Z command.go:100: Running command terraform with args [destroy -auto-approve -input=false -lock=false]
TestMultipleBuckets 2022-02-09T08:36:07Z command.go:179: module.cloud_storage.random_id.bucket_suffix: Refreshing state... [id=mNA]
TestMultipleBuckets 2022-02-09T08:36:07Z command.go:179: random_string.prefix: Refreshing state... [id=erp1]
TestMultipleBuckets 2022-02-09T08:36:08Z command.go:179: module.cloud_storage.google_storage_bucket.buckets["two"]: Refreshing state... [id=multiple-buckets-erp1-eu-two]
...
TestMultipleBuckets 2022-02-09T08:36:10Z command.go:179: Destroy complete! Resources: 6 destroyed.
TestMultipleBuckets 2022-02-09T08:36:10Z command.go:179:
--- PASS: TestMultipleBuckets (6.62s)
PASS
ok github.com/terraform-google-modules/terraform-google-cloud-storage/test/integration/multiple_buckets 6.654s
- শেষবার module-swapper চালানোর ফলে উদাহরণ
main.tfফাইলগুলিতে হওয়া পরিবর্তনগুলি বাতিল করতে module-module-swappermodule-swapper -registry-prefix=terraform-google-modules -restoreচালান।
[root@<CONTAINER_ID> workspace]# module-swapper -registry-prefix=terraform-google-modules -restore
2025/08/04 19:30:41 Module name set from remote to cloud-storage
2025/08/04 19:36:32 Modifications made to file /workspace/examples/multiple_buckets/main.tf
2025/08/04 19:36:32 --- Original
+++ Modified
@@ -21,8 +21,8 @@
}
module "cloud_storage" {
- source = "../.."
- version = "~> 10.0"
+ source = "terraform-google-modules/cloud-storage/google"
+ version = "~> 10.0"
project_id = var.project_id
- টেস্ট কন্টেইনার থেকে বের হতে
exitচালান।
৯. ইনপুট এবং আউটপুটের জন্য ডকুমেন্টেশন তৈরি করা
রুট মডিউল, সাবমডিউল এবং উদাহরণ মডিউলগুলোর README-তে থাকা ইনপুট ও আউটপুট টেবিলগুলো সংশ্লিষ্ট মডিউলগুলোর variables ও outputs উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে তৈরি হয়। মডিউলের ইন্টারফেস পরিবর্তন করা হলে এই টেবিলগুলো অবশ্যই রিফ্রেশ করতে হবে।
দৌড়:
make generate_docs
# This will generate new Inputs and Outputs tables
১০. CFT-তে লিন্ট টেস্টগুলো চালান।
লিন্টার হলো এমন একটি টুল যা সোর্স কোড বিশ্লেষণ করে প্রোগ্রামিং ত্রুটি, বাগ, শৈলীগত ভুল এবং সন্দেহজনক গঠন চিহ্নিত করে।
গুণমানের একটি মান বজায় রাখার জন্য রিপোজিটরির অনেক ফাইল লিন্ট বা ফরম্যাট করা যেতে পারে। CFT-তে গুণমান নিশ্চিত করতে, আপনি একটি লিন্ট টেস্ট ব্যবহার করবেন।
দৌড়:
make docker_test_lint
# This will run all lint tests on your repo
১১. গিটহাবে পুল রিকোয়েস্ট জমা দেওয়া
এখন যেহেতু আপনি আপনার কোড স্থানীয়ভাবে পরিবর্তন করেছেন এবং ইন্টিগ্রেশন টেস্টের মাধ্যমে পরীক্ষা করেছেন, আপনি এই কোডটি মাস্টার রিপোতে প্রকাশ করতে চাইবেন।
আপনার কোড মাস্টার রিপোতে উপলব্ধ করতে, আপনাকে আপনার ব্রাঞ্চে কোডের পরিবর্তনগুলো কমিট করে মাস্টার রিপোজিটরিতে পুশ করতে হবে। কোডল্যাবের শুরুতে আপনার ফোর্ক করা মূল রিপোতে আপনার কোড যুক্ত করার জন্য, আপনার রিপোতে কোড কমিট করার পর মাস্টার রিপোতে একটি পুল রিকোয়েস্ট (PR) উত্থাপন করতে হবে।
আপনি যখন একটি পিআর (PR) তৈরি করবেন, তখন প্রস্তাবিত কোড পরিবর্তনগুলো পর্যালোচনা করার জন্য রিপো অ্যাডমিনকে জানানো হবে। এছাড়াও, আপনার কোড পরিবর্তনগুলোর উপর মতামত পাওয়ার জন্য আপনি অন্যান্য ব্যবহারকারীদেরও পর্যালোচক হিসেবে যুক্ত করতে পারেন। পিআর-টি একটি ক্লাউড বিল্ড (Cloud Build) চালু করবে, যা রিপোটিতে টেস্ট চালাবে।
আপনার কোডের পরিবর্তনের উপর ভিত্তি করে, কোড রিভিউয়াররা আপনার কোডে মন্তব্য করবেন এবং সেরা অনুশীলন ও ডকুমেন্টেশন অনুযায়ী কোনো পরিবর্তনের প্রয়োজন হলে তা সংশোধনের জন্য বলবেন। অ্যাডমিন আপনার কোডের পরিবর্তনগুলো পর্যালোচনা করবেন, আপনার কোড রিপোর সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করবেন এবং মাস্টার রিপোতে আপনার কোড মার্জ করার আগে আপনাকে পুনরায় কিছু পরিবর্তন করার জন্য অনুরোধ করতে পারেন।
আপনার ফর্ক করা ব্রাঞ্চে কোড কমিট করতে এবং পুশ করতে নিম্নলিখিত ধাপগুলো অনুসরণ করুন:
- প্রথম ধাপ হলো পরিবর্তিত ফাইলগুলোকে লোকাল রিপোতে যুক্ত করা।
$ git add main.tf
$ git add README.md
$ git add variables.tf
$ git add examples/multiple-buckets/main.tf
$ git add test/integration/multiple_buckets/multiple_buckets_test.go
# The ‘git add' command adds the file in the local repository and
# stages the file for commit. To unstage a file, use git reset HEAD YOUR-FILE
- আপনার ফাইলগুলো এখন স্টেজ করা হয়েছে, এরপর পরিবর্তনগুলো কমিট করবেন।
$ git commit -m "First CFT commit"
# This will commit the staged changes and prepares them to be pushed
# to a remote repository. To remove this commit and modify the file,
# use 'git reset --soft HEAD~1' and commit and add the file again.
- পুল রিকোয়েস্ট (PR) তৈরি করার জন্য আপনার লোকাল রিপোজিটরিতে কমিট করা পরিবর্তনগুলো গিটহাবে পুশ করুন।
$ git push -u origin feature/silly_label
# Pushes the changes in your local repository up to the remote
# repository you specified as the origin
আপনার কোডের পরিবর্তনগুলো এখন পুল রিকোয়েস্টের জন্য প্রস্তুত!
terraform-google-modules/terraform-google-cloud-storage রেপোতে একটি PR তৈরি করতে নিম্নলিখিত ধাপগুলি অনুসরণ করুন :
- আপনার ওয়েব ব্রাউজারে রিপোটির মূল পৃষ্ঠায় যান।
- আপনার ফর্ক থেকে একটি পিআর (PR) খোলার জন্য একটি ব্যানারের মাধ্যমে সাজেশন দেখতে পাবেন। 'Compare and pull request'-এ ক্লিক করুন।

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

- পর্যালোচনার জন্য প্রস্তুত একটি পুল রিকোয়েস্ট তৈরি করতে, 'Create Pull Request'-এ ক্লিক করুন।
- আপনি ক্লাউড বিল্ড ট্রিগারগুলো চলতে দেখবেন, যেগুলো পিআর (PR)-এর কারণে ট্রিগার হয়েছে।
- ফর্ক থেকে পুল রিকোয়েস্ট খোলার বিষয়ে কোনো সমস্যা হলে গিটহাবের অফিশিয়াল ডকুমেন্টেশন দেখুন।
আপনি সফলভাবে আপনার ফর্ক করা ব্রাঞ্চে প্রথম কোড পরিবর্তন পুশ করেছেন এবং মাস্টার ব্রাঞ্চের বিরুদ্ধে আপনার প্রথম CFT PR উত্থাপন করেছেন!
১২. অভিনন্দন
অভিনন্দন, আপনি সফলভাবে একটি CFT মডিউলে একটি ফিচার যুক্ত করেছেন এবং পর্যালোচনার জন্য একটি PR জমা দিয়েছেন!
আপনি একটি CFT মডিউলে একটি ফিচার যোগ করেছেন, একটি উদাহরণের মাধ্যমে স্থানীয়ভাবে সেটি পরীক্ষা করেছেন এবং GitHub-এ আপনার কোড কমিট করার আগে বিভিন্ন পরীক্ষা সম্পন্ন করেছেন। অবশেষে, আপনি পর্যালোচনার জন্য এবং CFT-তে চূড়ান্তভাবে মার্জ করার জন্য একটি PR উত্থাপন করেছেন।
ক্লাউড ফাউন্ডেশন টুলকিট দিয়ে কাজ শুরু করার গুরুত্বপূর্ণ ধাপগুলো এখন আপনি জানেন।
