انتقل إلى المحتوى الرئيسي

مختبر: نشر خدمة ويب

هدف المختبر​

في هذا المختبر، ستقوم بتصميم وتوثيق نشر خدمة ويب كاملة على AWS. ستقوم بتحليل الخيارات المختلفة للهندسة المعمارية وإنتاج خطة نشر.

Format du Lab

هذا المختبر يركز على التصميم والتوثيق. ستستخدم أوامر CLI لمحاكاة مع LocalStack إذا كان متاحًا.

السياق​

أنت مكلف بنشر تطبيق BlogPro، وهي منصة تدوين للشركات.

المتطلبات الوظيفية​

┌─────────────────────────────────────────────────────────────┐
│ متطلبات BlogPro │
├─────────────────────────────────────────────────────────────┤
│ │
│ التطبيق │
│ • موقع ويب يمكن الوصول إليه عبر HTTPS │
│ • API backend (Node.js أو Python) │
│ • قاعدة بيانات MySQL │
│ • تخزين الصور (S3) │
│ │
│ الأداء │
│ • زمن الاستجابة < 500ms │
│ • دعم 1000 مستخدم متزامن │
│ │
│ التوافر │
│ • 99.9% uptime (حوالي 8 ساعات تعطل/سنة كحد أقصى) │
│ • عدم وجود تعطل أثناء النشر │
│ │
│ الأمان │
│ • شهادة SSL/TLS │
│ • قاعدة البيانات غير متاحة من الإنترنت │
│ • الامتثال لأفضل ممارسات AWS │
│ │
│ الميزانية │
│ • حوالي $200-300/شهر │
│ │
└─────────────────────────────────────────────────────────────┘

الجزء 1: تصميم الهندسة المعمارية​

تمرين 1.1: اختيار الهندسة المعمارية​

حلل الخيارات الثلاثة التالية واختر الأفضل لـ BlogPro:

الخيار A: هندسة بسيطة

Internet → IGW → EC2 (public) → RDS (private)

الخيار B: هندسة مع ALB

Internet → IGW → ALB → EC2 (private) → RDS (private)

الخيار C: هندسة بدون خادم

Internet → CloudFront → API Gateway → Lambda → RDS/DynamoDB

تحليلك:

المعيارالخيار Aالخيار Bالخيار C
التكلفة المقدرة؟؟؟
التوافر العالي؟؟؟
القابلية للتوسع؟؟؟
التعقيد؟؟؟
مناسب لـ BlogPro؟؟؟؟
💡 الحل المقترح
المعيارالخيار Aالخيار Bالخيار C
التكلفة المقدرة~$50/شهر~$200/شهرمتغير
التوافر العالي❌ لا✅ نعم✅ نعم
القابلية للتوسع❌ محدودة✅ جيدة✅✅ ممتازة
التعقيد⭐ بسيط⭐⭐ متوسط⭐⭐⭐ معقد
مناسب لـ BlogPro؟❌✅❌ (مبالغة في الهندسة)

التوصية: الخيار B

  • يلبي متطلبات التوافر العالي والأداء
  • التكلفة ضمن الميزانية
  • تعقيد معقول للفريق

تمرين 1.2: مخطط الهندسة المعمارية​

ارسم الهندسة المعمارية الكاملة مع جميع المكونات:

القالب:

