شبكات AWS والهوية

التعمق في موازنة الحمل المرنة على AWS

18 دقيقة الدرس 4 من 28

التعمق في موازنة الحمل المرنة على AWS

تُعدّ خدمة AWS Elastic Load Balancing (ELB) البوابة الأمامية لحركة المرور في كل نظام إنتاجي تقريبًا على AWS. تستقبل اتصالات العملاء، وتُجري فحوصات صحة على الأهداف، وتوزّع الطلبات عبر مجموعة من الخوادم — كل ذلك دون أن تُدير أي خادم موازنة بنفسك. على نطاق الشركات الكبرى، لا يُعدّ ELB مجرد ميزة ملائمة، بل هو المكوّن الذي يُتيح النشر دون توقف، ويستوعب ارتفاعات حركة المرور، ويوفر الخط الأول لإنهاء اتصالات TLS. إن فهم آليات عمله الداخلية أمر ضروري لكل مهندس AWS جاد.

ALB مقابل NLB: اختيار الأداة الصحيحة

توفر AWS نوعين رئيسيين من موازنات الأحمال. يعمل Application Load Balancer (ALB) عند الطبقة السابعة من نموذج OSI (HTTP/HTTPS/gRPC). يقرأ طلب HTTP بالكامل — المسار، والرؤوس، واسم المضيف، ومعاملات الاستعلام — ويوجّه حركة المرور بناءً على محتوى الطلب. أما Network Load Balancer (NLB) فيعمل عند الطبقة الرابعة (TCP/UDP/TLS). يوجّه بناءً على عنوان IP والمنفذ، دون أي إدراك لمحتوى طبقة التطبيق.

  • استخدم ALB حين تحتاج إلى توجيه مستند إلى اسم المضيف أو المسار، أو دعم WebSocket، أو gRPC، أو الجلسات الثابتة، أو تكامل WAF، أو مصادقة Cognito، أو أهداف Lambda. هذا هو الخيار الافتراضي للتطبيقات الويب والخدمات المصغّرة.
  • استخدم NLB حين تحتاج إلى زمن استجابة منخفض جدًا (تمرير اتصالات بمستوى الميكروثانية)، أو عناوين IP ثابتة (يوفر NLB عنوان IP مرن واحد لكل منطقة توافر)، أو تمرير TCP للمصادقة المتبادلة عبر TLS، أو البروتوكولات غير المعتمدة على HTTP كـ MQTT أو TCP مخصص أو UDP عالي الحجم.
الفارق الجوهري — معالجة الاتصالات: يُنهي ALB دائمًا اتصال TCP عند موازن الأحمال ثم يفتح اتصالًا جديدًا مع الهدف. أما NLB في وضع TCP فيمرّر الاتصال مباشرةً إلى الهدف؛ ويرى الهدف عنوان IP الحقيقي للعميل بشكل أصلي دون الحاجة إلى ترويسة X-Forwarded-For. أما مع ALB فيجب تفعيل Proxy Protocol v2 أو قراءة ترويسة X-Forwarded-For على الهدف للحصول على عنوان IP الحقيقي للعميل.

مجموعات الأهداف

مجموعة الأهداف (Target Group) هي تجمّع الوجهات الذي يوجّه إليه قاعدة المستمع حركة المرور. يمكن أن تكون الأهداف نُسخ EC2، أو مهام ECS (بعنوان IP)، أو دوال Lambda، أو موازنات أحمال أخرى (نمط ALB خلف NLB). تمتلك كل مجموعة أهداف إعداد فحص صحة مستقل: البروتوكول، والمسار، والمنفذ، وعتبة الاتزان الصحي، وعتبة عدم الاتزان، والفاصل الزمني.

سمات مجموعة الأهداف المهمة في الإنتاج:

  • تأخير إلغاء التسجيل (الافتراضي 300 ثانية): المدة التي يواصل فيها ELB إرسال الطلبات الجارية إلى هدف يجري إلغاء تسجيله. خلال عمليات النشر المتدحرج، اخفض هذه القيمة إلى 30–60 ثانية لتسريع التصريف إذا كانت طلباتك ذات مدة قصيرة.
  • وضع البداية البطيئة (ALB فقط): تصعيد الهدف الجديد من 0% إلى الحِمل الكامل على مدى 30–900 ثانية، مما يمنع إغراق نُسخ JVM أو Node.js الباردة فور تشغيلها.
  • خوارزمية موازنة الأحمال (ALB فقط): Round robin (الافتراضي)، أو Least outstanding requests (الأفضل لمدد طلبات متباينة)، أو Weighted random مع Least Outstanding Requests (الأحدث والأفضل للأسطح الكبيرة).
  • اللزوجة (Stickiness): مستندة إلى المدة (ملف تعريف ارتباط ELB) أو مستندة إلى التطبيق (ملف تعريف ارتباطك الخاص). تجنّب اللزوجة إلا إذا كان التطبيق يحتاجها فعلًا، إذ إنها تُفسد الغرض من التوسع الأفقي.

