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

فهم فواتير السحابة

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

فهم فواتير السحابة

فواتير السحابة ليست عشوائية. كل دولار في تقرير AWS Cost Explorer أو GCP Billing أو Azure Cost Management يُقابل حدثاً مُقاساً محدداً: ثانية معالج مُستهلكة، غيغابايت مُخزَّنة، بايت منقول خارج منطقة. المشكلة أن مزودي الخدمة السحابية يعرضون تلك الأحداث عبر مئات وحدات SKU وعشرات أبعاد التسعير وفخاخ الحد المجاني التي تجعل الإجمالي يبدو معتماً. يُعلّمك هذا الدرس قراءة الفاتورة كما يفعل مهندس FinOps في Netflix أو Lyft — من خلال تحديد محرّكات التكلفة الثلاثة الأساسية (الحوسبة والتخزين والنقل الخارجي) والجناة المعتادين الذين يُضخّمون كل منها.

قاعدة 80/20 للإنفاق السحابي: في أعباء العمل الإنتاجية النموذجية، تُمثّل الحوسبة 50–70% من الإنفاق، والتخزين 10–20%، ونقل البيانات (الصادر) 5–20%. أما النسبة المتبقية 5–15% فتشمل قواعد البيانات المُدارة، وDNS، والمراقبة، والمتنوعات. معرفة هذا التوزيع تُخبرك بمكان التركيز: تخفيض 30% في تكلفة الحوسبة يفوق تخفيض 30% في تكلفة الخروج في كل الأحوال — ما لم يكن إنفاقك على الخروج كبيراً بصورة شاذة (وهو أمر شائع في بث الوسائط أو تطبيقات SaaS الكثيفة تصدير البيانات).

الحوسبة: المحرّك الرئيسي للتكلفة

لتكلفة الحوسبة ثلاثة أبعاد فرعية يسعّرها مزودو الخدمة السحابية دائماً بشكل منفصل: ساعات الاستخدام (وقت vCPU + RAM)، وترخيص نظام التشغيل (رسوم إضافية لـ Windows/RHEL فوق تكلفة العتاد)، وإضافات التسريع (GPU أو FPGA أو إنتاجية Elastic Network Adapter). قراءة بنود EC2 دون فهم الثلاثة يعطيك صورة ناقصة.

الجناة المعتادون الذين يُضخّمون فواتير الحوسبة:

  • الخوادم الزومبي: الخوادم المُتركة تعمل بعد اختبار الحمل أو العرض التوضيحي أو البيئة التطويرية التي لم تُحذف قط. بسعر $0.096 في الساعة لـ m5.xlarge، يُكلّف الخادم المنسي $840 سنوياً. اضرب هذا في 15–30 خادماً تتركها فرق الهندسة عادةً خلفها، وسيكون لديك تسرّب بقيمة $15–25 ألف دون أي قيمة تجارية.
  • عائلات الخوادم المُفرطة في الموارد: اختيار m5.2xlarge لأنه كان الإعداد الافتراضي في Terraform ولم يطعن فيه أحد. في كبرى الشركات التقنية، يبلغ متوسط استخدام المعالج عبر الحوسبة التي تُدفع عند الطلب 12–25%. تحجيم الموارد (الدرس 4) يسترد كثيراً من هذا، لكنك لا تستطيع تحجيم ما لا تستطيع رؤيته.
  • غياب Savings Plans أو Reserved Instances: التسعير عند الطلب هو السعر الإرشادي — السقف لا الحد الأدنى. تمنح AWS Compute Savings Plans خصماً 40–60% عن الأسعار الفورية مقابل التزام بسنة أو ثلاث سنوات. تشغيل EC2 بقيمة $200 ألف شهرياً عند الطلب حين يمكن استخدام Savings Plan هو تسرّب بقيمة $80–120 ألف سنوياً. (يتناول الدرس 5 الالتزامات بعمق.)
  • سوء تهيئة Auto-Scaling: سياسات التوسع التي تُضيف طاقة أسرع مما تُزيلها سياسات التقليص، أو الحجج الدنيا للأسطول المضبوطة بتحفظ مبالغ فيه لحركة المرور خارج ساعات الذروة. حدٌّ أدنى من 10 خوادم يجب أن يكون 3 خلال الليالي وعطلات نهاية الأسبوع يُكلّف أموالاً حقيقية 168 ساعة أسبوعياً.
  • بوابات NAT وموازنات التحميل الخاملة: تُكلّف كل بوابة AWS NAT $0.045 في الساعة (~$390 سنوياً) بالإضافة إلى $0.045 لكل غيغابايت مُعالَج، بصرف النظر عن حركة المرور. البيئات المُنشأة لفترة سبرينت ولم تُحذف قط تُبقي هذه الموارد تعمل إلى أجل غير مسمى.
