لماذا يحتاج Terraform إلى ملف الحالة (ولماذا لا يجب تخزينه على حاسوبك المحمول أبدًا)
لقد نفذت للتو terraform apply ونجحت في إنشاء خادم وقاعدة بيانات. كل شيء يعمل. أغلقت حاسوبك المحمول وأنت راضٍ. غدًا، تحتاج إلى إضافة موازن تحميل. تفتح التكوين، تضيف المورد، وتشغّل terraform plan.
ينظر إليك Terraform بخطة تريد إعادة إنشاء كل شيء من الصفر.
ماذا حدث؟ ليس لدى Terraform أي ذاكرة لما بناه بالأمس. لا يعرف أن هذا الخادم موجود. لا يعرف أن قاعدة البيانات تعمل. ليس لديه سجل للبنية التحتية التي أنشأها للتو.
هذه هي اللحظة التي يدرك فيها معظم الفرق أنهم بحاجة إلى ملف حالة.
ما الذي يفعله ملف الحالة فعليًا
ملف الحالة هو ذاكرة العمل في Terraform. يسجل كل مورد أنشأه Terraform، بما في ذلك المعرفات الفريدة، وآخر تكوين معروف، وكيفية ارتباط الموارد ببعضها البعض. عندما تشغّل terraform plan، لا يعود Terraform إلى موفر السحابة ليسأل "ما الموجود؟" سيكون ذلك بطيئًا وغير متسق وغير موثوق عبر الموفرين المختلفين. بدلاً من ذلك، يقرأ ملف الحالة ويقارنه بالتكوين الحالي.
فكر فيه كإيصال. بعد كل عملية شراء، تحصل على إيصال يخبرك بما اشتريته ومتى وبأي سعر. بدون هذا الإيصال، سيتعين عليك تفتيش منزلك بالكامل لمعرفة ما تملكه. Terraform هو نفسه. بدون ملف حالة، عليه مسح حسابك السحابي بالكامل لمعرفة ما يديره. وحتى ذلك الحين، لا يمكنه التأكد من الموارد التي أنشأها مقابل تلك التي أنشأها شخص آخر يدويًا.
إليك مقارنة مرئية بين سيرَي العمل:
يحتوي ملف الحالة على معلومات مفصلة عن كل مورد. بالنسبة لخادم سحابي، يشمل ذلك معرف الخادم وعنوان IP ونوع الجهاز ومنطقة التوفر وتكوين الشبكة. بالنسبة لقاعدة بيانات، يشمل ذلك نقطة النهاية والمنفذ وحجم التخزين وإعدادات النسخ الاحتياطي. هذه المعلومات هي المصدر الموثوق للعملية التالية لـ Terraform.
مشكلة الحاسوب المحمول
يبدأ العديد من المطورين بتخزين ملف الحالة محليًا. إنه أسهل شيء يمكن فعله. ينشئ Terraform ملفًا باسم terraform.tfstate في دليل العمل الخاص بك، وتستمر.
هذا يعمل حتى:
- يتعطل حاسوبك المحمول أو يُسرق.
- تحذف الملف عن طريق الخطأ.
- تتبدل أجهزة الكمبيوتر وتنسى نسخ الملف.
- يشغّل أحد أعضاء الفريق Terraform من جهازه وينشئ ملف حالة مختلفًا.
عندما يختفي ملف الحالة، يفقد Terraform كل المعرفة ببنيتك التحتية. يعتقد أنه لا يوجد شيء. إذا شغّلت terraform apply مرة أخرى، سيحاول إنشاء كل شيء من الصفر. ينتهي بك الأمر بموارد مكررة وتكوينات متعارضة وفاتورة سحابية تتضاعف فجأة.
والأسوأ من ذلك، إذا غيّر شخص ما موردًا يدويًا في وحدة التحكم السحابية دون تحديث ملف الحالة، يصبح Terraform غير متزامن. يعتقد أن الخادم لديه 4 جيجابايت من ذاكرة الوصول العشوائي، لكن الخادم الفعلي لديه 8 جيجابايت. ستنتج terraform plan التالية خطة لا تطابق الواقع.
الحالة عن بُعد: النهج الوحيد المعقول
الحل واضح: قم بتخزين ملف الحالة في موقع مشترك يمكن لجميع أعضاء فريقك الوصول إليه. يُسمى هذا الحالة عن بُعد.
الحالة عن بُعد تعني أن ملف الحالة يعيش في خدمة تخزين مثل Amazon S3 أو Azure Storage أو Google Cloud Storage. كل عضو في الفريق وكل خط أنابيب CI/CD يقرأ من ويكتب إلى نفس ملف الحالة. هذا يضمن أن الجميع يعملون من نفس المصدر الموثوق.
إعداد الحالة عن بُعد عادة ما يكون تكوينًا لمرة واحدة في كتلة backend الخاصة بـ Terraform:
terraform {
backend "s3" {
bucket = "my-team-terraform-state"
key = "production/terraform.tfstate"
region = "us-east-1"
}
}
بمجرد التكوين، يقوم Terraform تلقائيًا بجلب ملف الحالة من التخزين عن بُعد قبل كل خطة ويدفع التحديثات بعد كل تطبيق. لا أحد يحتاج إلى نسخ الملفات يدويًا أو القلق بشأن تعارضات الإصدارات.
قفل الحالة: منع التصادمات
مع الحالة عن بُعد، يمكن لعدة أشخاص تشغيل Terraform في نفس الوقت. هذا يقدم مشكلة جديدة: شخصان يشغّلان terraform apply في وقت واحد يمكن أن يفسدا ملف الحالة أو ينشئا بنية تحتية غير متسقة.
قفل الحالة يمنع هذا. عندما تبدأ عملية terraform apply، تقفل ملف الحالة. يجب على العمليات الأخرى الانتظار حتى يتم تحرير القفل. معظم واجهات الحالة عن بُعد تدعم القفل. يستخدم S3 DynamoDB للقفل. Azure Storage لديه دعم تأجير مدمج. Google Cloud Storage يستخدم أرقام إنشاء الكائنات.
بدون قفل، تخاطر بسيناريوهات مثل:
- خطا أنابيب ينشران تغييرات مختلفة في نفس الوقت.
- مطور يشغّل تطبيقًا يدويًا بينما خط أنابيب CI/CD في منتصف النشر.
- تحديثات جزئية حيث يتم تسجيل نصف التغييرات فقط.
قفل الحالة ليس اختياريًا لبيئات الفريق. إنه مطلب.
البيانات الحساسة في ملفات الحالة
تحتوي ملفات الحالة على كل ما يعرفه Terraform عن بنيتك التحتية. يشمل ذلك معلومات حساسة مثل كلمات مرور قواعد البيانات ومفاتيح API وسلاسل الاتصال. يخزن Terraform هذه القيم كنص عادي داخل ملف الحالة.
هذا يعني أن ملف الحالة الخاص بك هو خطر أمني. أي شخص لديه حق الوصول إلى ملف الحالة يمكنه قراءة أسرارك. تدعم واجهات الحالة عن بُعد عادةً التشفير أثناء التخزين وأثناء النقل. يدعم S3 التشفير من جانب الخادم باستخدام KMS. يدعم Azure Storage التشفير أثناء التخزين افتراضيًا. قم دائمًا بتمكين التشفير لتخزين حالتك.
تقوم بعض الفرق أيضًا بفصل ملفات الحالة حسب البيئة. التطوير والاختبار والإنتاج يحصل كل منها على ملف حالة خاص به مخزن في مواقع منفصلة. هذا يمنع التغييرات في بيئة واحدة من التأثير على أخرى. كما يحد من نطاق الانفجار إذا تم اختراق ملف حالة.
كيف تعمل ملفات الحالة في CI/CD
في خط أنابيب CI/CD، يحتاج خط الأنابيب إلى الوصول إلى ملف الحالة لتشغيل Terraform. يتحقق خط الأنابيب من المصادقة إلى واجهة الحالة عن بُعد باستخدام بيانات الاعتماد أو أدوار IAM. يجلب ملف الحالة، ويشغّل terraform plan، وإذا تمت الموافقة، يشغّل terraform apply ويدفع الحالة المحدثة مرة أخرى.
لهذا السبب فإن الحالة عن بُعد ضرورية للأتمتة. لا يمكن لخط أنابيب CI/CD يعمل في حاوية مؤقتة الاعتماد على ملف حالة مخزن على حاسوب مطور محمول. يحتاج إلى موقع ثابت يمكن الوصول إليه بشكل مستقل عن أي جهاز فردي.
قائمة تحقق عملية لإدارة ملفات الحالة
- قم بتخزين ملفات الحالة في تخزين عن بُعد، وليس على الأجهزة المحلية.
- قم بتمكين التشفير أثناء التخزين وأثناء النقل لواجهة التخزين.
- قم بتكوين قفل الحالة لمنع التعديلات المتزامنة.
- استخدم ملفات حالة منفصلة لكل بيئة.
- قيد الوصول إلى ملفات الحالة باستخدام سياسات IAM أو ضوابط الوصول.
- لا تقم أبدًا بإيداع ملفات الحالة في نظام التحكم في الإصدارات.
- قم بنسخ ملفات الحالة احتياطيًا بانتظام، خاصة قبل التغييرات الكبيرة.
ماذا يعني هذا لفريقك
ملفات الحالة ليست تفاصيل تنفيذية يمكنك تجاهلها. إنها العمود الفقري لقدرة Terraform على إدارة البنية التحتية بشكل موثوق. بدون ملف حالة مُدار بشكل صحيح، ستنتج سير عمل Terraform نتائج غير متوقعة وموارد مكررة وأعطال يصعب تصحيحها.
بمجرد أن يكون لديك أكثر من شخص يشغّل Terraform، أو بمجرد إضافة خط أنابيب CI/CD، انقل ملف الحالة الخاص بك إلى تخزين عن بُعد. يستغرق التكوين عشر دقائق ويوفر عليك ساعات من العمل الاستردادي عندما يحدث خطأ ما.
بنيتك التحتية مهمة جدًا بحيث لا يمكن الوثوق بها في ملف على حاسوبك المحمول.