المستمعون والقواعد

المستمع (Listener) هو نقطة نهاية ذات منفذ وبروتوكول على موازن الأحمال (مثلًا HTTPS:443). يُقيّم قائمة مرتّبة من القواعد. تحتوي كل قاعدة على شروط (ترويسة المضيف، نمط المسار، طريقة HTTP، عنوان IP المصدر، معاملات الاستعلام، ترويسات HTTP) وإجراء (التوجيه إلى مجموعة أهداف، إعادة التوجيه، إرجاع استجابة ثابتة، المصادقة عبر Cognito/OIDC). تلتقط القاعدة الافتراضية كل شيء لا تطابقه القواعد السابقة.

إعداد قاعدة ALB نموذجي لنمط بوابة API في الخدمات المصغّرة:

aws elbv2 create-rule \ --listener-arn arn:aws:elasticloadbalancing:us-east-1:123456789012:listener/app/prod-alb/abc123/def456 \ --priority 10 \ --conditions '[ {"Field":"path-pattern","Values":["/api/v1/orders/*"]}, {"Field":"http-header","HttpHeaderConfig":{"HttpHeaderName":"X-Service","Values":["orders"]}} ]' \ --actions '[ {"Type":"forward","TargetGroupArn":"arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/orders-svc/abc"} ]'

بالنسبة لمستمعي HTTPS يجب إرفاق شهادة ACM (AWS Certificate Manager). يدعم ALB شهادات متعددة على مستمع واحد عبر SNI؛ يختار المستمع الشهادة المطابقة لترويسة Host، مما يُمكّن ALB واحدًا من خدمة عشرات النطاقات.

إنهاء TLS

يُنهي ELB اتصال TLS عند موازن الأحمال افتراضيًا. تقيم الشهادة في ACM ولا تُدار مفاتيح خاصة أبدًا على النُّسخ. تسير الاتصالات من ALB إلى الأهداف عبر الشبكة الخاصة في VPC. في بيئات الامتثال (PCI-DSS، HIPAA) التي تشترط التشفير طوال المسار حتى الهدف، يمكنك:

  1. تثبيت شهادة على الهدف وتكوين بروتوكول مجموعة الأهداف كـ HTTPS (يُعيد ALB التشفير)، أو
  2. استخدام NLB مع مستمع TLS وتمرير TCP مباشرةً إلى الهدف (تشفير كامل من طرف إلى طرف، لا يفكّ NLB التشفير).

يُعدّ اختيار سياسة أمان TLS أمرًا بالغ الأهمية. دائمًا فضّل ELBSecurityPolicy-TLS13-1-2-2021-06 (TLS 1.3 + TLS 1.2 مع شفرات قوية فقط) لموازنات الأحمال المواجهة للإنترنت. تجنّب السياسة القديمة ELBSecurityPolicy-2016-08 التي تسمح بـ TLS 1.0/1.1 — سيُشير مدققو PCI DSS وSOC 2 إليها على الفور.

