يجمع هذا الدرس الختامي كل الأنماط التي تعلمناها في هذا الفصل في منصة مرجعية واحدة جاهزة للإنتاج. ستصمم تخطيط المستودع، وتربط الحالة البعيدة بحواجز ترقية بين البيئات، وتكتب مكتبة وحدات قابلة لإعادة الاستخدام، وتوصّل خط أنابيب CI يشغّل fmt وvalidate وplan وapply المحمية بموافقة — تلقائيًا في بيئة dev، ويدويًا في staging وproduction. في نهاية هذا الدرس ستمتلك مخططًا يمكنك نسخه وتشغيله في أي شركة.
تخطيط المستودع
تعيش كل البنية التحتية في مستودع واحد. الأدوات (Terragrunt، وملف Makefile بسيط، ومكتبة وحدات مشتركة) تبقيها DRY. الفصل الرئيسي هو البيئة أولًا، ثم الطبقة ثانيًا — وهو عكس التخطيط البسيط الذي يضع الوحدات أولًا، والذي يميل إلى تسريب مراجع الحالة بين البيئات.
يركّز ملف terragrunt.hcl الجذري إعدادات خلفية S3 وجدول قفل DynamoDB بحيث لا تحدد أي مجموعة اسم الحاوية مباشرة. تُعيَّن البيئات إلى حسابات AWS منفصلة — وليس إلى workspaces — لأن حدود IAM على مستوى الحساب هي الضمان الوحيد لحدود التأثير الذي ينجو من بيانات اعتماد مُسرَّبة.
إعداد Terragrunt الجذري
يقرأ الملف الجذري ملف env.hcl من كل مجلد بيئة، ويحقن معرّف الحساب، ويولّد مفتاح حالة فريد لكل مجموعة. كل ملف terragrunt.hcl فرعي يرث هذا عبر find_in_parent_folders().
لا تستخدم Terraform workspaces لفصل البيئات في الإنتاج. تتشارك Workspaces جذرًا واحدًا في حاوية الخلفية وإعداد مزود واحد. مرجع terraform.workspace المُعطَّأ يطبّق كود dev على حالة prod بصمت. النموذج الآمن الوحيد قابل للتدقيق هو حسابات AWS منفصلة مع أدوار IAM منفصلة.
معمارية متعددة البيئات
خط أنابيب الترقية بين ثلاثة حسابات: dev يُطبَّق تلقائيًا؛ staging وproduction يتطلبان حوابز موافقة بشرية.
خط أنابيب CI/CD
يُشغَّل سير عمل plan.yml عند كل طلب سحب (PR) ويشغّل terragrunt run-all plan مقتصرًا على المجموعات التي تغيّرت ملفاتها فقط، باستخدام تصفية مسارات git diff. يُشغَّل سير عمل apply.yml عند الدمج في الفرع main. يُطبَّق dev فورًا؛ أما staging وprod فلكل منهما بيئة GitHub Actions مع مراجعين مطلوبين مُعيَّنين في إعدادات المستودع — لا يلمس Terraform تلك الحسابات أبدًا بدون موافقة إنسان مُسمَّى على مخرجات الخطة.
استخدم OIDC بدلًا من مفاتيح الوصول الثابتة. صلاحية id-token: write مع configure-aws-credentials وrole-to-assume تعني أن GitHub Actions يتولّى دور IAM عبر رموز قصيرة الأجل. لا شيء في Secrets يحتاج إلى تدوير أو يمكن تسريبه. كل مزودي السحابة الرئيسيين يدعمون تفويض OIDC مع GitHub Actions.
المجموعة الفرعية: طبقة EKS (مثال dev)
كل ملف terragrunt.hcl فرعي صغير — يحدد فقط مصدر الوحدة وإصدارها المُثبَّت والمدخلات الخاصة بالبيئة. تتدفق البيانات عبر الطبقات من خلال كتل dependency التي تستدعي terraform output على الحالة البعيدة لمجموعة الشبكة، محافظةً على فصل الطبقات بدون معرّفات موارد مُرمَّزة بشكل ثابت.
تُثبَّت الوحدات بوسم Git (?ref=v1.4.2). سير عمل الترقية هو: تحديث الوسم في dev → تشغيل plan → تطبيق dev → مراجعة PR → تحديث وسم staging → تطبيق staging → توقيع شخصَيْن → تحديث وسم prod → تطبيق prod. هذا يعني أن dev يشغّل دائمًا أحدث إصدار من الوحدة، وتليه staging خلال ساعات، وتليها production خلال أيام — مع تحقق بشري من فروق الخطة عند كل حاجز.
لا تُثبّت مصدر الوحدة على فرع أو على ?ref=main. إذا تقدّم الفرع بينما الخطة تنتظر الموافقة، فإن التطبيق ينفّذ كودًا مختلفًا عما أظهرته الخطة. دائمًا ثبّت على وسم ثابت أو SHA لا يتغير. فرّض ذلك بسياسة Conftest OPA ترفض أي source لا يطابق ?ref=v*.
كشف الانحراف كوظيفة مجدولة
التغييرات اليدوية أو عبر Console تُباعد production عن الحالة المُعلَنة بصمت. أضف سير عمل كشف انحراف ليلي يشغّل terragrunt run-all plan --detailed-exitcode على جميع مجموعات prod ويرسل تنبيه Slack عند إعادة كود الخروج 2 (تغييرات مكتشفة). هذا هو الغراء التشغيلي الذي يجعل GitOps للبنية التحتية قابلًا للتطبيق فعليًا.
# .github/workflows/drift.yml (مقتطف)
on:
schedule:
- cron: '0 6 * * *' # 06:00 UTC يوميًا
jobs:
drift-check:
runs-on: ubuntu-latest
environment: production
steps:
- uses: actions/checkout@v4
- name: Drift check — prod
id: plan
working-directory: live/prod
run: |
terragrunt run-all plan --terragrunt-non-interactive \
--detailed-exitcode 2>&1 | tee plan.out
echo "exit_code=$?" >> $GITHUB_OUTPUT
continue-on-error: true
- name: Alert on drift
if: steps.plan.outputs.exit_code == '2'
run: |
curl -s -X POST ${{ secrets.SLACK_WEBHOOK }} \
-H "Content-Type: application/json" \
-d '{"text":"*تم كشف انحراف* في بنية الإنتاج. راجع مخرجات الخطة في GitHub Actions."}'
ما الذي بنيته
بتجميع هذا كله، أصبح لديك منصة حيث: كل تغيير بنية تحتية هو PR؛ حدود التأثير لأي تطبيق واحد محدودة بعزل الطبقات؛ البيئات تُعيَّن لحسابات AWS منفصلة بأدوار IAM منفصلة؛ OIDC يلغي بيانات الاعتماد الثابتة من CI؛ إصدارات الوحدات ثابتة ومُرقَّاة بشكل صريح؛ السياسة ككود ترفض الأنماط السيئة قبل أن تصل إلى plan؛ والانحراف يظهر تلقائيًا لا بصمت. هذا هو خط الأساس التشغيلي الذي تتوقعه المنظمات الهندسية الناضجة من مهندس DevOps كبير من أول يوم عمل.
ترتيب البوت العملي لمنصة جديدة: (1) أنشئ ثلاثة حسابات AWS ضمن AWS Organization. (2) أنشئ حاوية حالة S3 وجدول قفل DynamoDB في كل حساب بسكريبت bootstrap. (3) أعدّ موفّري هوية OIDC في كل حساب. (4) ادفع تخطيط المستودع وهيّئ GitHub Environments مع المراجعين. (5) طبّق طبقة الشبكة في dev أولًا — فهي الأساس الذي يقرأ منه كل شيء آخر. (6) أضف طبقتَي eks وrds فوقها. (7) رقّ إلى staging ثم prod. يستغرق التهيئة الكاملة مع مهندس خبير يومين تقريبًا؛ التغييرات التدريجية بعد ذلك آمنة وقابلة للتدقيق إلى أجل غير مسمى.
نستخدم ملفات تعريف الارتباط لتشغيل هذا الموقع وتحليل الزيارات وعرض إعلانات مخصّصة. يمكنك قبول كل ملفات تعريف الارتباط أو رفض غير الأساسية منها.
سياسة الخصوصية