الجزء 7 من سلسلة تعلّم AWS من الصفر

التوسّع التلقائي وبناء تطبيق كامل

خل AWS تزيد السيرفرات وقت الضغط وتنقصها وقت الهدوء وتستبدل المعطّل منها، ثم اجمع كل اللي تعلمته في تصميم تطبيق كامل يتحمل الأعطال، وشوف كيف يختصره Elastic Beanstalk.

في هذا المقال
  1. مجموعة التوسّع التلقائي (ASG)
  2. متى تزيد ومتى تنقص؟
  3. عملي: شوف المجموعة تكبر وتعالج نفسها
  4. نجمع القطع: تطبيق كامل
  5. Elastic Beanstalk: الطريق المختصر
  6. الخلاصة
  7. اختبر نفسك

في الجزء السادس وزّعنا الزوار على سيرفرين، وشفنا الموقع يكمل لو تعطّل واحد. بس بقيت مشكلتين: السيرفر المعطّل يبقى معطّل لين تتدخل بنفسك، وعدد السيرفرات ثابت مهما زاد الضغط أو قل.

موقع متجر مثلاً، زواره في الليل غير زواره وقت العروض. لو جهزت سيرفرات لأعلى ضغط، تدفع على سيرفرات فاضية أغلب الوقت. ولو جهزت أقل، يوقف الموقع في أهم لحظة. الحل: مجموعة التوسّع التلقائي.

مجموعة التوسّع التلقائي (ASG)

Auto Scaling Group تدير مجموعة سيرفرات بدالك. تعطيها وصفة وثلاثة أرقام، وهي تتكفّل بالباقي:

الرقم معناه مثال
Minimum أقل عدد مهما هدأ الضغط 2، سيرفر في كل منطقة توفر
Desired العدد المطلوب الحين، ويتغيّر حسب الضغط 2
Maximum السقف، وهو اللي يحمي فاتورتك 6

وهي توزّع السيرفرات على مناطق التوفر، وتسجّلها في موزّع الحمل تلقائياً، وتستبدل أي سيرفر معطّل. الخدمة نفسها مجانية، وتدفع على السيرفرات فقط.

قالب التشغيل (Launch Template)

عشان تقدر تشغّل سيرفرات لحالها، تحتاج وصفة: صورة النظام، ونوع السيرفر، ومجموعة الأمان، ودور IAM، وUser Data. كل اللي اخترته بيدك في الجزء الثالث يصير محفوظ في قالب.

هنا تبان فايدة صور AMI الجاهزة: كل ما قام السيرفر أسرع، زادت سرعة استجابة المجموعة للضغط.

فحص الصحة: لا تنسَ هذا الخيار

افتراضياً، المجموعة تفحص السيرفر نفسه فقط. فلو السيرفر شغّال لكن التطبيق داخله واقف، ما تستبدله. فعّل خيار ELB health checks عشان تعتمد على فحص موزّع الحمل، فيُستبدل السيرفر لما يتعطّل التطبيق نفسه.

متى تزيد ومتى تنقص؟

السياسة كيف تعمل تناسب
Target tracking تحدد هدف، مثل متوسط المعالج 50%، وهي تضبط العدد أغلب الحالات، ابدأ بها
Step scaling تحدد خطوات: إذا تجاوز 70% زد سيرفر، وإذا تجاوز 90% زد ثلاثة تحكم أدق
Scheduled زيادة في وقت تحدده مسبقاً ضغط معروف، مثل عرض يبدأ الساعة 8
Predictive تتوقع الضغط من تاريخك وتجهّز قبله ضغط يتكرر بنمط يومي أو أسبوعي

والمقياس اللي تختاره مهم. المعالج بداية جيدة، لكن لمواقع الويب غالباً عدد الطلبات لكل سيرفر (RequestCountPerTarget) أصدق، لأنه يعبّر عن الزوار مباشرة.

وعشان تعطي السيرفرات الجديدة وقت تأثر على الأرقام، سياسات Target Tracking وStep تنتظر فترة Instance Warmup. ولو ما حددتها، تستخدم فترة التهدئة الافتراضية 300 ثانية.

مجموعة Auto Scaling توسّع السيرفرات. ولو عند تطبيقك كمان خدمات ECS أو جداول DynamoDB أو نسخ Aurora، فخدمة AWS Auto Scaling تقدر تدير خطة توسع لها كلها في مكان واحد.

عملي: شوف المجموعة تكبر وتعالج نفسها