┌─────────────────────────────────────────────────────────────────────────┐
│ الهندسة المعمارية لـ BlogPro │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ الإنترنت │
│ │ │
│ [مخططك هنا] │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
💡 مخطط الحل
┌─────────────────────────────────────────────────────────────────────────┐
│ الهندسة المعمارية لـ BlogPro │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ المستخدمون / الإنترنت │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Route 53 │ blog.example.com │
│ └────────┬────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ CloudFront │ CDN + SSL │
│ └────────┬────────┘ │
│ │ │
│ ┌─────────────────────────┼─────────────────────────────────┐ │
│ │ VPC │ (10.0.0.0/16) │ │
│ │ │ │ │
│ │ ┌──────────▼──────────┐ │ │
│ │ │ IGW │ │ │
│ │ └──────────┬──────────┘ │ │
│ │ │ │ │
│ │ ┌─────────────────────┼─────────────────────────┐ │ │
│ │ │ الشبكات الفرعية العامة │ │ │ │
│ │ │ │ │ │ │
│ │ │ ┌─────────┐ ┌─────▼─────┐ ┌─────────┐ │ │ │
│ │ │ │ NAT GW │ │ ALB │ │ NAT GW │ │ │ │
│ │ │ │ 1a │ │ │ │ 1b │ │ │ │
│ │ │ └────┬────┘ └─────┬─────┘ └────┬────┘ │ │ │
│ │ └───────┼─────────────┼─────────────┼──────────┘ │ │
│ │ │ │ │ │ │
│ │ ┌───────┼─────────────┼─────────────┼──────────┐ │ │
│ │ │ الشبكات الفرعية الخاصة │ │ │ │
│ │ │ │ ┌────┴────┐ │ │ │ │
│ │ │ ┌────────▼────┤ ├────▼────────┐ │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ │ ┌───────┐ │ │ ┌───────┐ │ │ │ │
│ │ │ │ │ EC2 │ │ │ │ EC2 │ │ │ │ │
│ │ │ │ │ App 1 │ │ │ │ App 2 │ │ │ │ │
│ │ │ │ └───┬───┘ │ │ └───┬───┘ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ └──────┼──────┘ └──────┼──────┘ │ │ │
│ │ └─────────┼───────────────────────┼───────────┘ │ │
│ │ │ │ │ │
│ │ ┌─────────┼───────────────────────┼───────────┐ │ │
│ │ │ الشبكات الفرعية لقاعدة البيانات │ │ │ │
│ │ │ │ ┌──────────────────┘ │ │ │
│ │ │ │ │ │ │ │
│ │ │ ┌────▼────▼────┐ │ │ │
│ │ │ │ RDS │ │ │ │
│ │ │ │ Multi-AZ │ │ │ │
│ │ │ │ MySQL │ │ │ │
│ │ │ └──────────────┘ │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ S3 Bucket │ │ │
│ │ │ (الصور/الأصول) │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────────────┘

الجزء 2: خطة عنونة IP​

تمرين 2.1: تحديد CIDR​

أكمل خطة العنونة:

الموردCIDRIPs القابلة للاستخدامالاستخدام
VPC10.0.0.0/1665,531-
الشبكة الفرعية العامة 1a؟؟ALB, NAT
الشبكة الفرعية العامة 1b؟؟ALB, NAT
الشبكة الفرعية الخاصة 1a؟؟خوادم التطبيقات
الشبكة الفرعية الخاصة 1b؟؟خوادم التطبيقات
الشبكة الفرعية لقاعدة البيانات 1a؟؟RDS
الشبكة الفرعية لقاعدة البيانات 1b؟؟RDS
💡 الحل
الموردCIDRIPs القابلة للاستخدامالاستخدام
VPC10.0.0.0/1665,531-
الشبكة الفرعية العامة 1a10.0.1.0/24251ALB, NAT
الشبكة الفرعية العامة 1b10.0.2.0/24251ALB, NAT
الشبكة الفرعية الخاصة 1a10.0.11.0/24251خوادم التطبيقات
الشبكة الفرعية الخاصة 1b10.0.12.0/24251خوادم التطبيقات
الشبكة الفرعية لقاعدة البيانات 1a10.0.21.0/24251RDS
الشبكة الفرعية لقاعدة البيانات 1b10.0.22.0/24251RDS

الجزء 3: إعدادات الأمان​

تمرين 3.1: مجموعات الأمان​

حدد القواعد لكل مجموعة أمان:

sg-alb :

Inbound:
- النوع: ؟، المنفذ: ؟، المصدر: ؟

Outbound:
- النوع: ؟، المنفذ: ؟، الوجهة: ؟

sg-app :

Inbound:
- النوع: ؟، المنفذ: ؟، المصدر: ؟

Outbound:
- النوع: ؟، المنفذ: ؟، الوجهة: ؟
- النوع: ؟، المنفذ: ؟، الوجهة: ؟

sg-db :

Inbound:
- النوع: ؟، المنفذ: ؟، المصدر: ؟

