الانجراف والاستيراد والبنية التحتية البرمجية في البيئات الحالية
الانجراف والاستيراد والبنية التحتية البرمجية في البيئات الحالية
من أكثر الحقائق إزعاجاً في هندسة البنية التحتية أن السحابة لا تنتظر Terraform. يعالج المهندسون الأعطال في الساعة الثانية صباحاً عبر واجهة المستخدم، وتُصلح فرق الأمان قواعد مجموعات الأمان مباشرةً عبر AWS CLI، وتُنشئ أحداث التوسع التلقائي موارد لم يعلم بها Terraform قط. بمرور الوقت، يتسع الفجوة بين ما يظن Terraform أنه موجود وما هو موجود فعلاً — المعروفة بـانجراف الإعداد — بصمت حتى تتسبب في حادثة إنتاجية. تُعلّمك هذه الدرس كيف تكشف المؤسسات الكبرى الانجراف مبكراً، وكيف تستورد البنية التحتية الحالية (brownfield) إلى تحكم Terraform، وكيف تُدير حملة تبني brownfield كاملة دون تعطيل الإنتاج.
ما هو الانجراف؟
الانجراف هو أي اختلاف بين الحالة المطلوبة المسجّلة في ملف حالة Terraform والحالة الفعلية في موفر السحابة. يقع في ثلاث فئات:
- انجراف الخصائص — المورد موجود في الحالة وفي السحابة لكن تم تغيير إحدى خصائصه خارج Terraform: شخص ما رفّع نوع EC2 instance من
t3.mediumإلىt3.largeعبر الواجهة الرسومية. - انجراف المورد المفقود — ملف حالة Terraform يقول بوجود مورد لكنه حُذف خارج Terraform (حذف عرضي عبر واجهة المستخدم، أو استبداله بعملية أخرى).
- انجراف الموارد غير المُدارة — مورد موجود في السحابة لم يره Terraform قط: حاوية S3 أُنشئت يدوياً، RDS قديم، مجموعة أمان من حقبة ما قبل IaC.
كشف الانجراف: الأدوات
يوفر Terraform آليتين أصليتين لكشف الانجراف. الأولى هي terraform plan -refresh-only، التي تُجري تحديثاً كاملاً لـ API الموفر لكل مورد في الحالة وتُنشئ خطة تُظهر فقط ما تغيّر في الواقع — دون اقتراح أي تغييرات في الإعداد.
الآلية الثانية هي terraform plan -detailed-exitcode، التي تخرج بالكود 2 إذا كانت هناك تغييرات، و0 إذا لم تكن، و1 عند الأخطاء. هذا كود الخروج هو نقطة التعليق للأتمتة.
أتمتة كشف الانجراف في CI
النمط الإنتاجي هو مهمة CI مجدولة — لا يدوية. تعمل كل 6 ساعات، تغطي كل وحدة جذرية، وتُنبّه فريق المناوبة عند اكتشاف انجراف. في GitHub Actions:
ReadOnlyAccess وصلاحية قراءة backend S3. هذا يحدّ من نطاق الضرر إذا تُعرّضت المهمة المجدولة للاختراق، ويمنع أي مهمة منفلتة من إجراء تغييرات غير مقصودة.
استيراد الموارد الحالية
حين تكتشف مورداً غير مُدار — موجود في السحابة لكن ليس له حالة Terraform — أمامك خياران: الحذف وإعادة الإنشاء عبر Terraform (مُعطّل للإنتاج)، أو استيراده إلى الحالة (الأفضل). terraform import يقرأ المورد الفعلي من API الموفر ويكتبه في ملف الحالة. لا يُنشئ HCL تلقائياً — يجب كتابة الإعداد المطابق أولاً، ثم الاستيراد، ثم التكرار حتى يصبح فرق الخطة صفراً.
قدّم Terraform 1.5 كتلة import، التي تجعل الاستيراد تصريحياً قابلاً للمراجعة في الكود — النهج الحديث المفضّل بدلاً من أمر CLI.
terraform plan وتحقق من نتيجة صفر اختلافات. إذا أظهرت الخطة تغييرات، سيُطبّقها Terraform في المرة القادمة — وقد يُستبدل مورد إنتاجي حرج. صحّح كل خلاف في الخصائص قبل تفعيل التطبيق الآلي.
دليل تبني البيئات الحالية (Brownfield)
تبني Terraform لبيئة إنتاجية حالية هو أحد أعلى العمليات خطورةً تُجريها فرقة المنصة. في الشركات الكبيرة هذه حملة تمتد لأشهر. النمط الآمن هو تبني المُخنقة (strangler-fig): استيراد الموارد طبقةً طبقة، التشغيل في وضع plan-only لأسابيع قبل تفعيل apply، والحفاظ على مسار تراجع في كل خطوة.
- الجرد والتصنيف. استخدم AWS Config أو AWS CLI مع أوامر
describe-*أو أداة مثلterraformerلحصر كل مورد في الحساب. صنّف: مُدار مقابل غير مُدار. رتّب حسب الخطورة — استورد الشبكات أخيراً (أعلى نطاق تدمير)، ابدأ بالحوسبة عديمة الحالة. - اكتب HCL قبل الاستيراد. اكتب إعداد المورد، أودعه في الكود، احصل على مراجعة. الاستيراد لا رجعة فيه بمعنى أن ملف الحالة يتتبع المورد الآن — خطأ في HCL قد يتسبب في حذف أو استبدال المورد الفعلي.
- الاستيراد في فرع، والخطة في CI. أنشئ PR مع كتلة الاستيراد وHCL. سيعرض CI الفرق. ادمج فقط حين تكون الخطة صفر اختلافات.
- فعّل apply تدريجياً. ابدأ بتشغيل CI بوضع plan-only لأسبوعين على الموارد المستوردة حديثاً. تحقق أن كشف الانجراف لا يجد تغييرات غير متوقعة. فقط بعد ذلك افتح بوابة apply.
- وثّق كل استيراد. أضف تعليقاً في HCL أو رسالة git تشرح سبب الاستيراد: التذكرة الأصلية، من أنشأ المورد يدوياً، ومتى استُورد. هذه الذاكرة المؤسسية تمنع الفرق المستقبلية من الاعتقاد بأن المورد آمن للحذف.
lifecycle { prevent_destroy = true } على كل مورد مُستورد من brownfield لأول 90 يوماً. هذا الحارس يمنع terraform destroy العرضي أو for_each المُعدّ خطأً من حذف قاعدة بيانات إنتاجية سابقة لـ IaC. أزله فقط بعد أن تكتسب الفريق ثقةً كاملة في إعداد HCL.
ignore_changes: مخرج الطوارئ
بعض الخصائص تُدار مشروعاً خارج Terraform: عدد ECS المطلوب (يديره auto-scaling)، AMI لـ EC2 instance (تديره خطوط بناء AMI)، كلمة مرور RDS (تديرها AWS Secrets Manager). لهذه الحالات، استخدم ignore_changes لمنع Terraform من التراجع عن التغيير الخارجي:
يُستخدم ignore_changes باعتدال ويُوثَّق دائماً بتعليق يشرح لماذا تُدار الخاصية خارجياً. الإفراط في استخدامه يُفضي إلى تسلل إعداد صامت حيث يتوقف Terraform عن كونه مصدر الحقيقة للخصائص المهمة.
كتل moved لإعادة الهيكلة الآمنة
عند إعادة هيكلة HCL — إعادة تسمية مورد، نقله إلى وحدة، تغيير count إلى for_each — يرى Terraform افتراضياً المورد القديم كمحذوف والجديد كمُنشأ. للموارد الإنتاجية هذا يعني دورة حذف/إعادة إنشاء. تُخبر كتلة moved، التي قُدِّمت في Terraform 1.1، Terraform أن نفس المورد الفعلي يُشار إليه الآن بعنوان مختلف:
أنماط الفشل الإنتاجي
أكثر كوارث brownfield تتبع أنماطاً متكررة يمكن تجنبها:
- الاستيراد ثم التطبيق دون مراجعة الخطة. HCL المُستورد يحتوي خاصية خاطئة (vpc_id غلط، engine_version مختلف). التطبيق التالي يستبدل المورد. راجع دائماً حتى تحصل على خطة صفر اختلافات قبل تفعيل apply.
- عكس قواعد مجموعة الأمان المُنجرفة بصمت. فريق أمان أضاف قاعدة طارئة بعد هجوم. Terraform يعكسها في التطبيق التالي. القاعدة كانت الشيء الوحيد الذي يحجب ناقل الهجوم. شغّل كشف الانجراف قبل كل apply.
- حذف جماعي للموارد بسبب تغيير مفاتيح for_each. مورد brownfield مُستورد بـ
count. شخص يعيد الهيكلة إلىfor_eachبمفاتيح نصية. Terraform يرى كل الموارد المُفهرسة بـ count كمحذوفة وينشئ جديدة. استخدم كتلmovedلربط العناوين القديمة بالجديدة.
كشف الانجراف وتبني brownfield هما المهارتان اللتان تفصلان الفرق التي تستخدم Terraform كمسرحية امتثال عن الفرق التي تستخدمه كمصدر حقيقي فعلي للعمليات. أتقن كليهما، أتمت كشف الانجراف من اليوم الأول، وستظل حالة بنيتك التحتية موثوقةً حتى في أعقد بيئات الإنتاج.