# استعلم عن فاتورة AWS لبنود الحوسبة باستخدام واجهة CLI لـ Cost Explorer. # يسترد هذا آخر 30 يوماً مُصنَّفاً حسب نوع الخادم وخيار الشراء. aws ce get-cost-and-usage \ --time-period Start=2025-05-01,End=2025-06-01 \ --granularity MONTHLY \ --filter '{ "Dimensions": { "Key": "SERVICE", "Values": ["Amazon Elastic Compute Cloud - Compute"] } }' \ --group-by '[ {"Type":"DIMENSION","Key":"INSTANCE_TYPE"}, {"Type":"DIMENSION","Key":"PURCHASE_TYPE"} ]' \ --metrics "UnblendedCost" \ --query 'ResultsByTime[0].Groups[*].[Keys,Metrics.UnblendedCost.Amount]' \ --output table # المقابل في GCP: قائمة إنفاق Compute Engine حسب وصف SKU gcloud billing accounts list # احصل على ACCOUNT_ID bq query --use_legacy_sql=false \ 'SELECT sku.description, SUM(cost) AS total_cost FROM `billing_export_dataset.gcp_billing_export_v1_XXXXXX` WHERE service.description = "Compute Engine" AND DATE(_PARTITIONTIME) BETWEEN "2025-05-01" AND "2025-06-01" GROUP BY 1 ORDER BY 2 DESC LIMIT 20'

التخزين: صامت لكنه يتراكم

تكاليف التخزين خادعة لأنها تنمو تدريجياً ولا تُولّد تنبيهاً أبداً. فريق لا يحذف شيئاً يُضيف غيغابايتات في كل سبرينت — صور حاويات قديمة، ونسخ احتياطية لقواعد بيانات مُتجاوَزة، وأقراص EBS غير مُستخدمة مرتبطة بخوادم مُنهاة، وأدلة S3 تحوّلت إلى مكان إلقاء للسجلات.

الفئات الرئيسية لتكاليف التخزين:

  • أقراص EBS المنفصلة عن الخوادم المُنهاة: عند إنهاء خادم EC2 دون تفعيل DeleteOnTermination: true على قرصه الجذر، يستمر قرص EBS ويُقدّم الفاتورة بسعر $0.08–$0.10 للغيغابايت شهرياً. قرص بسعة 500 غيغابايت يُكلّف $40 شهرياً دون أي نشاط. قسّم هذا على فريق يُنهي عشرات الخوادم شهرياً ولا يتحقق أبداً من الأقراص المُهملة.
  • عدم تطابق فئة تخزين S3: S3 Standard بسعر $0.023 للغيغابايت شهرياً مقابل S3 Glacier Instant Retrieval بسعر $0.004 للغيغابايت شهرياً للبيانات التي يُصل إليها مرة كل ربع سنة. السجلات والنسخ الاحتياطية ومجموعات بيانات تدريب ML الجالسة في Standard لأن أحداً لم يُهيّئ سياسة دورة حياة هو دفع زائد بمقدار 5–6 أضعاف.
  • انتشار اللقطات الفوضوي: تُنشئ النسخ الاحتياطية الآلية لـ RDS لقطات يومية تُحتفظ بها لمدة 7 أيام افتراضياً — وهو أمر مقبول. لكن اللقطات اليدوية المُنشأة خلال نافذة الصيانة والتي لم تُحذف قط تتراكم إلى أجل غير مسمى. خادم RDS بسعة 2 تيرابايت مع 18 شهراً من اللقطات الأسبوعية اليدوية لديه ~70 تيرابايت من تخزين اللقطات بسعر $0.095 للغيغابايت شهرياً = $6,650 شهرياً في تكاليف اللقطات وحدها، وهو ما يتجاوز تقريباً تكلفة الخادم نفسه.
  • انتفاخ سجل الحاويات: كل docker push إلى ECR أو GCR يُخزّن بياناً جديداً. فريق نشيط يدفع 20 بناءً يومياً بصورة حجمها 1 غيغابايت ودون سياسة دورة حياة يتراكم لديه 7,200 طبقة صور سنوياً. تُقيّد ECR $0.10 للغيغابايت شهرياً بعد الحصة المجانية.