# Terraform: ALB مع مستمع HTTPS، شهادة ACM، وسياسة TLS صارمة resource "aws_lb" "app" { name = "prod-app-alb" internal = false load_balancer_type = "application" subnets = var.public_subnet_ids security_groups = [aws_security_group.alb_sg.id] enable_deletion_protection = true drop_invalid_header_fields = true # أفضل ممارسة أمنية access_logs { bucket = aws_s3_bucket.alb_logs.id prefix = "prod-alb" enabled = true } } resource "aws_lb_listener" "https" { load_balancer_arn = aws_lb.app.arn port = 443 protocol = "HTTPS" ssl_policy = "ELBSecurityPolicy-TLS13-1-2-2021-06" certificate_arn = aws_acm_certificate_validation.app.certificate_arn default_action { type = "forward" target_group_arn = aws_lb_target_group.app.arn } } resource "aws_lb_listener" "http_redirect" { load_balancer_arn = aws_lb.app.arn port = 80 protocol = "HTTP" default_action { type = "redirect" redirect { port = "443" protocol = "HTTPS" status_code = "HTTP_301" } } } resource "aws_lb_target_group" "app" { name = "prod-app-tg" port = 8080 protocol = "HTTP" vpc_id = var.vpc_id target_type = "ip" # ECS Fargate / عناوين IP للـ pods deregistration_delay = 60 health_check { path = "/healthz" protocol = "HTTP" interval = 15 healthy_threshold = 2 unhealthy_threshold = 3 matcher = "200" } }
ALB request flow: client to targets via listener rules and target groups Client HTTPS:443 ALB Listener HTTPS:443 TLS Termination Rule: /api/* → TG-A Rule: default → TG-B Health checks Target Groups TG-A /api/* Target 1 Target 2 port 8080 (HTTP) TG-B default Target 3 Target 4 port 3000 (HTTP) ACM Certificate TLS 1.3 policy HTTP:80 Listener 301 → HTTPS:443
تدفق طلب ALB: يُوجَّه العميل عبر قواعد المستمع إلى مجموعات الأهداف؛ يتم إنهاء TLS عند ALB باستخدام شهادة ACM.

فحوصات الصحة وأوضاع الفشل

تُعدّ فحوصات صحة ELB الآلية التي تبعد حركة المرور عن الأهداف المعطوبة. يُصنَّف الهدف على أنه غير صحي بعد unhealthyThreshold من الإخفاقات المتتالية، ولا يعود صحيحًا إلا بعد healthyThreshold من النجاحات المتتالية. أبرز المشكلات الشائعة في الإنتاج:

  • مسار فحص الصحة يُرجع 200 والتطبيق معطوب: نقطة نهاية /ping سطحية تُرجع دائمًا 200 ستُبقي الهدف المعطوب في الدوران. استخدم نقطة نهاية فحص صحة عميقة (/healthz) تتحقق من اتصالية قاعدة البيانات، وتوفّر ذاكرة التخزين المؤقت، وأي تبعية حرجة.
  • مجموعة الأمان تحجب فحوصات صحة ELB: تنشأ فحوصات صحة ALB من عُقد ALB نفسها داخل VPC. يجب أن تسمح مجموعة أمان الهدف بحركة المرور الواردة على منفذ الفحص من مجموعة أمان ALB (لا من الإنترنت).
  • تأخير إلغاء التسجيل مرتفع جدًا: القيمة الافتراضية 300 ثانية تعني أن النشر المتدحرج ينتظر 5 دقائق لكل دفعة في انتظار تصريف الاتصالات. اضبطها بما يتناسب مع مدة الطلب عند النسبة المئوية التاسعة والتسعين لديك.
نصيحة إنتاجية — سجلات وصول ALB: دائمًا فعّل سجلات الوصول إلى S3 على موازنات أحمال ALB في الإنتاج. تُسجّل عنوان IP العميل، وURI الطلب، ورمز الاستجابة، والكمون، وعنوان IP الهدف، وشفرة TLS — وهي لا تقدّر بثمن خلال الحوادث. حجم السجلات مرتفع (استخدم S3 Intelligent-Tiering مع قاعدة دورة حياة للنقل إلى Glacier بعد 30 يومًا لإدارة التكلفة). اضبط drop_invalid_header_fields = true في Terraform لمنع هجمات HTTP desync (تهريب الطلبات).
NLB ومجموعات الأمان: لم تكن موازنات NLB تدعم مجموعات الأمان حتى عام 2023. إذا كان لديك NLB قديم، يجب أن تسمح مجموعات أمان الأهداف بحركة المرور من عناوين IP المرنة الخاصة بـ NLB ومن نطاق CIDR الخاص بالعملاء مباشرةً. تدعم موازنات NLB الأحدث مجموعات الأمان، وهو الإعداد المفضّل؛ فعّله بشكل صريح.

موازنة الأحمال عبر المناطق

افتراضيًا، توزّع كل عُقدة ALB (واحدة لكل منطقة توافر) الطلبات فقط على الأهداف المسجّلة في منطقة التوافر الخاصة بها. عند تفعيل موازنة الأحمال عبر المناطق (افتراضية لـ ALB، اختيارية لـ NLB)، تُوزّع كل عُقدة الطلبات بالتساوي على جميع الأهداف المسجّلة في كل مناطق التوافر. وهذا يُلغي الحاجة إلى الحفاظ على عدد متساوٍ من الأهداف في كل منطقة توافر — أمر حيوي عندما تمتد مجموعات Auto Scaling عبر مناطق توافر متعددة وتكون أعداد النُّسخ غير متساوية. تُحصّل NLB رسومًا على نقل البيانات عبر مناطق التوافر عند تفعيل موازنة الأحمال عبر المناطق؛ بينما لا تفعل ذلك ALB.

إن التمكّن من ELB — ولا سيما التفاعل بين قواعد المستمع، وفحوصات صحة مجموعة الأهداف، وتأخيرات إلغاء التسجيل، واختيار سياسة TLS — هو ما يُميّز المهندسين الذين "يجعلون الأمور تعمل فحسب" عن المهندسين الذين يبنون أنظمة تصمد أمام أعطال الإنتاج الحقيقية.