مختبر: تكوين التوسع التلقائي
هدف المختبر
تصميم وتكوين حل توسع تلقائي كامل لتطبيق ويب مع أنماط حركة مرور متغيرة.
الجزء 1: السيناريو
السياق
NewsPortal هو موقع أخبار يشهد ارتفاعات غير متوقعة في حركة المرور أثناء الأخبار العاجلة. تريد الفريق التقني أتمتة التوسع من أجل:
- الحفاظ على الأداء أثناء الذروات
- تقليل التكاليف خلال الأوقات الهادئة
بيانات حركة المرور
┌─────────────────────────────────────────────────────────────┐
│ أنماط حركة المرور لـ NewsPortal │
├─────────────────────────────────────────────────────────────┤
│ │
│ يوم عادي │
│ ─────────────── │
│ │
│ الزوار ▲ │
│ │ ┌────┐ │
│ 50,000 ─┤ ┌┘ └┐ │
│ │ ┌┘ └┐ ┌──┐ │
│ 30,000 ─┤ ┌──┘ └──────┘ └┐ │
│ │ ┌──┘ └──┐ │
│ 10,000 ─┤──┘ └── │
│ │ │
│ └─────┬─────┬─────┬─────┬─────┬─────► ساعة │
│ 6h 9h 12h 18h 21h │
│ │
│ أخبار عاجلة (غير متوقعة) │
│ ─────────────────────────── │
│ │
│ الزوار ▲ │
│ │ ▲ ذروة مفاجئة x10 │
│ 200,000 ─┤ ╱╲ │
│ │ ╱ ╲ │
│ 100,000 ─┤ ╱ ╲ │
│ │ ╱ ╲ │
│ 20,000 ─┤──────╱ ╲────────── │
│ │ │
│ └─────────────────────────────────► وقت │
│ │
└─────────────────────────────────────────────────────────────┘
المتطلبات
| الجانب | المتطلب |
|---|---|
| التوافر | 99.9% |
| زمن الاستجابة | < 500ms (P95) |
| السعة الدنيا | 5,000 زائر/دقيقة |
| السعة القصوى | 200,000 زائر/دقيقة |
| الميزانية | تحسين التكاليف خارج الذروات |
الجزء 2: تمارين التصميم
تمرين 2.1: تحديد الحجم
مع العلم أن t3.medium يمكنها معالجة 500 طلب/ثانية، احسب:
| السؤال | إجابتك |
|---|---|
| الحد الأدنى من المثيلات (عادي) | ؟ |
| المثيلات للذروة x10 | ؟ |
| الحد الأدنى الموصى به لـ HA | ؟ |
| الحد الأقصى الموصى به | ؟ |
💡 الحل
حركة المرور العادية: 50,000 زائر/دقيقة = 833 طلب/ثانية
المثيلات اللازمة: 833 / 500 = 2 مثيلات
حركة المرور في الذروة x10: 200,000 زائر/دقيقة = 3,333 طلب/ثانية
المثيلات اللازمة: 3,333 / 500 = 7 مثيلات (تقريب)
الحد الأدنى الموصى به: 2 (HA Multi-AZ)
الحد الأقصى الموصى به: 10 (هامش أمان)
المرغوب الأولي: 2
تمرين 2.2: اختيار السياسة
ما هي السياسة/السياسات التي توصي بها ولماذا؟
| السياسة | مناسبة؟ | التبرير |
|---|---|---|
| Target Tracking CPU | ؟ | ؟ |
| Target Tracking Requests | ؟ | ؟ |
| Scheduled | ؟ | ؟ |
| Step Scaling | ؟ | ؟ |
💡 الحل
| السياسة | مناسبة؟ | التبرير |
|---|---|---|
| Target Tracking CPU | ⚠️ جزئي | مفيد لكن CPU ليس دائمًا مرتبطًا بالطلبات |
| Target Tracking Requests | ✅ نعم | مرتبط مباشرة بحركة مرور المستخدم |
| Scheduled | ⚠️ جزئي | أنماط اليوم/الليل متوقعة، لكن ليس الأخبار العاجلة |
| Step Scaling | ✅ نعم | استجابة سريعة للذروات المفاجئة |
التوصية: دمج Target Tracking (requests) + Scheduled (base)
تمرين 2.3: تكوين Launch Template
أكمل تكوين Launch Template:
# Launch Template Configuration
LaunchTemplateName: newsportal-lt
# لإكمال:
AMI: _______________
InstanceType: _______________
SecurityGroupIds:
- _______________
KeyName: _______________
UserData: |
#!/bin/bash
_______________
_______________
_______________
💡 الحل
LaunchTemplateName: newsportal-lt
AMI: ami-0123456789 (Amazon Linux 2, مهيأ مسبقًا)
InstanceType: t3.medium
SecurityGroupIds:
- sg-web-servers
KeyName: newsportal-key
UserData: |
#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
# أو نشر التطبيق عبر CodeDeploy
aws s3 cp s3://newsportal-deploy/latest.tar.gz /tmp/
tar -xzf /tmp/latest.tar.gz -C /var/www/html/
تمرين 2.4: تكوين ASG
أكمل تكوين Auto Scaling Group:
AutoScalingGroupName: newsportal-asg
# السعة
MinSize: ___
MaxSize: ___
DesiredCapacity: ___
# الشبكة (2 AZ على الأقل)
VPCZoneIdentifier:
- _______________
- _______________
# الفحوصات الصحية
HealthCheckType: _______________
HealthCheckGracePeriod: ___
# مجموعة الهدف
TargetGroupARNs:
- _______________
💡 الحل
AutoScalingGroupName: newsportal-asg
MinSize: 2
MaxSize: 10
DesiredCapacity: 2
VPCZoneIdentifier:
- subnet-private-az-a
- subnet-private-az-b
HealthCheckType: ELB # استخدام الفحوصات الصحية لـ ALB
HealthCheckGracePeriod: 300 # 5 دقائق لبدء التطبيق
TargetGroupARNs:
- arn:aws:elasticloadbalancing:...:targetgroup/newsportal-tg/xxx
الجزء 3: تكوين السياسات
تمرين 3.1: Target Tracking
أنشئ سياسة Target Tracking للحفاظ على 1000 طلب لكل هدف:
# أكمل الأمر
aws autoscaling put-scaling-policy \
--auto-scaling-group-name newsportal-asg \
--policy-name _______________ \
--policy-type _______________ \
--target-tracking-configuration '{
"TargetValue": ___,
"PredefinedMetricSpecification": {
"PredefinedMetricType": "_______________",
"ResourceLabel": "app/newsportal-alb/xxx/targetgroup/newsportal-tg/yyy"
},
"ScaleOutCooldown": ___,
"ScaleInCooldown": ___
}'
💡 الحل
aws autoscaling put-scaling-policy \
--auto-scaling-group-name newsportal-asg \
--policy-name request-target-tracking \
--policy-type TargetTrackingScaling \
--target-tracking-configuration '{
"TargetValue": 1000.0,
"PredefinedMetricSpecification": {
"PredefinedMetricType": "ALBRequestCountPerTarget",
"ResourceLabel": "app/newsportal-alb/xxx/targetgroup/newsportal-tg/yyy"
},
"ScaleOutCooldown": 60,
"ScaleInCooldown": 300
}'
تمرين 3.2: Scheduled Scaling
قم بتكوين التوسع المجدول لأنماط اليوم/الليل:
# Morning scale up (8h UTC, Lun-Ven)
aws autoscaling put-scheduled-update-group-action \
--auto-scaling-group-name newsportal-asg \
--scheduled-action-name _______________ \
--recurrence "_______________ " \
--min-size ___ \
--max-size ___
# Evening scale down (22h UTC, tous les jours)
aws autoscaling put-scheduled-update-group-action \
--auto-scaling-group-name newsportal-asg \
--scheduled-action-name _______________ \
--recurrence "_______________" \
--min-size ___ \
--max-size ___
💡 الحل
# Morning scale up (8h UTC, Lun-Ven)
aws autoscaling put-scheduled-update-group-action \
--auto-scaling-group-name newsportal-asg \
--scheduled-action-name morning-scale-up \
--recurrence "0 8 * * MON-FRI" \
--min-size 3 \
--max-size 10
# Evening scale down (22h UTC, tous les jours)
aws autoscaling put-scheduled-update-group-action \
--auto-scaling-group-name newsportal-asg \
--scheduled-action-name evening-scale-down \
--recurrence "0 22 * * *" \
--min-size 2 \
--max-size 5
الجزء 4: المراقبة والتنبيهات
تمرين 4.1: لوحة معلومات CloudWatch
قم بتحديد المقاييس الأساسية للمراقبة:
| المقياس | Namespace | عتبة التنبيه |
|---|---|---|
| ؟ | AWS/EC2 | ؟ |
| ؟ | AWS/ApplicationELB | ؟ |
| ؟ | AWS/AutoScaling | ؟ |
| ؟ | Custom | ؟ |
💡 الحل
| المقياس | Namespace | عتبة التنبيه |
|---|---|---|
| CPUUtilization | AWS/EC2 | > 80% |
| TargetResponseTime | AWS/ApplicationELB | > 500ms |
| RequestCount | AWS/ApplicationELB | info only |
| HealthyHostCount | AWS/ApplicationELB | < 2 |
| GroupDesiredCapacity | AWS/AutoScaling | info only |
| GroupInServiceInstances | AWS/AutoScaling | < min |
| HTTPCode_Target_5XX_Count | AWS/ApplicationELB | > 10/min |
تمرين 4.2: تنبيه التوسع
قم بإنشاء تنبيه SNS للإخطار عند حدوث أحداث التوسع:
# 1. إنشاء موضوع SNS
aws sns create-topic --name _______________
# 2. الاشتراك عبر البريد الإلكتروني
aws sns subscribe \
--topic-arn arn:aws:sns:...:_______________ \
--protocol email \
--notification-endpoint _______________
# 3. تكوين إشعارات ASG
aws autoscaling put-notification-configuration \
--auto-scaling-group-name newsportal-asg \
--topic-arn arn:aws:sns:...:_______________ \
--notification-types \
"autoscaling:EC2_INSTANCE_LAUNCH" \
"autoscaling:EC2_INSTANCE_TERMINATE" \
"_______________"
💡 الحل
# 1. إنشاء موضوع SNS
aws sns create-topic --name newsportal-scaling-alerts
# 2. الاشتراك عبر البريد الإلكتروني
aws sns subscribe \
--topic-arn arn:aws:sns:us-east-1:123456789:newsportal-scaling-alerts \
--protocol email \
--notification-endpoint ops@newsportal.com
# 3. تكوين إشعارات ASG
aws autoscaling put-notification-configuration \
--auto-scaling-group-name newsportal-asg \
--topic-arn arn:aws:sns:us-east-1:123456789:newsportal-scaling-alerts \
--notification-types \
"autoscaling:EC2_INSTANCE_LAUNCH" \
"autoscaling:EC2_INSTANCE_TERMINATE" \
"autoscaling:EC2_INSTANCE_LAUNCH_ERROR"
الجزء 5: اختبارات التحقق
خطة الاختبار
| الاختبار | الطريقة | النتيجة المتوقعة |
|---|---|---|
| Scale Out | توليد حمل | مثيلات جديدة في < 5 دقائق |
| Scale In | إيقاف الحمل | تقليل بعد فترة التهدئة |
| Failover | إنهاء مثيل | استبدال تلقائي |
| Health Check | إيقاف التطبيق | مثيل معلم كغير صحي |
سكريبت اختبار الحمل
#!/bin/bash
# test-load.sh - محاكاة ذروة حركة المرور
ALB_DNS="newsportal-alb-xxx.region.elb.amazonaws.com"
DURATION=300 # 5 دقائق
CONCURRENCY=100
echo "بدء اختبار الحمل..."
echo "URL: http://$ALB_DNS"
echo "المدة: $DURATION ثانية"
echo "التزامن: $CONCURRENCY"
# استخدام Apache Bench أو hey
hey -z ${DURATION}s -c $CONCURRENCY http://$ALB_DNS/
echo "انتهى الاختبار. تحقق من CloudWatch و ASG."
قائمة التحقق من التحقق
┌─────────────────────────────────────────────────────────────┐
│ قائمة التحقق من التحقق │
├─────────────────────────────────────────────────────────────┤
│ │
│ ☐ يعمل التوسع الخارجي (مثيلات جديدة) │
│ ☐ يعمل التوسع الداخلي (مثيلات منتهية) │
│ ☐ فحوصات الصحة ALB تكتشف الأعطال │
│ ☐ استبدال المثيلات غير الصحية تلقائيًا │
│ ☐ تلقي إشعارات SNS │
│ ☐ المقاييس مرئية في CloudWatch │
│ ☐ احترام الإجراءات المجدولة │
│ ☐ الحفاظ على زمن الاستجابة < 500ms تحت الحمل │
│ │
└─────────────────────────────────────────────────────────────┘
التسليم النهائي
الوثيقة المطلوب إنتاجها
- هندسة التوسع التلقائي (مخطط)
- التكوين الكامل (Launch Template + ASG)
- سياسات التوسع (Target Tracking + Scheduled)
- خطة المراقبة (المقاييس + التنبيهات)
- نتائج الاختبارات (لقطات شاشة CloudWatch)
معايير التقييم
| المعيار | النقاط |
|---|---|
| تحديد الحجم الصحيح | /15 |
| تكوين ASG الكامل | /25 |
| السياسات المناسبة للسيناريو | /20 |
| المراقبة والتنبيهات | /15 |
| الاختبارات الموثقة | /15 |
| جودة الوثيقة | /10 |
| المجموع | /100 |
الأسبوع التالي: MODULE 10 - Route 53