بنكمل على موزّع الحمل والـ Target Group من الجزء السادس.

  1. القالب: من EC2 افتح Launch Templates ثم Create launch template. سمّه web-template، واختر Amazon Linux 2023 وt3.micro ومجموعة أمان السيرفرات، والصق User Data من الجزء الثالث.
  2. المجموعة: من Auto Scaling Groups أنشئ web-asg من هذا القالب، واختر شبكتين فرعيتين في منطقتي توفر مختلفتين.
  3. الموزّع: اختر Attach to an existing load balancer، وحدد الـ Target Group، وفعّل ELB health checks.
  4. الأرقام: Desired 1 وMinimum 1 وMaximum 3.
  5. السياسة: اختر Target tracking على متوسط المعالج بهدف 40%.

ادخل على السيرفر من EC2 Instance Connect، وولّد ضغط على المعالج. وسيرفر t3.micro فيه معالجين افتراضيين، فنشغّل عمليتين:

Bash
yes > /dev/null &
yes > /dev/null &

وبعد دقائق، شوف وش صار من CloudShell:

Bash
# وش سوّت المجموعة ولماذا
aws autoscaling describe-scaling-activities \
  --auto-scaling-group-name web-asg --max-items 5 \
  --query "Activities[].[StatusCode,Description]" --output table

# السيرفرات الحالية ومناطقها وحالتها
aws autoscaling describe-auto-scaling-groups \
  --auto-scaling-group-names web-asg \
  --query "AutoScalingGroups[0].Instances[].[InstanceId,AvailabilityZone,HealthStatus]" \
  --output table

بتشوف سيرفرات جديدة تقوم وتدخل الموزّع بدون ما تلمس شي. أوقف الضغط، وبعد حوالي ربع ساعة تنقص المجموعة لحالها:

Bash
pkill yes

والآن الجزء الممتع: احذف سيرفر بنفسك وشوف وش يصير:

Bash
aws ec2 terminate-instances --instance-ids i-0123456789abcdef0

المجموعة تلاحظ إن العدد نقص عن المطلوب، وتشغّل بديل خلال دقائق. هذا تطبيق يعالج نفسه.

نجمع القطع: تطبيق كامل

الحين عندك كل قطع طبقة الخوادم. هذا التصميم الشائع لتطبيق ويب يتحمل الأعطال:

الزوار موزّع الحمل (ALB) مجموعة التوسّع التلقائي (ASG): تتمدد عبر منطقتي توفر سيرفرات منطقة توفر A سيرفرات منطقة توفر B قاعدة البيانات النسخة الأساسية الكاش والملفات المشتركة خارج السيرفرات
الزوار يصلون للموزّع، وهو يوزّعهم على سيرفرات في منطقتي توفر تديرها مجموعة التوسّع، والبيانات تعيش خارج السيرفرات.

القاعدة الأهم: السيرفر قابل للاستبدال

في هذا التصميم، أي سيرفر ممكن يختفي بأي لحظة: يحذفه التوسّع التلقائي، أو تستبدله المجموعة، أو تسترجعه Spot. عشان كذا ما يبقى عليه شي مهم. وهذا اللي يسمونه تطبيق عديم الحالة (Stateless). فكل نوع بيانات له مكانه خارج السيرفر:

البيانات لو خليتها على السيرفر المكان الصحيح
جلسات المستخدمين يخرج المستخدم لما يتغيّر سيرفره كاش مشترك مثل ElastiCache
الملفات المرفوعة تظهر عند سيرفر وتختفي عند غيره S3 أو EFS
البيانات الأساسية تضيع مع السيرفر قاعدة بيانات مُدارة مثل RDS
الصور والملفات الثابتة حمل زايد على السيرفرات S3 مع CloudFront

بعض هذي الخدمات ما وصلناها بعد، وبنغطيها في الأقسام الجاية. المهم الحين الفكرة: لما تصمم أي شي، اسأل "وش يصير لو اختفى هذا السيرفر الحين؟". لو الجواب "ولا شي"، فأنت على الطريق الصح.

ونفس الفكرة توصلك لـ البنية غير القابلة للتعديل (Immutable Infrastructure): ما تحدّث سيرفر شغال. تبني صورة جديدة، وتحطها في Launch Template جديد، وتخلي Instance Refresh يستبدل سيرفرات المجموعة بالتدريج. فكل سيرفر يطابق اللي اختبرته، والرجوع يعني ترجع للصورة السابقة.

التكلفة في هذا التصميم

  • غطّ الحد الأدنى بخطة توفير، فهو شغّال طول الوقت.
  • خل الزيادات On-Demand أو Spot.
  • راجع الحد الأدنى كل فترة، وكثير يبالغون فيه.

