مختبر: نشر خدمة ويب
هدف المختبر
في هذا المختبر، ستقوم بتصميم وتوثيق نشر خدمة ويب كاملة على AWS. ستقوم بتحليل الخيارات المختلفة للهندسة المعمارية وإنتاج خطة نشر.
هذا المختبر يركز على التصميم والتوثيق. ستستخدم أوامر 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
أكمل خطة العنونة:
| المورد | CIDR | IPs القابلة للاستخدام | الاستخدام |
|---|---|---|---|
| VPC | 10.0.0.0/16 | 65,531 | - |
| الشبكة الفرعية العامة 1a | ؟ | ؟ | ALB, NAT |
| الشبكة الفرعية العامة 1b | ؟ | ؟ | ALB, NAT |
| الشبكة الفرعية الخاصة 1a | ؟ | ؟ | خوادم التطبيقات |
| الشبكة الفرعية الخاصة 1b | ؟ | ؟ | خوادم التطبيقات |
| الشبكة الفرعية لقاعدة البيانات 1a | ؟ | ؟ | RDS |
| الشبكة الفرعية لقاعدة البيانات 1b | ؟ | ؟ | RDS |
💡 الحل
| المورد | CIDR | IPs القابلة للاستخدام | الاستخدام |
|---|---|---|---|
| VPC | 10.0.0.0/16 | 65,531 | - |
| الشبكة الفرعية العامة 1a | 10.0.1.0/24 | 251 | ALB, NAT |
| الشبكة الفرعية العامة 1b | 10.0.2.0/24 | 251 | ALB, NAT |
| الشبكة الفرعية الخاصة 1a | 10.0.11.0/24 | 251 | خوادم التطبيقات |
| الشبكة الفرعية الخاصة 1b | 10.0.12.0/24 | 251 | خوادم التطبيقات |
| الشبكة الفرعية لقاعدة البيانات 1a | 10.0.21.0/24 | 251 | RDS |
| الشبكة الفرعية لقاعدة البيانات 1b | 10.0.22.0/24 | 251 | RDS |
الجزء 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 | ؟ | ؟ |
💡 الحل
| الاختبار | الأمر/الإجراء | النتيجة المتوقعة |
|---|---|---|
| حل DNS | nslookup blog.example.com | يعيد IP ALB |
| الوصول إلى HTTPS | curl -I https://blog.example.com | HTTP 200 OK |
| فحص الصحة | curl https://blog.example.com/health | status: healthy |
| اتصال DB | سجل التطبيق | Database connected |
| تجاوز AZ | إيقاف مثيل AZ-a | الموقع لا يزال متاحًا |
| موازنة التحميل | عدة طلبات | ردود من المثيلين |
| شهادة SSL | فحص المتصفح | شهادة صالحة |
الجزء 5: التوثيق
المنتج النهائي
قم بإنتاج وثيقة تحتوي على:
-
مخطط الهندسة المعمارية (مع جميع المكونات)
-
جدول عنونة IP
-
مصفوفة مجموعات الأمان
-
خطة اختبارات التحقق
-
تقدير التكاليف:
| الخدمة | التكوين | التكلفة الشهرية |
|---|---|---|
| EC2 (x2) | t3.medium | ~$60 |
| RDS | db.t3.small Multi-AZ | ~$50 |
| ALB | + نقل البيانات | ~$30 |
| NAT Gateway (x2) | + البيانات | ~$70 |
| Route 53 | 1 hosted zone | ~$1 |
| الإجمالي | ~$211/شهر |
- المخاطر المحددة وطرق التخفيف
معايير التقييم
| المعيار | النقاط |
|---|---|
| الهندسة المعمارية الصحيحة والكاملة | /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"
# ... استمر مع الموارد الأخرى
القسم التالي: الاختبارات والتحقق