Cloud Bill Anatomy — Three Primary Cost Drivers Cloud Bill Anatomy — Primary Cost Drivers Compute 50–70% of bill Instance Hours (vCPU + RAM) Zombie Instances Missing Savings Plans AutoScale Min Too High Idle NAT Gateways $390/yr each Storage 10–20% of bill Orphaned EBS Volumes S3 Storage Class Mismatch Snapshot Sprawl Container Registry Bloat No Lifecycle Policies 5–6x overpayment risk Egress 5–20% of bill Internet Egress $0.09/GB Cross-AZ Traffic Cross-Region Replication NAT Gateway Data Charges Missing CDN Offload CloudFront = $0.0085/GB
المحرّكات الثلاثة الرئيسية لفاتورة السحابة: الحوسبة تهيمن بنسبة 50–70%، والتخزين يتراكم بصمت، ونقل البيانات الصادر يرتفع مع تدفقات البيانات عبر مناطق التوافر أو عبر المناطق الجغرافية. تُشير المربعات الحمراء إلى أنماط الهدر الأكثر شيوعاً.

نقل البيانات الصادر: الضريبة الخفية التي تُفاجئ الفرق

تسعير نقل البيانات غير متماثل عمداً: الوارد (البيانات القادمة إلى السحابة) مجاني؛ أما الصادر (البيانات المُغادِرة) فمكلف. تفرض AWS تقريباً $0.09 للغيغابايت لأول 10 تيرابايت شهرياً من الخروج عبر الإنترنت، تنخفض إلى $0.085 في النطاق الواسع. تفرض GCP $0.08 للغيغابايت لأول 10 تيرابايت. تفرض Azure $0.087 للغيغابايت. تبدو هذه الأرقام صغيرة حتى تدير منصة بيانات تنقل تيرابايتات يومياً.

فئات تكاليف النقل الصادر التي تُفاجئ الفرق:

  • حركة المرور عبر مناطق التوافر: تفرض AWS $0.01 للغيغابايت على البيانات التي تعبر مناطق التوافر. هذا غير مرئي في التطوير (منطقة توافر واحدة) لكنه يُصبح جوهرياً في النشر الإنتاجي متعدد مناطق التوافر. بنية خدمات مصغّرة تُجري 100,000 استدعاء متزامن عبر الخدمات في الثانية، يُعيد كل منها 5 كيلوبايت، تعبر حدود مناطق التوافر في نحو 50% من تلك الاستدعاءات في إعداد 3 مناطق — أي 15 غيغابايت في الساعة أو $130 شهرياً من زوج خدمة واحد. اضرب في 50 خدمة مصغّرة.
  • النسخ المتماثل عبر المناطق الجغرافية: نسخ دلو S3 أو قراءة نسخة متماثلة من RDS عبر المناطق يُكلّف كلاً من التخزين ونقل البيانات. نسخ 5 تيرابايت من us-east-1 إلى eu-west-1 يُكلّف $0.02 للغيغابايت = $100 لكل تيرابايت لمرة واحدة، بالإضافة إلى حركة النسخ المتماثل المستمرة.
  • معالجة بيانات بوابة NAT: كل بايت من شبكة فرعية خاصة يعبر بوابة NAT يُقيَّد بـ $0.045 للغيغابايت فوق التكلفة الساعية للبوابة. وظائف Lambda في VPC تصل إلى S3 عبر NAT (بدلاً من نقطة نهاية VPC) هو مثال كلاسيكي للدفع $0.045 للغيغابايت مقابل بيانات يمكن أن تكون مجانية.
  • واجهة برمجة تطبيقات مباشرة مقابل CloudFront: تقديم الأصول الكبيرة (الصور، مقاطع الفيديو، الملفات القابلة للتنزيل) مباشرة من أصل EC2 أو S3 يُكلّف $0.09 للغيغابايت. وضع CloudFront أمامه يُكلّف $0.0085 للغيغابايت من حافة CDN — انخفاض 10 أضعاف لحركة المرور التي تُصاب في الكاش.
