নিবন্ধ

টিমে Terraform: স্টেট বিভাজন, প্রভাবের পরিধি ও রিভিউ করা প্ল্যান

কীভাবে Terraform স্টেট ভাগ করবেন, CI-তে প্ল্যান চালাবেন এবং কেবল রিভিউ করা অংশই প্রয়োগ করবেন, যাতে ইনফ্রাস্ট্রাকচার পরিবর্তন ঝুঁকি নয়, নিয়মিত কাজ হয়ে ওঠে।

উদাহরণগুলো সাধারণ ও ব্যাখ্যামূলক। এগুলো কোনো ক্লায়েন্টের এনভায়রনমেন্ট থেকে নেওয়া নয়: থ্রেশহোল্ড ও সেটিংস নিজের সিস্টেম অনুযায়ী ঠিক করুন।

স্টেট ফাইলই আসল সীমানা

প্রতিটি terraform apply যে স্টেটে কাজ করে তার যেকোনো কিছু বদলাতে পারে। তাই ঝুঁকির একক মডিউল নয়, স্টেট। পুরো এনভায়রনমেন্টের জন্য একটিই স্টেট থাকলে একটি DNS রেকর্ডের টাইপো আর প্রোডাকশন ডেটাবেসের পরিবর্তন একই প্ল্যানে যায় — আর সেই প্ল্যান হিসাব করতে কয়েক মিনিট লাগে।

জীবনচক্র ও প্রভাবের পরিধি অনুযায়ী ভাগ করুন

যে রিসোর্সগুলো একসঙ্গে বদলায় ও একসঙ্গে ব্যর্থ হয়, সেগুলোকে একসঙ্গে রাখুন। একটি প্রচলিত বিভাজন প্রতিটি এনভায়রনমেন্টে আলাদা করে:

  • ভিত্তি: অ্যাকাউন্ট, নেটওয়ার্ক, DNS জোন — কদাচিৎ বদলায়।
  • ডেটা: ডেটাবেস, বাকেট, কিউ — সাবধানে বদলায় এবং মুছে যাওয়া থেকে সুরক্ষিত।
  • কম্পিউট ও সার্ভিস: ক্লাস্টার, ফাংশন, লোড ব্যালান্সার — প্রায়ই বদলায়।

প্রতিটি স্তর নিচের স্তরের আউটপুট পড়ে এবং কখনো তার রিসোর্স পরিচালনা করে না। এনভায়রনমেন্টগুলো একই মডিউল ভাগ করে, কিন্তু স্টেট ও ক্রেডেনশিয়াল আলাদা, যাতে staging-এ apply প্রোডাকশন ছুঁতে না পারে।

রিমোট স্টেট, লকিং ও ভার্সন

  • লকিং ও ভার্সনিং চালু থাকা রিমোট ব্যাকএন্ডে স্টেট রাখুন — কখনো Git-এ নয়, কখনো ল্যাপটপে নয়।
  • ডিপেন্ডেন্সি লক ফাইল (.terraform.lock.hcl) কমিট করুন এবং মডিউল ভার্সন পিন করুন, যাতে আজকের প্ল্যান ও আগামী মাসের প্ল্যান একই কোড চালায়।
  • স্টেটফুল রিসোর্সকে prevent_destroy এবং প্রোভাইডারের নিজস্ব মুছে-ফেলা-সুরক্ষা দিয়ে রক্ষা করুন।

প্রতিটি পুল রিকোয়েস্টে প্ল্যান, রিভিউ করাটুকুই apply

প্রতিটি পরিবর্তনের জন্য CI-তে terraform plan চালান এবং ফলাফল পুল রিকোয়েস্টে পোস্ট করুন। অনুমোদনের পর আবার প্ল্যান না করে সংরক্ষিত প্ল্যানটি প্রয়োগ করুন, যাতে রিভিউয়াররা যা পড়েছেন প্রোডাকশন ঠিক তা-ই পায়; মাঝে স্টেট বদলালে Terraform পুরোনো প্ল্যান প্রত্যাখ্যান করে। পাইপলাইনের উচিত OIDC ফেডারেশনের মাধ্যমে স্বল্পমেয়াদি ক্রেডেনশিয়াল দিয়ে প্রমাণীকরণ করা, সিক্রেটে রাখা দীর্ঘমেয়াদি কী দিয়ে নয়।

terraform init -input=false
terraform plan -input=false -lock-timeout=5m -out=tfplan
terraform show -no-color tfplan > plan.txt   # attach to the pull request

# after approval, applying the same saved plan:
terraform apply -input=false tfplan

নিয়মিত ড্রিফট শনাক্ত করুন

কনসোলে পরিবর্তন এখনো ঘটে, সাধারণত ইনসিডেন্টের সময়। terraform plan -detailed-exitcode চালানো একটি নির্ধারিত জব সেগুলো খুঁজে পায়: এক্সিট কোড ০ মানে কোনো পরিবর্তন নেই, ২ মানে আসল ইনফ্রাস্ট্রাকচার কোড থেকে আলাদা, আর ১ মানে এরর। ২-কে টিকিটে পরিণত করুন, তারপর পরিবর্তনটি কোডে যুক্ত করুন বা ফিরিয়ে নিন।

apply-এর আগে নীতি

“কোনো পাবলিক বাকেট নয়” বা “প্রতিটি রিসোর্সে মালিকের ট্যাগ” এর মতো নিয়ম দীর্ঘ দিনের শেষে কোনো রিভিউয়ারের চেয়ে মেশিন ভালোভাবে যাচাই করে। Conftest-এর মাধ্যমে Open Policy Agent-এর মতো পলিসি-অ্যাজ-কোড টুল CI-তে প্ল্যানের JSON রূপ (terraform show -json) মূল্যায়ন করে মার্জ আটকাতে পারে।

যোগাযোগ

আপনার সেটআপ নিয়ে দ্বিতীয় মতামত চান?

আপনার সিস্টেমের একটি সংক্ষিপ্ত বিবরণ পাঠান। একজন সিনিয়র ইঞ্জিনিয়ার এক কর্মদিবসের মধ্যে লিখিতভাবে উত্তর দেন।

আপনার ইনফ্রাস্ট্রাকচার নিয়ে কথা বলুন