اختبار Terraform
اختبار Terraform
البنية التحتية كرمز التي لا تُختبر أبداً هي التزام مُقنَّع على هيئة إنتاجية. وحدة Terraform معطوبة تُدمج في الفرع الرئيسي وتُطبَّق على الإنتاج تسبّبت في انقطاعات لا تُحصى — مجموعات أمان خاطئة تفتح منافذ على 0.0.0.0/0، شبكات VPC بلا دقة DNS، وقواعد بيانات RDS بلا احتفاظ بنسخ احتياطية. تمنحك منظومة اختبار Terraform الآن دفاعاً متعدد الطبقات: التحقق الساكن، وتأكيدات مرحلة الخطة، والأمر الأصلي terraform test، وبوابات السياسات في CI — كل منها يكتشف نوعاً مختلفاً من الأخطاء في أبكر وقت ممكن.
الطبقة الأولى — التحقق الساكن
قبل أن تُلمس أي حالة، أمران مدمجان يُزيلان فئات كاملة من الأخطاء في ثوانٍ معدودة:
terraform validate— يتحقق من أنواع HCL، ويحل المراجع، ويُبلّغ عن السمات غير المعروفة أو الوسائط المطلوبة المفقودة. يعمل بلا بيانات اعتماد وبلا وصول شبكي، مما يجعله مثالياً كـ pre-commit hook.terraform fmt -check— يفرض التنسيق الأصلي. التنسيق غير المتسق في HCL ليس مجرد مسألة جمالية؛ إنه من أبرز أسباب تعارضات الدمج. أفشل الـ pipeline إذا اختلفfmt.
validate في دليل الوحدة نفسه وأيضاً في الجذر الذي يستدعيها. الوحدة قد تكون سليمة نحوياً بمعزل عن غيرها لكن تفشل التحقق حين تتركّب مع قيم متغيرات محددة.الطبقة الثانية — تأكيدات مرحلة الخطة
تحوّل الخطة نواياك إلى فرق ملموس مقابل الحالة الفعلية. قراءة الخطط برمجياً تكشف المفاجآت قبل apply:
- أخرج خطة قابلة للقراءة آلياً باستخدام
terraform plan -out=tfplan && terraform show -json tfplan > plan.json، ثم أرسلها عبر أدوات مثل conftest أو سكريبتjqبسيط. - أكّد الثوابت: لا يجب لأي مورد من نوع
aws_s3_bucketأن يحملacl = "public-read"؛ لا قاعدةaws_security_group_ruleتسمح بـcidr_blocks = ["0.0.0.0/0"]على المنفذ 22. - في Google وMeta، يعمل تحليل الخطة الآلي على كل طلب سحب (PR)، ويتلقى المراجعون ملخصاً مقروءاً من JSON. لا مراجع يلمس PRs البنية التحتية دون رؤية أثر الخطة.
الطبقة الثالثة — terraform test (اختبارات الوحدة والتكامل الأصلية)
أُطلق الأمر terraform test في Terraform 1.6؛ يحمّل ملفات *.tftest.hcl جانب الوحدة، ويُنشئ بنية تحتية حقيقية، ويُشغّل التأكيدات، ثم يُدمّر كل شيء — في أمر واحد خامل. هذا أقرب ما يكون لاختبارات الوحدة للبنية التحتية.
يعيش ملف الاختبار جانب الوحدة ويُعرّف كتل run. كل run يمكنه تطبيق الخطة أو تقييمها فقط، ثم تقييم شروط assert باستخدام تعبيرات Terraform:
شغّل الحزمة بـ terraform test من جذر الوحدة. يكتشف Terraform تلقائياً جميع ملفات *.tftest.hcl. استخدم -filter=tests/s3_bucket.tftest.hcl لاستهداف ملف محدد أثناء التطوير.
command = plan للتأكيدات التي لا تحتاج موارد حقيقية (التحقق من الأنواع، صيغ الأسماء المحسوبة، قيود المتغيرات). احتفظ بـ command = apply للسلوكيات التي لا يمكن التحقق منها إلا بعد الإنشاء — المخرجات، واستعلامات مصادر البيانات، والمراجع المتقاطعة. هذا يُبقي حزمة الاختبار سريعة: حزمة مؤلفة من 20 اختباراً في وضع plan تعمل في أقل من 30 ثانية، بينما يستغرق وضع apply دقائق ويتكبّد تكاليف سحابية.الطبقة الرابعة — فحوصات السياسات في CI
أدوات السياسة كرمز تفرض ضوابط المؤسسة التي لا يمكن التعبير عنها داخل وحدة Terraform لأن مؤلف الوحدة ومؤلف السياسة فريقان مختلفان. يستهلك HashiCorp Sentinel (Terraform Cloud/Enterprise) وOpen Policy Agent مفتوح المصدر مع conftest خطة JSON ويُصدران حكماً بالنجاح أو الفشل.
terraform test بوضع command = apply على بيئة staging مشتركة. هذه الاختبارات تُنشئ موارد حقيقية وتُدمّرها — بما فيها تلك التي قد تتطابق أسماؤها مع موارد قائمة. عزل تشغيل الاختبارات في حساب AWS مخصص ومؤقت أمر ضروري. على نطاق الشركات الكبرى، تستخدم الفرق لاحقات أسماء عشوائية لكل تشغيل (${random_pet.suffix.id}) لضمان عدم التعارض.تجميع كل شيء — بوابة CI
خط أنابيب CI الناضج لـ Terraform هو تسلسل صارم من البوابات، كل منها أرخص وأسرع من التي تليها. الكود الذي يجتاز كل البوابات فقط يصل إلى مراجعة بشرية:
- fmt + validate — ميلي ثوانٍ، لا بيانات اعتماد مطلوبة.
- tflint / checkov / trivy — تحليل ساكن للثغرات الأمنية والواجهات البرمجية المتقادمة (30-60 ثانية).
- Plan + policy check — يحتاج بيانات اعتماد قراءة سحابية؛ يُوقف عند أي انتهاك للسياسة.
- terraform test (وضع plan) — تأكيدات سريعة على القيم المحسوبة.
- terraform test (وضع apply) — اختبارات تكامل كاملة في حسابات معزولة؛ تعمل عند الدمج في main، لا على كل PR.