FinOps وتحسين تكاليف السحابة

تصميم البنية للتحكم في التكلفة

18 دقيقة الدرس 8 من 26

تصميم البنية للتحكم في التكلفة

كل قرار معماري يحمل تكلفةً تتراكم على مدى حياة النظام. المهندس الذي يختار استدعاء API متزامناً عبر المناطق بدلاً من طابور انتظار غير متزامن، أو يخزن بيانات التحليلات الدافئة في S3 Standard بدلاً من Intelligent-Tiering، يتخذ قراراً يؤثر في التكلفة — عادةً دون أن يدرك ذلك. عند إنفاق 5 ملايين دولار شهرياً على الحوسبة السحابية، يُشكّل الهدر المعماري عادةً 20–40% من الفاتورة، وهو أكبر بكثير مما تُحقّقه إعادة ضبط حجم الأجهزة الافتراضية. يتناول هذا الدرس الرافعات الثلاث الأكثر تأثيراً: التصميم الواعي بتكاليف نقل البيانات، وتدرّج التخزين، واقتصاديات الحوسبة بلا خوادم.

التصميم الواعي بتكاليف النقل

رسوم نقل البيانات هي البند الأكثر استهانةً في فاتورة السحابة. تُحصّل AWS لا شيئاً على البيانات الداخلة إلى المنطقة، لكنها تُحصّل $0.09 لكل GB خارج المنطقة إلى الإنترنت، و$0.02 لكل GB بين المناطق، و$0.01 لكل GB بين مناطق التوافر في الاتجاهين. بنية ميكروخدمات تُنتج 50 TB يومياً من حركة مرور تعبر مناطق التوافر تُكلّف نحو 15,000 دولار شهرياً في رسوم النقل وحدها.

  1. تجميع البيانات والحوسبة في مناطق التوافر ذاتها. قراءة EC2 من نسخة RDS في نفس منطقة التوافر لا تُكلّف شيئاً. القراءة ذاتها عبر منطقة توافر مختلفة تُكلّف $0.01/GB في كل اتجاه. استخدم التوجيه بالقرب (topologyKey: topology.kubernetes.io/zone في Kubernetes) لإبقاء المسارات الساخنة محلية.
  2. استبدال NAT Gateway بنقاط نهاية VPC. تمتلك S3 وDynamoDB Gateway Endpoints مجانية توجّه حركة المرور بصورة خاصة داخل AWS — لا رسوم معالجة NAT ($0.045/GB). NAT gateway تعالج 100 TB شهرياً من حركة S3 تُكلّف $4,500؛ نفس حركة المرور عبر Gateway Endpoint تُكلّف $0.
  3. دفع البيانات نحو الحافة لا نحو الأصل. معدلات إصابة ذاكرة التخزين المؤقت في CloudFront تبلغ 80–95%، مما يعني أن الأصل لا يُقدّم تلك البيانات أصلاً. خدمة تبث 1 PB شهرياً مباشرة من S3 تُكلّف ~$23,000 في النقل؛ عبر CloudFront بمعدل إصابة 85% تُكلّف ~$8,500.
  4. تصغير أحجام الحمولات بين الخدمات. أنماط التشعّب — حدث واحد يُشغّل 10 استدعاءات تُعيد كل منها 200 KB من JSON — تُضاعف حركة النقل بصمت. استخدم Protobuf أو Avro للتواصل الداخلي (أصغر 5–10 أضعاف من JSON) وأعد الحقول المختارة فقط.
التكرار عبر المناطق هو فخ النقل. تُنتج S3 Cross-Region Replication وDynamoDB Global Tables ونسخ قواعد البيانات في منطقة ثانية رسوم نقل مستمرة. استخدم التكرار فقط عندما تستدعيه متطلبات RTO/RPO فعلياً؛ لقطة يومية إلى حاوية باردة في منطقة ثانية كثيراً ما تكفي وتُكلّف 1/100 من ذلك.
Egress-aware design: free vs. costly data paths inside a VPC VPC (us-east-1) AZ-1 EC2 RDS Replica same AZ $0 S3 Gateway Endpoint private — no egress charge $0 AZ-2 EC2 $0.02/GB NAT Gateway $0.045/GB processed costly CloudFront cache hit = $0 origin
القراءات داخل منطقة التوافر الواحدة ونقاط نهاية VPC مجانية؛ الاستدعاءات عبر مناطق التوافر وممرات NAT Gateway تحمل رسوماً لكل GB تتراكم بسرعة.
# Terraform: S3 + DynamoDB Gateway Endpoints — إلغاء رسوم معالجة NAT resource "aws_vpc_endpoint" "s3" { vpc_id = aws_vpc.main.id service_name = "com.amazonaws.${var.region}.s3" vpc_endpoint_type = "Gateway" route_table_ids = concat( aws_route_table.private[*].id, aws_route_table.public[*].id ) tags = { Name = "s3-gateway-endpoint" } } resource "aws_vpc_endpoint" "dynamodb" { vpc_id = aws_vpc.main.id service_name = "com.amazonaws.${var.region}.dynamodb" vpc_endpoint_type = "Gateway" route_table_ids = aws_route_table.private[*].id tags = { Name = "dynamodb-gateway-endpoint" } } # Kubernetes: الحفاظ على حركة المرور داخل منطقة التوافر الواحدة apiVersion: apps/v1 kind: Deployment metadata: name: api-server spec: template: spec: topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: api-server