Elastic Beanstalk: الطريق المختصر

تجميع كل هذا بيدك شغل. Elastic Beanstalk يسويه عنك: ترفع الكود وتختار اللغة، وهو ينشئ الموزّع ومجموعة التوسّع والسيرفرات والمراقبة. والخدمة نفسها مجانية، وتدفع على الموارد اللي تنشئها.

  • بيئتين شائعتين: سيرفر واحد للتطوير بتكلفة قليلة، أو عدة سيرفرات خلف موزّع للإنتاج.
  • نوعين من الطبقات: Web Server للطلبات المباشرة، وWorker لمعالجة المهام من طابور.
  • الموارد عادية وظاهرة: تشوفها في حسابك وتقدر تعدّلها، ما هي صندوق مغلق.

يناسبك لو تبي تركز على الكود في تطبيق تقليدي. أما لو عندك متطلبات خاصة أو أنظمة كثيرة، فغالباً تبني بنفسك، أو تروح للحاويات اللي بنشرحها في الجزء العشرين.

الخلاصة

  • ASG تحافظ على عدد السيرفرات بين حد أدنى وأعلى، وتستبدل المعطّل، وتتكامل مع الموزّع.
  • Launch Template وصفة السيرفر، وصورة AMI الجاهزة تسرّع الاستجابة.
  • فعّل ELB health checks عشان يُستبدل السيرفر لما يتعطّل التطبيق نفسه.
  • ابدأ بسياسة Target tracking، واختر المقياس اللي يعبّر عن الضغط فعلاً.
  • خل السيرفرات عديمة الحالة: أي شي مهم يعيش خارجها.

اختبر نفسك

قبل ما تكمل، جرّب هذي الأسئلة عشان تتأكد إنك فهمت الجزء. كل سؤال موقف عملي، وبعد ما تجاوب يطلع لك الشرح.

السؤال 1 من 7

تطبيق طاح على سيرفر في مجموعة Auto Scaling. السيرفر لسا شغال، وموزع الحمل يعلّمه غير سليم، بس المجموعة ما تستبدله. وش لازم يتغير؟

اعرض الجواب

الجواب الصحيح: A

افتراضياً، المجموعة تطالع حالة السيرفر نفسه فقط، وهي سليمة هنا. ومع تفعيل ELB Health Checks، تعتبر السيرفر اللي يبلغ عنه موزع الحمل غير سليم وتستبدله.

  • B: هذا يسمح بسيرفرات أكثر، بس ما يستبدل الفاشل.
  • C: الإجراءات المجدولة تغير السعة في أوقات محددة، وما تطالع الصحة.
  • D: القالب يحدد كيف تشتغل السيرفرات، والمجموعة ما تشوف سبب تشغل واحد.

للمراجعة: فحص الصحة في هذا الجزء، وHealth checks for instances in an Auto Scaling group في وثائق AWS.

السؤال 2 من 7

متجر عنده عرض يبدأ كل جمعة الساعة 8 مساءً بالضبط. الزيارات تقفز خلال دقايق، والسيرفرات الجديدة تحتاج ست دقايق عشان تجهز. كيف تكون السيرفرات جاهزة قبل الزحمة؟

اعرض الجواب

الجواب الصحيح: C

الوقت معروف مسبقاً، فارفع السعة قبله، وخل سياسة Target Tracking تتكفل بأي زيادة بعدها.

  • A: هذا يتفاعل بعد وصول الحمل، فالسيرفرات تجهز متأخرة ست دقايق.
  • B: الحد الأقصى سقف فقط، وما يشغّل سيرفرات لحاله.
  • D: هذا برضو يتفاعل بعد وصول الحمل، حتى مع خطوات أدق.

للمراجعة: متى تزيد ومتى تنقص؟ في هذا الجزء، وScheduled scaling في وثائق AWS.

السؤال 3 من 7

تطبيق ويب يقضي أغلب وقت كل طلب ينتظر API خارجي، فالمعالج يبقى قريب من 20% حتى لما تتكدس الطلبات. وسياسة Target Tracking على المعالج ما تضيف سيرفرات في الوقت المناسب. وش لازم تتابع السياسة بدله؟

اعرض الجواب

الجواب الصحيح: D

