لو الـ infrastructure بتاعك متدارة بـ Terraform، أكبر مخاطرة بتتجاهلها هي الـ drift: تعديل يدوي في الكونسول بيخلي الـ state مش متطابق مع الكود. الحل مش إنك تمنع الناس، الحل إنك تكتشف الفرق خلال 6 ساعات قبل ما يتحوّل لـ outage.
الدليل الكامل لأتمتة اكتشاف Terraform Drift
المشكلة باختصار
بتعمل terraform apply الإثنين، كله تمام. يوم الأربعاء حد فتح AWS Console وعدّل Security Group بسرعة علشان يحل incident. مر أسبوع. بقى فيه فرق بين الـ state المحفوظ والواقع الفعلي على AWS. جه يوم الـ deploy الجديد، الـ plan بيقرّر "يصلح" التعديل الطارئ ده ويرجّع القاعدة القديمة — وساعتها بالظبط بيقع الموقع مرة تانية.
ده اسمه configuration drift. مش حالة نادرة، بيحصل في كل فريق أكبر من شخصين. الحل إنك تكتشفه بشكل تلقائي قبل ما حد يعمل apply.
مثال قبل المفهوم: دفتر مفاتيح الشقة
تخيل إنك ساكن مع 3 ناس، وعندكم مفتاح أصلي ومفتاحين احتياطيين مسجلين في دفتر على باب المطبخ. جالك صديق ونسخ مفتاح تالت من نفسه من غير ما يكتبه في الدفتر. لسه الباب بيتفتح عادي، بس الدفتر مبيطابقش الحقيقة. لو جيت بعد شهر تغيّر القفل وقلت "هكنسل كل المفاتيح المسجلة في الدفتر"، هتكتشف إن فيه مفتاح تالت شغّال ومعدّاش من عندك.
Terraform drift هو نفس القصة بالظبط. الـ state file هو الدفتر. الكلاود هو الباب. وأي تعديل مباشر على الباب من غير ما يتحدث الدفتر اسمه drift.
تعريف علمي دقيق
الـ configuration drift في Terraform هو الفرق بين ثلاث حالات: (أ) الموارد المُعرّفة في ملفات .tf، (ب) الـ state اللي Terraform بيخزّنه في terraform.tfstate (محليًا أو remote)، (ج) الحالة الفعلية للموارد عند مزود السحابة. لما يحصل تعديل مباشر على (ج) من غير ما يمر عبر Terraform، بتظهر فجوة بين الثلاثة. Terraform بيستخدم أمر plan علشان يقارن بينهم ويطلع الفرق.
الأداة الأساسية: detailed-exitcode
المفتاح كله في flag واحد: terraform plan -detailed-exitcode. الأمر ده بيرجّع:
- 0 — مفيش تغييرات، كل حاجة متطابقة.
- 1 — خطأ حصل أثناء تشغيل الـ plan.
- 2 — فيه فرق، يعني في drift أو تعديل مش متحوّل لـ apply.
بدون الـ flag ده، الـ plan بيرجّع 0 على طول حتى لو فيه 300 resource هيتغيّر، وده السبب اللي بيخلي الناس تفتكر إن CI الأخضر = infra سليمة. الكلام ده غلط.
الـ workflow الكامل
الـ workflow ده بيشتغل كل 6 ساعات، وبيفتح GitHub Issue تلقائيًا لو لقى drift. ملف .github/workflows/drift.yml: