مختبر: سيناريوهات استكشاف الأخطاء وإصلاحها في EC2
أهداف المختبر
هذا المختبر يضعك أمام سيناريوهات أعطال واقعية. لكل سيناريو، يجب عليك:
- تحليل الأعراض
- صياغة الفرضيات
- اقتراح اختبارات تشخيصية
- تحديد الحل
هذا المختبر هو تمرين تحليلي. لا حاجة للوصول إلى AWS - اعمل على الورق أو الوثيقة.
المدة المقدرة
من 1.5 إلى 2 ساعة
السيناريو 1: الموقع الإلكتروني غير متاح
السياق
الوضع:
- تم إطلاق مثيل EC2 منذ ساعة
- AMI: Amazon Linux 2023
- النوع: t3.micro
- تم تثبيت Apache وتشغيله
- يمكنك الاتصال عبر SSH
- لكن http://52.1.2.3 لا يستجيب (انتهاء المهلة)
التكوين الحالي:
- VPC: vpc-default
- الشبكة الفرعية: عامة (مع IGW)
- مجموعة الأمان: sg-web
المعلومات المتاحة
حالة المثيل: يعمل
فحوصات الحالة: 2/2 ناجحة
مجموعة الأمان sg-web:
قواعد الوارد:
- SSH (22): 0.0.0.0/0
- HTTP (80): 10.0.0.0/8
قواعد الصادر:
- كل الحركة: 0.0.0.0/0
الأسئلة
-
ما هو العرض الدقيق؟
-
اذكر 3 فرضيات بترتيب الاحتمالية
-
ما هو السبب الأكثر احتمالاً؟
-
ما هي الأمر/الإجراء الذي يصحح المشكلة؟
-
كيف تتحقق من أن المشكلة قد حُلت؟
📋 عرض الحل
1. العرض: انتهاء مهلة HTTP نحو 52.1.2.3 المنفذ 80، بينما يعمل SSH.
2. الفرضيات:
- مجموعة الأمان لا تسمح بـ HTTP من الإنترنت (عالية)
- Apache لا يستمع على المنفذ الصحيح (متوسطة)
- جدار الحماية iptables على المثيل (منخفضة)
3. السبب: مجموعة الأمان تسمح بـ HTTP (المنفذ 80) فقط من 10.0.0.0/8 (شبكة خاصة)، وليس من الإنترنت (0.0.0.0/0).
4. التصحيح:
aws ec2 authorize-security-group-ingress \
--group-id sg-web \
--protocol tcp \
--port 80 \
--cidr 0.0.0.0/0
5. التحقق:
curl http://52.1.2.3
# أو
افتح http://52.1.2.3 في متصفح
السيناريو 2: SSH غير ممكن
السياق
الوضع:
- تم إطلاق مثيل جديد
- قمت بتنزيل المفتاح .pem
- المثيل: يعمل، فحوصات الحالة OK
- IP العامة: 52.2.3.4
الأمر المنفذ:
$ ssh -i cle.pem ec2-user@52.2.3.4
ssh: connect to host 52.2.3.4 port 22: Connection timed out
المعلومات المتاحة
تفاصيل المثيل:
- ID: i-0123456789
- الحالة: يعمل
- IP العامة: 52.2.3.4
- الشبكة الفرعية: subnet-abc123 (10.0.2.0/24)
- مجموعة الأمان: sg-default
مجموعة الأمان sg-default:
قواعد الوارد:
- (لا توجد قواعد)
قواعد الصادر:
- كل الحركة: 0.0.0.0/0
الشبكة الفرعية subnet-abc123:
- جدول التوجيه: rtb-main
- التوجيهات:
- 10.0.0.0/16 → محلي
- (لا توجد توجيهات أخرى)
الأسئلة
-
حدد جميع المشاكل في هذا التكوين
-
رتبها حسب أولوية التصحيح
-
اقترح الأوامر لتصحيح كل مشكلة
📋 عرض الحل
1. المشاكل المحددة:
المشكلة أ - مجموعة الأمان: لا توجد قواعد واردة = المنفذ 22 محظور
المشكلة ب - جدول التوجيه: لا توجد توجيه نحو بوابة الإنترنت = لا يوجد وصول للإنترنت
2. الأولوية:
- جدول التوجيه (بدون توجيه، حتى مع SG OK، لن يعمل)
- مجموعة الأمان
3. التصحيحات:
# 1. إنشاء/إرفاق بوابة إنترنت (إذا لم يتم ذلك)
aws ec2 create-internet-gateway
aws ec2 attach-internet-gateway --vpc-id vpc-xxx --internet-gateway-id igw-xxx
# 2. إضافة التوجيه نحو IGW
aws ec2 create-route \
--route-table-id rtb-main \
--destination-cidr-block 0.0.0.0/0 \
--gateway-id igw-xxx
# 3. إضافة قاعدة SSH إلى مجموعة الأمان
aws ec2 authorize-security-group-ingress \
--group-id sg-default \
--protocol tcp \
--port 22 \
--cidr 0.0.0.0/0
السيناريو 3: المثيل الذي ينتهي فوراً
السياق
الوضع:
- تقوم بإطلاق مثيل
- ينتقل من "pending" إلى "running" ثم "terminated"
- كل ذلك في أقل من 30 ثانية
- حاولت 3 مرات، نفس النتيجة
التكوين:
- AMI: ami-custom-xyz (AMI مخصص)
- النوع: t3.large
- المنطقة: us-east-1
المعلومات المتاحة
وحدة التحكم EC2 → سبب انتقال الحالة:
"Client.VolumeLimitExceeded: Volume limit exceeded"
أحجام EBS الحالية لديك:
- 45 حجم كل منها 100 جيجابايت
- الإجمالي: 4.5 تيرابايت
AMI الخاص بك ami-custom-xyz:
- تم إنشاؤه منذ 6 أشهر
- حجم الجذر: 200 جيجابايت
- يستخدم اللقطة snap-olddata
الأسئلة
-
ما هو سبب الإنهاء؟
-
كيف تتحقق من حدود حسابك؟
-
ما هي الحلول الممكنة؟ (على الأقل 3)
📋 عرض الحل
1. السبب: الرسالة "Volume limit exceeded" تشير إلى أنك وصلت إلى حصة تخزين EBS لحسابك.
2. التحقق من الحدود:
aws service-quotas get-service-quota \
--service-code ebs \
--quota-code L-D18FCD1D
# أو عبر وحدة التحكم:
# Service Quotas → Amazon Elastic Block Store (EBS)
3. الحلول:
الحل أ - حذف الأحجام غير المستخدمة:
# قائمة الأحجام غير المرفقة
aws ec2 describe-volumes \
--filters "Name=status,Values=available"
# حذف
aws ec2 delete-volume --volume-id vol-xxx
الحل ب - طلب زيادة الحصة:
aws service-quotas request-service-quota-increase \
--service-code ebs \
--quota-code L-D18FCD1D \
--desired-value 10000
الحل ج - استخدام منطقة أخرى: الحصص حسب المنطقة. إطلاق في eu-west-1 على سبيل المثال.
الحل د - استخدام نوع مثيل مع تخزين المثيل: بعض المثيلات لديها تخزين محلي، وليس EBS.
السيناريو 4: قاعدة البيانات غير قابلة للوصول
السياق
الهيكلية:
- مثيل ويب (شبكة فرعية عامة): 10.0.1.10
- مثيل قاعدة البيانات (شبكة فرعية خاصة): 10.0.2.20
- كلاهما في نفس VPC
المشكلة:
- من مثيل الويب، لا يمكن الاتصال بـ MySQL
- telnet 10.0.2.20 3306 → انتهاء المهلة
مثيل قاعدة البيانات يعمل:
- فحوصات الحالة OK
- MySQL يعمل (تم التحقق عبر مدير الجلسة)
المعلومات المتاحة
مجموعة الأمان sg-web (مثيل الويب):
الوارد: HTTP 80، SSH 22
الصادر: كل الحركة 0.0.0.0/0
مجموعة الأمان sg-database (مثيل قاعدة البيانات):
الوارد: MySQL (3306) من 0.0.0.0/0
الصادر: كل الحركة 0.0.0.0/0
NACL للشبكة الفرعية الخاصة (nacl-private):
قواعد الوارد:
القاعدة 100: DENY TCP 3306 من 0.0.0.0/0
القاعدة 200: ALLOW ALL من 0.0.0.0/0
قواعد الصادر:
القاعدة 100: ALLOW ALL إلى 0.0.0.0/0
الأسئلة
-
لماذا تفشل الاتصال؟
-
اشرح لماذا لا تكفي قاعدة مجموعة الأمان
-
كيف تصحح المشكلة؟
📋 عرض الحل
1. السبب: NACL يحظر المنفذ 3306 بقاعدة DENY (القاعدة 100) التي يتم تقييمها قبل قاعدة ALLOW (القاعدة 200).
2. التفسير:
- يتم تقييم مجموعات الأمان معًا (جميع القواعد)
- يتم تقييم NACLs بترتيب أرقام القواعد
- القاعدة 100 (DENY 3306) يتم تقييمها قبل القاعدة 200 (ALLOW ALL)
- لذا يتم حظر المنفذ 3306 رغم SG
3. التصحيح: حذف أو تعديل القاعدة 100 من NACL:
# الخيار أ: حذف القاعدة DENY
aws ec2 delete-network-acl-entry \
--network-acl-id nacl-private \
--rule-number 100 \
--ingress
# الخيار ب: تعديل للسماح من الشبكة الفرعية للويب
aws ec2 replace-network-acl-entry \
--network-acl-id nacl-private \
--rule-number 100 \
--protocol tcp \
--port-range From=3306,To=3306 \
--cidr-block 10.0.1.0/24 \
--rule-action allow \
--ingress
السيناريو 5: رفض الإذن (تحدي)
السياق
الوضع:
- مثيل Amazon Linux 2023 تم إطلاقه بمفتاح "ma-cle"
- ملف ma-cle.pem موجود على جهازك
- إذن الملف: 400 (OK)
الأمر:
$ ssh -i ma-cle.pem ec2-user@52.5.6.7
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
الاختبارات المنفذة:
- مجموعة الأمان: المنفذ 22 مفتوح نحو 0.0.0.0/0
- المثيل: يعمل، الحالة OK
- Ping: يعمل
المعلومات الإضافية
لديك ملفان مفتاح في مجلدك:
- ma-cle.pem (تم إنشاؤه أمس)
- ma-cle.pem.bak (تم إنشاؤه الأسبوع الماضي)
تم إطلاق المثيل الأسبوع الماضي.
الأسئلة
-
ما هو السبب المحتمل؟
-
كيف تتحقق من فرضيتك؟
-
ما هي الخيارات لاستعادة الوصول؟
📋 عرض الحل
1. السبب المحتمل: أنت تستخدم المفتاح الخاطئ. الملف "ma-cle.pem" الحالي (تم إنشاؤه أمس) ليس المفتاح الذي تم ربطه بالمثيل (تم إطلاقه الأسبوع الماضي).
2. التحقق:
# انظر أي مفتاح مرتبط بالمثيل
aws ec2 describe-instances --instance-ids i-xxx \
--query 'Reservations[].Instances[].KeyName'
# قارن بصمة مفتاحك
ssh-keygen -l -f ma-cle.pem
ssh-keygen -l -f ma-cle.pem.bak
3. خيارات الاستعادة:
الخيار أ - استخدام المفتاح الصحيح:
ssh -i ma-cle.pem.bak ec2-user@52.5.6.7
الخيار ب - EC2 Instance Connect (إذا كانت AMI متوافقة): وحدة التحكم → المثيل → اتصال → EC2 Instance Connect
الخيار ج - Systems Manager Session Manager: إذا كان وكيل SSM مثبتًا ودور IAM مكونًا.
الخيار د - إنشاء AMI وإعادة الإطلاق:
- إنشاء AMI من المثيل
- إطلاق مثيل جديد بمفتاح جديد
- تركيب حجم المثيل القديم
- تعديل ~/.ssh/authorized_keys
مخرجات المختبر
تقرير استكشاف الأخطاء وإصلاحها (لـ 2 سيناريو من اختيارك)
لكل سيناريو مختار، وثق:
# السيناريو X: [العنوان]
## 1. العرض المحدد
[وصف دقيق]
## 2. الفرضيات المصاغة
1. [الفرضية 1] - الاحتمالية: عالية/متوسطة/منخفضة
2. [الفرضية 2]
3. [الفرضية 3]
## 3. اختبارات التشخيص
- الاختبار 1: [الأمر/الإجراء] → النتيجة المتوقعة
- الاختبار 2: [الأمر/الإجراء] → النتيجة المتوقعة
## 4. السبب الجذري
[تفسير السبب الحقيقي]
## 5. الحل
[الأوامر أو الإجراءات للتصحيح]
## 6. التحقق
[كيف تتحقق من أن المشكلة قد حُلت]
## 7. الوقاية
[كيف تتجنب هذه المشكلة في المستقبل]
جدول التقييم
| المعيار | النقاط |
|---|---|
| العرض محدد جيدًا | 2 |
| فرضيات ذات صلة ومرتبة | 3 |
| اختبارات التشخيص صحيحة | 3 |
| السبب الجذري محدد | 3 |
| الحل صحيح | 3 |
| التحقق المقترح | 2 |
| الوضوح والبنية | 2 |
| المجموع لكل سيناريو | 18 |
تهانينا! لقد أكملت مختبر استكشاف الأخطاء وإصلاحها في EC2.