# تحديد أعلى رسوم خروج البيانات مع AWS Cost Explorer وتحليل الوسوم. # الخطوة 1 — ابحث عن أعلى بنود نقل البيانات للشهر الماضي aws ce get-cost-and-usage \ --time-period Start=2025-05-01,End=2025-06-01 \ --granularity MONTHLY \ --filter '{ "Dimensions": { "Key": "SERVICE", "Values": ["AWS Data Transfer"] } }' \ --group-by '[{"Type":"DIMENSION","Key":"USAGE_TYPE"}]' \ --metrics "UnblendedCost" \ --query 'ResultsByTime[0].Groups[*].[Keys[0],Metrics.UnblendedCost.Amount]' \ --output table | sort -t'|' -k3 -rn | head -20 # الخطوة 2 — اكتشف حركة المرور عبر مناطق التوافر باستخدام VPC Flow Logs. # استعلم باستخدام Athena (بافتراض إنشاء جدول سجلات التدفق مسبقاً): # SELECT srcaddr, dstaddr, SUM(bytes)/1073741824.0 AS gb_transferred # FROM vpc_flow_logs # WHERE action = 'ACCEPT' # AND az_id IS NOT NULL # AND srcaddr LIKE '10.%' -- RFC-1918 داخلي # GROUP BY 1, 2 # ORDER BY 3 DESC # LIMIT 30; # الخطوة 3 — تحقق من Lambda أو EC2 التي تصل إلى S3 عبر NAT بدلاً من نقطة نهاية VPC aws ec2 describe-vpc-endpoints \ --query 'VpcEndpoints[?ServiceName==`com.amazonaws.us-east-1.s3`].[VpcId,State]' \ --output table # إذا كانت النتيجة فارغة: لا توجد نقطة نهاية S3 VPC — كل حركة مرور S3 تمر عبر بوابة NAT
فخ نقطة نهاية VPC: إنشاء نقطة نهاية VPC لـ S3 مجاني. التوجيه عبر بوابة NAT يُكلّف $0.045 للغيغابايت. أعباء العمل الكثيفة بـ Lambda التي تقرأ من S3 دون نقطة نهاية VPC يمكنها توليد فاتورة NAT Gateway أكبر من تكلفة تنفيذ Lambda نفسها. هذا أحد الإصلاحات الأعلى عائداً في خمس دقائق في البنية التحتية السحابية — أنشئ نقطة النهاية وحدّث جداول التوجيه، وسيُعاد توجيه حركة المرور تلقائياً بدون تكلفة.

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

كل مراجعة FinOps يجب أن تتبع نفس التحليل من الأعلى إلى الأسفل. ابدأ من الإجمالي، وقسّمه إلى فئات خدمات، ثم أدخل في أعلى المتحركات والشذوذات. يدعم AWS Cost Explorer وGCP Billing Reports وواجهة ce CLI جميعها هذا النمط.