المعالج ما يعكس الحمل في هذا التطبيق. والطلبات لكل سيرفر تقيس الزوار مباشرة، وهي مقياس جاهز.

  • A: المعالج لسا ما يتبع الطلبات، والمجموعة بتشغل سيرفرات أكثر من اللازم وقت الهدوء.
  • B: القرص مو اللي يحد هذا التطبيق.
  • C: هذا نتيجة التوسع، مو مقياس للحمل.

للمراجعة: متى تزيد ومتى تنقص؟ في هذا الجزء، وTarget tracking policies في وثائق AWS.

السؤال 4 من 7

تطبيق يحفظ ملفات المستخدمين المرفوعة على القرص المحلي لكل سيرفر. ولما تشيل مجموعة Auto Scaling سيرفر، تختفي ملفاته نهائياً. وش يسوي الفريق؟

اعرض الجواب

الجواب الصحيح: B

أي سيرفر في المجموعة ممكن يختفي في أي لحظة، فما لازم يبقى عليه شي مهم. وفي S3 الملف متاح لكل السيرفرات، مهما صار لأي واحد منها.

  • A: المجموعة تخسر توفير التصغير، والسيرفر الفاشل لسا ياخذ ملفاته معه.
  • C: بتدير اللقطات بنفسك، وممكن تخسر حتى ساعة من الملفات.
  • D: هذا برضو يمنع التصغير، وما يحمي الملفات من سيرفر فاشل.

للمراجعة: القاعدة الأهم: السيرفر قابل للاستبدال في هذا الجزء، وMake services stateless في إطار Well-Architected.

السؤال 5 من 7

فريق صغير عنده تطبيق ويب تقليدي بـ Python. يبي يرفع الكود وينجهز له موزع الحمل ومجموعة Auto Scaling والمراقبة، ويقدر يشوف هذي الموارد ويعدلها. أي خدمة تناسب أكثر؟

اعرض الجواب

الجواب الصحيح: C

Elastic Beanstalk ينشئ هذي الموارد من كودك، وتبقى ظاهرة في حسابك. والخدمة نفسها مجانية، وتدفع على اللي تنشئه.

  • A: Kubernetes يحتاج تعلم وتشغيل أكثر بكثير مما يحتاجه هذا الفريق.
  • B: هذا يوسع السيرفرات، بس لسا بتبني الباقي بنفسك.
  • D: السيرفر الواحد ما فيه موزع حمل ولا توسع ولا حماية من الأعطال.

للمراجعة: Elastic Beanstalk في هذا الجزء، وWhat is AWS Elastic Beanstalk? في وثائق AWS.

السؤال 6 من 7

فريق يحدّث سيرفرات مجموعة Auto Scaling بالدخول على كل واحد. ومع الوقت صارت السيرفرات مختلفة عن بعض، والرجوع عن تحديث سيئ صعب. وش يحل الاثنين؟

اعرض الجواب

الجواب الصحيح: D

هذي البنية غير القابلة للتعديل: ما يتغير شي على سيرفر شغال. كل السيرفرات من نفس الصورة المختبرة، والرجوع يعني ترجع للصورة السابقة.

  • A: هذا أسرع، بس السيرفرات لسا تتغير وهي شغالة وممكن تختلف.
  • B: هذا يساعد ترجّع سيرفر واحد، وما يخليهم متطابقين.
  • C: حجم السيرفر ما له علاقة بالتحديثات.

للمراجعة: القاعدة الأهم: السيرفر قابل للاستبدال في هذا الجزء، وUse an instance refresh to update instances in an Auto Scaling group في وثائق AWS.

السؤال 7 من 7

تطبيق يستخدم مجموعة Auto Scaling وخدمات ECS وجداول DynamoDB ونسخ Aurora. والفريق يبي يضبط التوسع لها كلها من مكان واحد. وش يناسب؟

اعرض الجواب

الجواب الصحيح: A

الـ Scaling Plan يقدر يدير سعة كل هذي الموارد في مكان واحد.

  • B: هذا يوسّع سيرفرات المجموعة بس.
  • C: هذا يجهز بيئة تطبيق ويديرها، وما يجمع الخدمات والجداول والنسخ الموجودة في خطة وحدة.
  • D: هذا يغير حجم المجموعة بس، في أوقات تحددها.

للمراجعة: متى تزيد ومتى تنقص؟ في هذا الجزء، وWhat is a scaling plan? في وثائق AWS.

بهذا نكمل قسم التوفر العالي. السؤال اللي بقى: وين تعيش البيانات لما تكون خارج السيرفر؟ هذا موضوع القسم الجاي، ونبدأه في الجزء الثامن بقواعد البيانات المُدارة RDS وAurora.