Terraform / الموديولات والدورة الواعية بالحالة / الدرس 10
ضوابط الدورة والاستبدال
افهم حدود الدورة ولماذا لا تضمن الإتاحة والتعافي والحماية المطلقة.
في هذه الصفحة
أهداف الدرس
- اشرح محفز الاستبدال وترتيبه ومنع الحذف وتجاهل التغيير.
- راجع قيود المزود والحصص والتفرد والملكية المشتركة.
يأتي معنى الاستبدال من عقد المورد
قد يفسر المزود تغيير الحقل تحديثاً في موضعه أو استبدالاً أو انتقالاً غير مدعوم. تؤثر خيارات الدورة بسلوك Terraform المدعوم ولا تعيد قواعد API. حدد الهوية والبيانات والاعتماد والتسمية والتوقف قبل تعديلها. قد يسهل تعايش النسختين لمورد مؤقت ويستحيل باسم فريد أو حصة ناقصة لآخر. لذلك تعد كتلة الدورة قرار تصميم مراجعاً لا مفتاح موثوقية عاماً.
افصل تغير البيانات عن قصد الاستبدال
يقدم terraform_data فرقاً صريحاً: يحمل input بيانات، وتحمل triggers_replace قيماً يطلب تغيرها استبدال النسخة. يستخدم المثبت مراجعة اصطناعية وترتيب إنشاء قبل الحذف دون خدمة خارجية أو تنفيذ. يجب أن يدعم المورد الحقيقي تعايش القديم والجديد حيث يلزم. لا يثبت المثال انعدام التوقف أو جاهزية البديل أو نقلاً آمناً للبيانات الدائمة.
terraform {
required_version = ">= 1.16.0, < 1.17.0"
}
variable "revision" {
type = string
default = "release-a"
}
resource "terraform_data" "release" {
input = { revision = var.revision }
triggers_replace = [var.revision]
lifecycle {
create_before_destroy = true
}
}
يغير تعديل revision محفز هذا المورد وفق عقده، ولا يعمم على كل حقل. يطلب الخيار ترتيباً لا فحص جاهزية، ولم تنشأ حالة أو تتغير.
تنطبق الحماية ضمن نطاقها الموثق فقط
يرفض prevent_destroy مقترح تدمير النسخة مع وجود الإعداد المعني. إزالة التصريح تزيل الحماية أيضاً، فلا تعوض صلاحيات خارجية أو نسخاً أو مراجعة. قد يدعم ignore_changes مشاركة مدروسة لبعض الخصائص أو يخفي انجرافاً مهماً؛ ولا ينشئ ملكية مشتركة آمنة أو يمنع كل حذف. وثق مالك كل حقل متجاهل وكيفية رصده ومطابقته.
نمذج قاعدة محفز واحدة دون اتصال
يقارن النموذج سجلات مؤلفة وفق قاعدة تعليمية تفصل تغير input عن محفز الاستبدال. لا تستنتج منها أفعال كل المزودين أو منطق الخطة ورسمها وتاريخها. اربط الناتج بالعقد وافحص الأفعال الحقيقية بالطريق المعتمد. لا يعني اسم مرتب مثل update أن العملية قابلة للعكس أو خالية من أثر خدمة.
def action(old, new):
if old['trigger'] != new['trigger']:
return 'replace'
return 'update' if old['input'] != new['input'] else 'no-op'
old = {'input': 'blue', 'trigger': 'v1'}
print('input_change=' + action(old, {'input': 'green', 'trigger': 'v1'}))
print('trigger_change=' + action(old, {'input': 'blue', 'trigger': 'v2'}))
input_change=update
trigger_change=replace
تعيد القاعدة update للمدخل وحده و replace للمحفز. لا يُفحص مزود أو خطة أو حالة، وتخرج الإتاحة والبيانات عن المقارنة.
تشمل مراجعة الدورة الاعتماد والتعافي
قد ينتشر ترتيب الدورة عبر الاعتماد فيؤثر الانتقال كله لا كتلة معزولة. افحص الحصص والتفرد وتسليم الحركة والجاهزية وهجرة البيانات والفشل الجزئي. لا تستخدم ignore_changes=all لإسكات الخطة دون ملكية مقصودة ومراجعة. احفظ الحالة والسجلات عند فشل البديل؛ فعكس النص أو تعطيل الحماية لا يعيد الواقع السابق أو يجعل الإعادة آمنة تلقائياً.
الأخطاء الشائعة وإصلاحها
Instance cannot be destroyed.
- لماذا يحدث؟
- يتعارض المقترح مع منع الحذف.
- كيف تصلحه؟
- راجع الانتقال والتصريح لا تزل الحماية عشوائياً.
- كيف تتجنب تكراره؟
- اجعل الاستثناء قراراً مراجعاً.
يفشل الإنشاء قبل الحذف لتفرد أو قيد حصة.
- لماذا يحدث؟
- لا يسمح النظام بتعايش النسختين.
- كيف تصلحه؟
- اختر تسمية وسعة وتسليماً مدعومة.
- كيف تتجنب تكراره؟
- اختبر القيود قبل وعد الإتاحة.
يختفي انجراف مهم من المراجعة.
- لماذا يحدث؟
- تجاوز التجاهل ملكية مشتركة محددة.
- كيف تصلحه؟
- ضيق الحقول وحدد الرصد والمطابقة.
- كيف تتجنب تكراره؟
- راجع الحقول وملاكها كعقد مستمر.
اختبر فهمك
1. هل يضمن إنشاء البديل عدم انقطاع التطبيق؟
اعرض الحل المشروح
لا؛ يخص الترتيب. تختلف الجاهزية والتوجيه والتفرد والحصة والاعتماد والبيانات. افحص الانتقال والفشل لا تحول الخيار لوعد إتاحة.
2. لماذا لا يكون حذف كتلة محمية استراتيجية نسخ؟
اعرض الحل المشروح
تزول الحماية مع الكتلة، وتحتاج النسخة بيانات محفوظة واستعادة مختبرة. يختلف الحد؛ فاحفظ الملكية واتبع الدورة والتعافي لا خياراً أزيل.
أهم ما تعلمته
- تقيد الدورة انتقالات معينة ولا تعوض معنى المورد.
- احم الهوية والبيانات والإتاحة والتعافي كمتطلبات مستقلة.