# سكريبت تصنيف التكلفة المنظّم — يعمل شهرياً من مهمة CI أو cron. # يُخرج ملخص التكلفة إلى Slack أو تقرير markdown. #!/usr/bin/env bash set -euo pipefail MONTH_START=$(date -d "$(date +%Y-%m-01) -1 month" +%Y-%m-%d 2>/dev/null \ || date -v-1m -v1d +%Y-%m-%d) # توافق GNU / BSD date MONTH_END=$(date +%Y-%m-01) echo "=== تقرير تكلفة السحابة: ${MONTH_START} حتى ${MONTH_END} ===" # 1. التكلفة الإجمالية echo -e "\n--- الإجمالي ---" aws ce get-cost-and-usage \ --time-period Start="${MONTH_START}",End="${MONTH_END}" \ --granularity MONTHLY \ --metrics "UnblendedCost" \ --query 'ResultsByTime[0].Total.UnblendedCost.Amount' \ --output text # 2. أعلى 10 خدمات حسب التكلفة echo -e "\n--- أعلى الخدمات ---" aws ce get-cost-and-usage \ --time-period Start="${MONTH_START}",End="${MONTH_END}" \ --granularity MONTHLY \ --group-by '[{"Type":"DIMENSION","Key":"SERVICE"}]' \ --metrics "UnblendedCost" \ --query 'sort_by(ResultsByTime[0].Groups, &Metrics.UnblendedCost.Amount)[-10:][*].[Keys[0],Metrics.UnblendedCost.Amount]' \ --output table # 3. الموارد غير الموسومة (فجوة توزيع التكلفة) echo -e "\n--- الإنفاق غير الموسوم ---" aws ce get-cost-and-usage \ --time-period Start="${MONTH_START}",End="${MONTH_END}" \ --granularity MONTHLY \ --filter '{"Not":{"Tags":{"Key":"team","Values":["*"],"MatchOptions":["EXISTS"]}}}' \ --metrics "UnblendedCost" \ --query 'ResultsByTime[0].Total.UnblendedCost.Amount' \ --output text
سمّ مبكراً، سمّ كل شيء. في Netflix، كل مورد سحابي موسوم بـ team وservice وenvironment وcost-center وقت الإنشاء، يُفرض بواسطة SCP (سياسة التحكم في الخدمة) التي ترفض إنشاء الموارد غير الموسومة. بدون وسوم، لا يمكنك توزيع التكلفة على فريق، ولا تحديد ميزانيات لكل خدمة، ولا معرفة أي خدمة مصغّرة تمتلك دلو S3 الذي يُكلّف $4,000 شهرياً. العمود الرابع في أي نقاش FinOps هو دائماً "من يمتلك هذا؟" — والوسوم هي البنية التحتية التي تجعل هذا السؤال قابلاً للإجابة.

ترجمة وحدات SKU إلى سلوكيات

تستخدم بنود تقديم الخدمة السحابية أوصاف SKU مختصرة تُخفي السلوك الأساسي. تعلّم جدول الترجمة هو مهارة FinOps أساسية:

  • DataTransfer-Out-Bytes — خروج الإنترنت من EC2 أو ELB؛ $0.09/GB
  • APN1-DataTransfer-Regional-Bytes — عبر مناطق التوافر داخل منطقة واحدة؛ $0.01/GB (تسمية "Regional" هي التلميح)
  • USE1-NatGateway-Bytes — معالجة بيانات بوابة NAT؛ $0.045/GB
  • EBS:VolumeUsage.gp3 — تخزين EBS المُحجوز بصرف النظر عن حالة الارتباط؛ $0.08/GB-month
  • RDS:StorageIOUsage — رسوم I/O على خوادم RDS القديمة المستندة إلى gp2؛ صفر على gp3 المُحجوزة IOPS
  • BoxUsage:m5.xlarge — ساعات خادم EC2 عند الطلب؛ بند الحوسبة الأكثر شيوعاً
  • HeavyUsage:m5.xlarge — استخدام Reserved Instance الموروث؛ يظهر في الحسابات القديمة المستمرة على RI بدلاً من Savings Plans

عند ظهور SKU غير مألوف، الحل الأسرع هو AWS Pricing API أو كتالوج GCP SKU — كلاهما قابل للاستعلام ويُعيد أوصافاً مقروءة للإنسان. لا تخمّن أبداً ما يعنيه SKU بناءً على اسمه؛ البعد السعري المخفي بداخله (لكل ساعة أو لكل غيغابايت أو لكل طلب) يُحدد رافعة التحسين.

اكتشاف الشذوذات ليس اختيارياً على نطاق واسع. يجب تهيئة AWS Cost Anomaly Detection وGCP Budget Alerts قبل أن تحتاجهما. وظيفة Lambda جامحة تعالج حدثاً مشوّهاً في حلقة إعادة محاولة لا نهاية لها، أو قاعدة نسخ متماثل S3 مُهيّأة خطأً ترسل 10 تيرابايت يومياً عبر المناطق، أو مجموعة تحجيم تلقائي تتوسع إلى 500 خادم خلال هجوم DDoS — كلها تبدو متشابهة في الفاتورة: ارتفاع مفاجئ. اضبط تنبيه شذوذ يومي عند 20% فوق المتوسط لـ 7 أيام كخط أساسي. عند إنفاق $100,000 شهرياً، ارتفاع يومي 20% يعني $667 تكلفة غير متوقعة — يمكن اكتشافها في ساعات بدلاً من اكتشافها في نهاية الشهر.