تدرّج التخزين

يُسعَّر التخزين السحابي على أساس الطبقة، وأغلب الفرق تستخدم طبقة واحدة فقط — Standard — لكل شيء. النتيجة دفع زائد كبير للبيانات نادرة الوصول. تتراوح أسعار S3 بين $0.023/GB/شهر في Standard وحتى $0.004/GB/شهر في Glacier Deep Archive — فارق 6 أضعاف. مجموعة بيانات حجمها 1 PB لم يُصل إليها منذ 180 يوماً لكنها في Standard تُكلّف $23,000 شهرياً دون داعٍ.

  • S3 Standard: $0.023/GB. للبيانات النشطة التي يُصل إليها عدة مرات شهرياً.
  • S3 Intelligent-Tiering: $0.023/GB + رسوم مراقبة $0.0025/1,000 كائن. ينقل الكائنات تلقائياً بين طبقتَي الوصول المتكرر والنادر بناءً على أنماط 30 يوماً. هذا هو الافتراضي المثالي لأي بيانات غير محدد نمط وصولها.
  • S3 Standard-IA: $0.0125/GB تخزيناً لكن $0.01/GB استرجاعاً. مناسب للنسخ الاحتياطية التي يُصل إليها بضع مرات سنوياً.
  • S3 Glacier Instant Retrieval: $0.004/GB. وقت استرجاع بالميلي ثانية. مناسب لأرشيفات الامتثال التي يُصل إليها مرة كل ربع سنة.
  • S3 Glacier Deep Archive: $0.00099/GB. استرجاع خلال 12 ساعة. للأرشيفات التنظيمية التي يجب الاحتفاظ بها 7 سنوات وتكاد لا تُستخدم.
قواعد دورة حياة S3 هي الإجراء الأعلى عائداً في التخزين. سياسة دورة حياة واحدة تنقل الكائنات إلى Intelligent-Tiering بعد 30 يوماً وإلى Glacier Deep Archive بعد 365 يوماً تُخفّض تكاليف التخزين بنسبة 60–70% على حاويات السجلات والقياسات دون أي تغيير في الكود. عند 100 TB من بيانات السجلات، ذلك وفر $1,600 شهرياً مقابل كتلة Terraform واحدة.
# Terraform: سياسة دورة حياة S3 لتدرّج التخزين resource "aws_s3_bucket_lifecycle_configuration" "logs" { bucket = aws_s3_bucket.logs.id rule { id = "logs-tiering" status = "Enabled" filter { prefix = "logs/" } transition { days = 30 storage_class = "INTELLIGENT_TIERING" } transition { days = 90 storage_class = "GLACIER_IR" } transition { days = 365 storage_class = "DEEP_ARCHIVE" } expiration { days = 2555 # 7 سنوات احتفاظ } } } # فحص توزيع فئات التخزين الحالية في حاوية aws s3api list-objects-v2 \ --bucket my-logs-bucket \ --query 'Contents[].{Key:Key,StorageClass:StorageClass,Size:Size}' \ --output json | \ jq 'group_by(.StorageClass) | map({class: .[0].StorageClass, count: length, total_gb: (map(.Size) | add / 1073741824 | round)})'

اقتصاديات الحوسبة بلا خوادم

تحوّل Lambda والخدمات المدارة نموذج التكلفة من الطاقة الاستيعابية إلى الاستهلاك الفعلي. هذا نموذج اقتصادي مختلف جذرياً، وله وجهان: عند الاستخدام المنخفض أو المتذبذب يكون بلا خوادم أرخص بكثير من الأجهزة المحجوزة؛ وعند الاستخدام المستدام العالي يصبح أغلى بكثير.

