Terraform State بالعربي: ليه متحطهوش في Git وإزاي تظبّط Remote Backend صح
لو فريق من 3 مطوّرين شغّل terraform apply في نفس الوقت، و الـ state file محلي أو متحط على Git، فيه احتمال حقيقي إن البنية التحتية كلها تتكسر أو تتبنى مرتين. المقال ده بيحلّ المشكلة دي بخطوات قابلة للتنفيذ في أقل من 15 دقيقة، بصوت عملي وبمصادر موثّقة.
المشكلة باختصار
Terraform بيحتفظ بحالة البنية التحتية في ملف اسمه terraform.tfstate. الملف ده هو "ذاكرة" Terraform — لولاه مش بيعرف إيه اللي اتبنى فعليًا على AWS أو GCP أو Azure. لو الذاكرة دي اتكسرت أو اتضاربت بين مطوّرين، هتدفع التمن غاليًا: موارد مكرّرة، موارد مفقودة، أو secrets متسرّبة.
إيه هو State File أصلًا؟ — مثال للمبتدئين
فكر في Google Docs مفتوح مع فريق. الملف المفتوح بيخزّن نسخة موحّدة من كل التعديلات، وفيه قفل بسيط بيمنع اتنين من الكتابة في نفس السطر في نفس الثانية. لو كل واحد اشتغل على نسخة محلية مقطوعة عن النت، ومفيش مزامنة، واحد هيكتب فقرة والتاني هيمسحها بالغلط لما يعمل paste. ده بالظبط اللي بيحصل مع Terraform state لما يكون محلي.
تقنيًا: state file ملف JSON بيخزّن الـ mapping بين الـ resources في الكود (زي resource "aws_instance" "web") والـ resources الفعلية على الـ cloud provider (الـ EC2 instance ID الحقيقي، الـ ARN، إلخ). Terraform بيقراه قبل كل plan و apply عشان يقارن الـ desired state (كودك) بالـ actual state (الملف) ويحدد يعمل إيه.
ليه Git قرار كارثي للـ State
ناس كتير أول حاجة بتعملها: git add terraform.tfstate. الطريقة دي بتفشل في 3 حالات:
- التضارب (conflict): مطوّران عملوا
applyفي نفس الوقت، كل واحد push نسخته، الـ merge conflict في JSON بيطلّع state ملوّث. Terraform بعدها يحاول يحذف resources موجودة أو يبني resources مكرّرة. - تسريب secrets: الـ state بيحتوي على passwords و keys و connection strings بصيغة نص صريح (plain text). push على repo عام = تسريب مباشر، وحتى repo خاص بيشوفه كل عضو في الفريق بدون تشفير.
- مفيش locking: Git مبيمنعش اتنين من عمل
applyفي نفس اللحظة. النتيجة race condition ممكن ينتج عنه موارد مكرّرة تتكلّف مئات الدولارات قبل ما تكتشفها في الـ bill.
الافتراض هنا إن فريقك أكثر من شخص واحد. لو بتشتغل لوحدك على مشروع شخصي صغير، مخاطر التضارب أقل، بس مشكلة الـ secrets في الـ state بتفضل قايمة حتى على مشروع فردي.
الحل: Remote Backend على S3 مع DynamoDB Locking
Terraform بيدعم backends متعددة. الأكثر شيوعًا ونضجًا على AWS: S3 للتخزين + DynamoDB للـ locking. بدل ما الـ state يكون محلي أو على Git، بيتخزّن في bucket مشفّر وبيتقفل تلقائيًا أثناء الـ apply.
- اعمل S3 bucket مخصّص للـ state مع مفعّل — عشان لو حصل تلف تقدر ترجع لنسخة سابقة.