مقالات

Terraform في الفريق: تقسيم الحالة ونطاق الأثر والخطط المراجَعة

كيف تقسّم حالة Terraform، وتشغّل الخطط في CI، ولا تطبّق إلا ما رُوجع، لتصبح تغييرات البنية التحتية روتينًا لا مخاطرة.

الأمثلة عامة وتوضيحية. لم تُؤخذ من بيئة أي عميل: اضبط العتبات والإعدادات وفق نظامك.

ملف الحالة هو الحد الحقيقي

كل تنفيذ لـ terraform apply يستطيع تغيير أي شيء في الحالة التي يعمل عليها. لذا فوحدة المخاطرة هي الحالة لا الوحدة البرمجية. ومع حالة واحدة لبيئة كاملة، يمر خطأ إملائي في سجل DNS وتغيير في قاعدة بيانات الإنتاج عبر الخطة نفسها — وحسابها يستغرق دقائق.

قسّم حسب دورة الحياة ونطاق الأثر

اجمع الموارد التي تتغير معًا وتتعطل معًا. وتقسيم شائع يفصل في كل بيئة:

  • الأساس: الحسابات والشبكات ومناطق DNS — نادرًا ما تتغير.
  • البيانات: قواعد البيانات وحاويات التخزين وقوائم الانتظار — تتغير بحذر ومحمية من الحذف.
  • الحوسبة والخدمات: العناقيد والدوال وموازنات الحمل — تتغير كثيرًا.

كل طبقة تقرأ مخرجات الطبقة التي تحتها ولا تدير مواردها أبدًا. وتتشارك البيئات الوحدات نفسها لكن بحالات وبيانات اعتماد منفصلة، فلا يستطيع تطبيقٌ في staging أن يمسّ الإنتاج.

الحالة البعيدة والقفل والإصدارات

  • احفظ الحالة في واجهة خلفية بعيدة مع تفعيل القفل والإصدارات — لا في Git أبدًا ولا على حاسوب محمول.
  • أودِع ملف قفل الاعتماديات (.terraform.lock.hcl) وثبّت إصدارات الوحدات، لكي تشغّل خطة اليوم وخطة الشهر القادم الكود نفسه.
  • احمِ الموارد ذات الحالة بـ prevent_destroy وبحماية الحذف التي يوفرها المزوّد.

خطة عند كل طلب دمج، وتطبيق ما رُوجع فقط

شغّل terraform plan في CI لكل تغيير وانشر النتيجة على طلب الدمج. وبعد الموافقة، طبّق الخطة المحفوظة بدلًا من التخطيط مجددًا، لكي يتلقى الإنتاج بالضبط ما قرأه المراجعون؛ وإن تغيّرت الحالة في الأثناء يرفض 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 تكشفها: رمز الخروج 0 يعني لا تغييرات، و2 يعني أن البنية الفعلية تختلف عن الكود، و1 يعني خطأً. حوّل الرمز 2 إلى تذكرة، ثم أدرج التغيير في الكود أو تراجع عنه.

السياسات قبل التطبيق

قواعد مثل «لا حاويات تخزين عامة» أو «لكل مورد وسم مالك» تتحقق منها الآلة أفضل من مراجع في نهاية يوم طويل. وأدوات السياسات ككود، مثل Open Policy Agent عبر Conftest، تستطيع تقييم صيغة JSON للخطة (terraform show -json) في CI ومنع الدمج.

اتصل بنا

تريد رأيًا ثانيًا في إعداداتك؟

أرسل وصفًا قصيرًا لنظامك. يرد مهندس خبير كتابيًا خلال يوم عمل واحد.

ناقش بنيتك التحتية