نقطة التعادل بين Lambda وأجهزة EC2 المحجوزة تقع عند حوالي 20–30% من الاستخدام. دون ذلك تفوز Lambda بالتكلفة؛ فوقه تفوز Reserved Instance أو Savings Plan. الأسئلة التحليلية الجوهرية:

  • ما معدل الاستدعاء عند p50 وp99 خلال 24 ساعة؟ الأعباء ذات نسبة نهار/ليل 10:1 هي مرشحات Lambda المثالية؛ الأعباء ذات الاستخدام الثابت 24/7 ليست كذلك.
  • ما مدة تنفيذ الدالة؟ Lambda تُحصّل رسوماً لكل GB-ثانية تنفيذ. دالة تستخدم 512 MB لمدة 200 ميلي ثانية تُكلّف $0.000001667 لكل استدعاء. عند مليار استدعاء شهرياً ذلك $1,667 مقابل ~$800 لعنقود Fargate مكافئ.
  • ما تكلفة تأخير البداية الباردة على تجربة المستخدم؟ تتراوح بدايات Lambda الباردة من 100 ميلي ثانية (Python/Node) إلى 3 ثوانٍ (JVM). Provisioned Concurrency تُلغيها لكن بتكلفة ~$0.015/ساعة لكل وحدة تزامن.
Lambda Power Tuning إجباري قبل الإنتاج. تختبر هذه الأداة دالتك عبر تكوينات الذاكرة من 128 MB إلى 10 GB وترسم العلاقة بين التكلفة والمدة. الإعداد الأمثل نادراً ما يكون الافتراضي 128 MB — دالة تعمل 1,400 ميلي ثانية عند 128 MB كثيراً ما تعمل 300 ميلي ثانية عند 512 MB بتكلفة إجمالية أقل بنسبة 20%.
# تشغيل Lambda Power Tuning لضبط دالة aws stepfunctions start-execution \ --state-machine-arn arn:aws:states:us-east-1:ACCOUNT_ID:stateMachine:powerTuningStateMachine \ --input '{ "lambdaARN": "arn:aws:lambda:us-east-1:ACCOUNT_ID:function:my-api-handler", "powerValues": [128, 256, 512, 1024, 2048, 3008], "num": 50, "payload": {}, "parallelInvocation": true, "strategy": "cost" }' # Terraform: Lambda مضبوطة الذاكرة مع تحديد صلاحية السجلات resource "aws_lambda_function" "api" { function_name = "api-handler" runtime = "python3.12" memory_size = 512 # من نتيجة Power Tuning timeout = 15 } resource "aws_cloudwatch_log_group" "lambda" { name = "/aws/lambda/${aws_lambda_function.api.function_name}" retention_in_days = 14 # الافتراضي "لا انتهاء أبداً" — تكلفة متراكمة شائعة }

قائمة التحقق المعماري للتكلفة

قبل أي مراجعة معمارية أو فحص جاهزية للإنتاج، اطرح هذه الأسئلة:

  • هل كل استدعاء بين الخدمات يعبر منطقة توافر أو منطقة جغرافية؟ هل ذلك مبرر بمتطلبات المرونة أم مجرد طوبولوجيا عرضية؟
  • هل توجد NAT gateway في المسار لحركة مرور يمكن توجيهها عبر VPC endpoint بدلاً منها؟
  • هل توجد بيانات في S3 Standard لم يُصل إليها منذ 30 يوماً؟ هل توجد قاعدة دورة حياة؟
  • هل جرى قياس استخدام ذاكرة دوال Lambda؟ هل مجموعات السجلات مضبوطة على الانتهاء؟
  • هل تُستخدم الحوسبة بلا خوادم لأعباء عالية ومستدامة حيث تكون الحوسبة المحجوزة أرخص؟
  • هل يجري قياس معدلات إصابة ذاكرة CDN؟ هل وقت صلاحية الذاكرة المؤقتة محدد بقصد أم مترك للإعداد الافتراضي؟
أضف التكلفة إلى قالب وثيقة التصميم. فقرة واحدة تُقدّر "هذا التصميم سيُنتج X GB يومياً من حركة مرور بين مناطق التوافر بتكلفة $Y شهرياً ويخزن Z TB في S3 Standard بتكلفة $W شهرياً" — تستغرق خمس دقائق وقت التصميم وتمنع أشهراً من الإنفاق الزائد. اجعلها قسماً إلزامياً في قالب RFC أو وثيقة التصميم.