We are still cooking the magic in the way!
مصادر البيانات والمراجع
مصادر البيانات والمراجع
كل إعداد Terraform غير بديهي يحتاج إلى قراءة العالم قبل أن يتمكن من تغييره. تحتاج إلى معرف أحدث صورة Amazon Linux قبل إطلاق نسخة EC2. تحتاج إلى ARN شهادة تديرها فريق آخر قبل إرفاقها بموازن التحميل. تحتاج إلى كتل CIDR لشبكة VPC أُنشئت منذ ستة أشهر — قبل وجود وحدتك بكثير. وهذا بالضبط ما تحله مصادر البيانات (data sources).
مصدر البيانات هو استعلام للقراءة فقط ضد API المزود أو ملف الحالة. صرّح به بكتلة data، وأشر إلى سماته تماماً كما تفعل مع مورد، وسيبني Terraform حافة التبعية الصحيحة تلقائياً. فهم مصادر البيانات — وكيف يستخدمها رسم بياني الموارد في Terraform — هو ما يُفرّق بين المهندسين الذين يكتبون إعدادات تجريبية والمهندسين الذين يديرون بنية تحتية إنتاجية على نطاق واسع.
كتلة data
تمتلك كتلة data نفس هيكل resource: نوع، واسم محلي، وجسم من وسيطات التصفية. يحل المزود الاستعلام في وقت التخطيط ويكشف كل سمة للكائن المتطابق بصيغة data.<type>.<name>.<attribute>.
depends_on أو قسّم تطبيقك إلى مراحل مُرتّبة عند الحاجة إلى ترتيب بين المكدسات.
أنماط مصادر البيانات الشائعة
الأنماط الثلاثة التي ستستخدمها في كل مشروع هي: (1) جلب معرفات ديناميكية مثل الصور والشهادات، (2) استيراد طوبولوجيا VPC المشتركة التي يديرها فريق المنصة، (3) قراءة المخرجات من ملف حالة Terraform آخر عبر terraform_remote_state.
التبعيات الضمنية والرسم البياني للموارد
لا يُنفّذ Terraform الموارد من الأعلى إلى الأسفل. بدلاً من ذلك، يبني رسماً بيانياً موجّهاً لا دوري (DAG) — رسم بياني الموارد — بتحليل كل مرجع في إعدادك. عندما يُشير مورد B إلى resource_a.foo.id، يرسم Terraform حافة من A إلى B، ضامناً إنشاء A قبل B. يحدث هذا تلقائياً من المراجع؛ وبالكاد تحتاج إلى التصريح به صراحةً.
يمتلك الرسم البياني ثلاثة أنواع من العُقد: عقد المزود (تُهيئ عميل API لـ AWS أو GCP أو Vault)، وعقد الموارد (كائنات البنية التحتية الحقيقية)، وعقد البيانات (استعلامات للقراءة فقط). يتجول Terraform عبر الرسم البياني بالتوازي: العقد المستقلة تعمل في آنٍ واحد؛ العقد المعتمدة تنتظر. في إعداد كبير، هذا التوازي — المُتحكَّم به بـ -parallelism=N (افتراضي 10) — هو ما يجعل Terraform سريعاً رغم إدارة مئات الموارد.
فحص الرسم البياني
يمكنك تجسيد الرسم البياني في أي وقت بـ terraform graph، الذي يُخرج صيغة DOT. مرّره إلى Graphviz لإنتاج PNG ومراجعة ترتيب العقد قبل تطبيق عالي المخاطر:
terraform graph أثناء مراجعة الكود في كل طلب سحب كبير. حافة تبعية مفقودة تعني أن مورديْن يجب أن يكونا متسلسلَيْن سيعملان بالتوازي، مما يتسبب في أعطال متقطعة بسبب ظروف التسابق يصعب إعادة إنتاجها. الرسم البياني يُجعل افتراضات الترتيب غير المرئية صريحةً. في Google وAmazon، تطلب فرق المنصة مراجعة الرسم البياني كجزء من قائمة تدقيق قبول وحدة Terraform.
التبعيات الصريحة مع depends_on
يستنتج رسم Terraform البياني التبعيات من المراجع، لكن ليس من الآثار الجانبية. إذا كان مورد B يستلزم تطبيق مورد A مسبقاً — رغم أن B لا يُشير مباشرةً إلى أي من سمات A — فيجب عليك التعبير عن ذلك بـ depends_on. المثال الكلاسيكي هو سياسة دور IAM التي يجب أن تنتشر قبل أن تتمكن دالة Lambda من التنفيذ.
depends_on يُفسد توازي Terraform. كل حافة غير ضرورية تُسلسل عملاً كان يمكن تشغيله بالتوازي، وترفع وقت التطبيق. والأخطر، أن depends_on على وحدة يجبر كل مورد داخل تلك الوحدة على الانتظار — حتى الموارد التي لا علاقة منطقية لها بالتبعية. أضف الحواف الصريحة فقط عندما يعجز Terraform فعلاً عن استنتاج الترتيب من المراجع وحدها.
نمط فشل إنتاجي: مصادر بيانات قديمة
تُعاد تقييم مصادر البيانات في كل plan وapply. إذا تغيّر الكائن المصدر بين تطبيقَيْن — مثلاً دوّر فريق الأمان شهادة ACM، أو غيّر فريق المنصة تخصيصات CIDR لـ VPC — فإن تخطيطك التالي سيرى القيمة الجديدة. هذا صحيح في الغالب، لكنه قد يُسبّب مفاجآت: معرف صورة جديد يُعيده most_recent = true سيجبر على استبدال كل نسخة EC2 تُشير إليه. في الإنتاج، ثبّت معرفات الصور بإضافة name_regex يلتقط مستوى رقعة محدداً، أو استخدم filter على وسم image-id الذي تضعه خطوط أنابيب الصور الذهبية. لا تستخدم أبداً most_recent = true على الصور في الإنتاج دون خطة رجوع مُختبَرة.
في الدرس التالي، ستستكشف الوسيطات التعريفية — count وfor_each وlifecycle — التي تتيح لك التعبير عن التكرار وسياسات دورة حياة الموارد داخل كتلة واحدة، مُزيلاً التكرار على نطاق واسع.