Outbound:
- النوع: ؟، المنفذ: ؟، الوجهة: ؟
💡 الحل

sg-alb :

Inbound:
- النوع: HTTPS، المنفذ: 443، المصدر: 0.0.0.0/0
- النوع: HTTP، المنفذ: 80، المصدر: 0.0.0.0/0 (إعادة توجيه إلى HTTPS)

Outbound:
- النوع: HTTP، المنفذ: 80، الوجهة: sg-app

sg-app :

Inbound:
- النوع: HTTP، المنفذ: 80، المصدر: sg-alb
- النوع: SSH، المنفذ: 22، المصدر: sg-bastion (أو IP المسؤول)

Outbound:
- النوع: MySQL، المنفذ: 3306، الوجهة: sg-db
- النوع: HTTPS، المنفذ: 443، الوجهة: 0.0.0.0/0 (APIs، التحديثات)

sg-db :

Inbound:
- النوع: MySQL، المنفذ: 3306، المصدر: sg-app

Outbound:
- (لا توجد قاعدة صريحة ضرورية - stateful)

الجزء 4: خطة التحقق​

تمرين 4.1: اختبارات End-to-End​

قم بإدراج الاختبارات التي يجب إجراؤها للتحقق من النشر:

الاختبارالأمر/الإجراءالنتيجة المتوقعة
حل DNS؟؟
الوصول إلى HTTPS؟؟
فحص الصحة؟؟
اتصال DB؟؟
تجاوز AZ؟؟
💡 الحل
الاختبارالأمر/الإجراءالنتيجة المتوقعة
حل DNSnslookup blog.example.comيعيد IP ALB
الوصول إلى HTTPScurl -I https://blog.example.comHTTP 200 OK
فحص الصحةcurl https://blog.example.com/healthstatus: healthy
اتصال DBسجل التطبيقDatabase connected
تجاوز AZإيقاف مثيل AZ-aالموقع لا يزال متاحًا
موازنة التحميلعدة طلباتردود من المثيلين
شهادة SSLفحص المتصفحشهادة صالحة

الجزء 5: التوثيق​

المنتج النهائي​

قم بإنتاج وثيقة تحتوي على:

  1. مخطط الهندسة المعمارية (مع جميع المكونات)

  2. جدول عنونة IP

  3. مصفوفة مجموعات الأمان

  4. خطة اختبارات التحقق

  5. تقدير التكاليف:

الخدمةالتكوينالتكلفة الشهرية
EC2 (x2)t3.medium~$60
RDSdb.t3.small Multi-AZ~$50
ALB+ نقل البيانات~$30
NAT Gateway (x2)+ البيانات~$70
Route 531 hosted zone~$1
الإجمالي~$211/شهر
  1. المخاطر المحددة وطرق التخفيف

معايير التقييم​

المعيارالنقاط
الهندسة المعمارية الصحيحة والكاملة/25
خطة العنونة المتسقة/15
مجموعات الأمان المكونة بشكل جيد/20
اختبارات التحقق ذات الصلة/15
تقدير التكاليف الواقعي/10
جودة التوثيق/15
الإجمالي/100

مكافأة: سكريبت النشر​

إذا كان لديك وصول إلى LocalStack، اختبر هذه الأوامر:

#!/bin/bash
# deploy-blogpro.sh

ENDPOINT="--endpoint-url=http://localhost:4566"

# 1. إنشاء VPC
VPC_ID=$(aws $ENDPOINT ec2 create-vpc \
--cidr-block 10.0.0.0/16 \
--query 'Vpc.VpcId' --output text)
echo "VPC تم إنشاؤه: $VPC_ID"

# 2. إنشاء الشبكات الفرعية العامة
SUBNET_PUB_1A=$(aws $ENDPOINT ec2 create-subnet \
--vpc-id $VPC_ID \
--cidr-block 10.0.1.0/24 \
--availability-zone us-east-1a \
--query 'Subnet.SubnetId' --output text)
echo "الشبكة الفرعية العامة 1a: $SUBNET_PUB_1A"

# ... استمر مع الموارد الأخرى

القسم التالي: الاختبارات والتحقق