مساحات العمل واستراتيجيات البيئات
مساحات العمل واستراتيجيات البيئات
كل قاعدة كود Terraform جادة تحتاج إلى إدارة ثلاث بيئات على الأقل: التطوير، والاختبار، والإنتاج. النهج السطحي — نسخ ملفات .tf إلى مجلدات منفصلة والحفاظ عليها بشكل متوازٍ — ينهار تحت ثقله خلال أسابيع. النهج الاحترافي يتطلب استراتيجية مدروسة منذ اليوم الأول، لأن الخيار الذي تتخذه هنا يُشكّل كل قرار في سير عمل CI/CD، وكيفية تحديد نطاق ضرر الأخطاء، والضغط المعرفي الذي يحمله كل مهندس.
ثمة ثلاثة أنماط رئيسية لإدارة البيئات المتعددة في Terraform: مساحات العمل (Workspaces)، ومجلد لكل بيئة، وفرع لكل بيئة. لكل منها حالات استخدام مشروعة وأوضاع فشل خطيرة. تستخدم فرق هندسة المنصات في كبرى الشركات أنماطاً مختلفة لطبقات مختلفة من بنيتها التحتية — إن فهم المقايضات يُمكّنك من الاختيار بوعي بدلاً من الوقوع في خيار عشوائي.
مساحات عمل Terraform: ما هي وما ليست عليه
مساحة العمل هي ملف حالة معزول داخل تكوين backend واحد. عند تشغيل terraform workspace new staging، ينشئ Terraform ملف حالة ثانياً مرتبطاً بتلك المساحة. ملفات التكوين مشتركة؛ والحالة فقط هي المختلفة. اسم مساحة العمل النشطة متاح عبر terraform.workspace، وهو سلسلة نصية مدمجة يمكن استخدامها في الاستيفاءات.
تُعدّ مساحات العمل ممتازة للبيئات المؤقتة — فروع الميزات، وبيئات مراجعة طلبات السحب، واختبارات الأداء القصيرة — حيث تريد تشغيل نسخة مطابقة من Stack، واختبارها، ثم تدميرها بسلاسة. كما تُفيد حقاً في المشاريع البسيطة حيث تتشابه بيئات dev وstaging وprod إلى حد كبير ولا تُدار حسابات AWS منفصلة لكل بيئة.
terraform apply -workspace=production ببيانات اعتماد خاطئة أو خطة سيئة يمكنه تدمير بيئة الإنتاج بسهولة. والأخطر: لأن التكوينات تبدو متطابقة، لا تتوفر أي إشارة بصرية تُخبرك أنك تعمل على الإنتاج. لهذا السبب تحديداً، ابتعدت فرق كبرى مثل Spotify وStripe عن استخدام مساحات العمل للفصل بين الإنتاج والاختبار.
مجلد لكل بيئة: عزل صريح
النمط الذي توصي به HashiCorp وGruntwork ومعظم فرق هندسة المنصات في الشركات الكبيرة هو منح كل بيئة مجلدها الخاص (أو وحدة جذر خاصة بها)، مع تكوين backend خاص وملف حالة خاص. المنطق المشترك يعيش في الوحدات (modules)؛ ومجلدات البيئات هي مستهلكون رفيعو المستوى لتلك الوحدات بقيم متغيرات خاصة بكل بيئة.
الانضباط الجوهري هنا هو أن مجلد الإنتاج يتطلب بيانات اعتماد AWS منفصلة — عادةً دور IAM في حساب AWS إنتاجي مخصص تفترضه CI/CD فقط بعد بوابة موافقة يدوية. بيئة dev تعمل بحرية؛ والإنتاج محمي على مستوى بيانات الاعتماد، وليس فقط على مستوى السياسات داخل ملفات .tf. هذا هو نموذج AWS Organizations متعدد الحسابات: dev وstaging وproduction حسابات AWS منفصلة، لذا فإن تسرّب بيانات الاعتماد في dev لن يمس الإنتاج أبداً.
فرع لكل بيئة: نمط يجب تجنبه
تحاول بعض الفرق عكس فصل البيئات في Git عبر الحفاظ على فروع طويلة الأمد: فرع dev، وفرع staging، وفرع main للإنتاج، مع نشر CI/CD لأي فرع يُدفع إليه. يظهر هذا النمط غالباً في الفرق التي انتقلت من سير عمل نشر التطبيقات حيث كان فرع لكل بيئة شائعاً.
في الواقع العملي، هذا النمط يُنشئ مشكلات حادة. تتباعد ملفات HCL بين الفروع حين تصل الإصلاحات العاجلة مباشرة إلى main دون إعادة نقلها؛ تعارضات الدمج ثلاثية الاتجاهات في ملفات .tf يصعب حلها صحيحاً؛ و"فرع الإنتاج" يُعطي إحساساً زائفاً بالعزل بينما يشترك في نفس backend للحالة. تاريخ Git يصبح المرجع الأساسي لبنيتك التحتية، لكن فرع Git ليس حارساً للبيئة.
اتخاذ القرار الصحيح لمنظومتك
استخدم مصفوفة القرار هذه عند اختيار استراتيجيتك:
- حساب AWS واحد، تكوين بسيط، بيئات متشابهة في معظمها: مساحات العمل مقبولة. احتفظ بالحارس
count = terraform.workspace == "production" ? 0 : 1على الموارد الحساسة خلال التجارب. - حسابات AWS متعددة، امتثال للمعايير المؤسسية، أو أي احتمال لتطبيق عرضي بين البيئات: مجلد لكل بيئة مع backends منفصلة وبيانات اعتماد منفصلة. هذا هو الافتراضي لأي فريق يتجاوز 5 مهندسين.
- تكرار كثير بين مجلدات البيئات: اعتمد Terragrunt (الدرس رقم 7) لتجفيف هذا التكرار — تحتفظ بعزل المجلدات مع التخلص من نسخ تكوينات backend ومزامنة استدعاءات الوحدات.
- بيئات مؤقتة لطلبات السحب/الميزات: مساحات العمل مع إنشاء وتدمير آلي مرتبط بأحداث فتح/إغلاق طلبات السحب في نظام CI. سمّها بشكل حتمي:
pr-${PR_NUMBER}.
استراتيجية البيئات هي من أعلى قرارات الرافعة في IaC تأثيراً. الاختيار الصحيح مبكراً يعني أن قاعدة كود Terraform تتوسع بسلاسة من ثلاث بيئات إلى ثلاثين. أما الاختيار الخاطئ، فيعني إعادة البناء تحت الضغط حين يُوقف تطبيق عشوائي لمساحة عمل dev الإنتاجَ في الثانية صباحاً — قصة عاشها كل فريق منصة تخطى هذا الدرس.