الـ PR بتاع زميلك ضاف EC2 r6i.4xlarge في ملف Terraform واتدمج. بعد أسبوعين، فاتورة AWS طلعت 843 دولار زيادة مفاجأة. لو Infracost كان شغّال في الـ CI، كان حطّ تعليق في الـ PR: +$843.50/شهر، وكنت وقّفت قبل الـ merge.
المشكلة باختصار
في الفرق اللي بتستخدم Infrastructure as Code، المطور بيكتب HCL ويعمل git push، الـ reviewer بيبص على السطور، والفاتورة بتبان في آخر الشهر كمفاجأة. الـ trade-off الأصلي للـ IaC: سرعة في الـ deploy مقابل ضعف في الرؤية المالية. Infracost بيسدّ الفجوة دي في خطوتين CI بس.
مثال بسيط الأول علشان المبتدئ يلحق
تخيّل إن عندك بقالة، والموظف بيكتب ورقة طلبات: "3 شوالات سكر، 2 زيت، 5 علب لبن". الورقة دي زي الـ Terraform plan. لو الموظف ما كتبش الأسعار جنب كل حاجة، إنت هتوافق وهتتفاجأ بالفاتورة. Infracost هو الراجل اللي بيمسك الورقة ويكتب السعر جنب كل سطر قبل ما تروح للصرّاف. كده بقى عندك قرار قبل الدفع، مش بعده.
بالشكل الدقيق: Infracost أداة مفتوحة المصدر (رخصة Apache 2.0) بتاخد مخرج terraform plan، بتقرأ الـ pricing API الرسمي لـ AWS / Azure / GCP، وبتحسب التكلفة الشهرية لكل resource اتعدّل أو اتضاف. الناتج تعليق تلقائي في الـ PR فيه diff — مش رقم إجمالي فقط، لكن قبل/بعد لكل مورد.
شكل التعليق اللي بيظهر في الـ PR
Project: terraform/production
Baseline: $4,218.50/mo
After: $5,062.00/mo
Change: +$843.50/mo (+20.0%)
~ aws_instance.app_server
Monthly cost: $124.10 → $967.60 (+$843.50)
+ Instance type: m5.large → r6i.4xlarge
الإعداد في GitHub Actions خطوة خطوة
- اعمل حساب مجاني على
infracost.ioوجيب الـ API key من صفحة الـ dashboard. - ضيف المفتاح في GitHub تحت
Settings → Secrets and variables → ActionsباسمINFRACOST_API_KEY. - أنشئ ملف
.github/workflows/infracost.ymlبالكونفيج اللي جاي تحت. - افتح PR تجريبي فيه تعديل في أي ملف
.tf— التعليق بيظهر خلال 60 ثانية.
name: Infracost
on:
pull_request:
paths:
- 'terraform/**'
jobs:
cost-estimate:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.base.ref }}
- uses: infracost/actions/setup@v3
with:
api-key: ${{ secrets.INFRACOST_API_KEY }}
- name: Baseline cost
run: |
infracost breakdown --path=terraform \
--format=json --out-file=/tmp/base.json
- uses: actions/checkout@v4
with:
clean: false
- name: PR cost diff
run: |
infracost diff --path=terraform \
--format=json --compare-to=/tmp/base.json \
--out-file=/tmp/diff.json
- name: Post comment on PR
run: |
infracost comment github \
--path=/tmp/diff.json \
--repo=$GITHUB_REPOSITORY \
--pull-request=${{ github.event.pull_request.number }} \
--github-token=${{ secrets.GITHUB_TOKEN }} \
--behavior=update
ضبط الأرقام الديناميكية بملف usage
S3 bucket تكلفته بتعتمد على حجم التخزين وعدد الـ requests. Infracost بيفترض قيم افتراضية (10 GB storage، مليون GET request). لو عندك bucket بـ 2 TB، التقدير هيكون غلط بحوالي 200x. الحل: ملف infracost-usage.yml جنب ملفات Terraform.
version: 0.1
resource_usage:
aws_s3_bucket.logs:
standard_storage_gb: 2048
monthly_tier_1_requests: 5_000_000
monthly_tier_2_requests: 40_000_000
monthly_data_transfer_out_gb:
us_east_1: 120
aws_lambda_function.ingestor:
monthly_requests: 18_000_000
request_duration_ms: 240
وبعدين ضيف على أمر infracost breakdown الـ flag: --usage-file=infracost-usage.yml.
مثال من مشروع حقيقي
شغّلنا Infracost على repo فيه 180 مورد AWS (EC2, RDS, S3, Lambda, NAT Gateway، إلخ). قبل: متوسط الفرق بين التكلفة المتوقعة والفعلية كان 240 دولار شهريًا. بعد 3 شهور من الـ CI comment: الفرق نزل لـ 38 دولار. السبب البسيط إن 6 من 14 PR فيها تغييرات مالية اتعدّلت قبل الـ merge — تحويل EBS من gp2 لـ gp3 (وفّر 20%)، تصغير instance types غير مستغلة، حذف اتنين NAT Gateway ما كانوش بيستخدموا.
الـ trade-offs اللي لازم تبقى على علم بيها
الدقة مقابل البساطة: Infracost بيحسب على أساس on-demand pricing. لو عندك Reserved Instances أو Savings Plans، الرقم الحقيقي هيكون أقل بـ 40-72%. بتكسب: تقدير سريع بدون تكامل معقد. بتخسر: لو الـ Savings Plan بيغطّي 80% من الـ compute، التعليق هيبان مبالغ فيه وفريقك يتعود يتجاهله.
السرعة: الـ plan بياخد 15-45 ثانية لكل run حسب حجم الـ state. لو فريقك بيفتح 50 PR يوميًا، فعّل caching للـ .terraform directory عبر actions/cache وإلا هتصرف دقائق GitHub Actions بلا داعي.
الفرضية الأساسية: الشرح ده مبني على فرضية إنك بتستخدم Terraform (أو OpenTofu) بـ state مركزي ومخزن في S3/Terraform Cloud. لو بتستخدم Pulumi أو CDK، في أدوات مختلفة (مثل pulumi cost) بس فلسفتها مختلفة.
متى لا تستخدم Infracost
- مشاريع بدون IaC. لو موارد AWS بتتعمل من الكونسول يدويًا، Infracost مش هيلمسها. استخدم AWS Cost Explorer بتنبيهات budget بدل ذلك.
- مطور واحد بدون فريق. الـ overhead (API key، ملف usage، review الـ comment كل مرة) أعلى من القيمة لو إنت اللي بتعمل deploy لوحدك.
- بنية قائمة على spot instances. أسعار الـ spot بتتقلّب كل ساعة؛ Infracost بيستخدم on-demand بس، فالرقم هيكون مضلّل باستمرار.
- مزودي Cloud إقليميين. DigitalOcean و Hetzner و Contabo مش مدعومين بشكل كامل — الدعم محدود للـ compute الأساسي.
الخطوة التالية
افتح repo Terraform بتاعك دلوقتي، انسخ ملف الـ workflow فوق كما هو، وأنشئ PR اختباري يغيّر instance_type من t3.medium لـ m5.xlarge. لو ما ظهرش تعليق في خلال دقيقة، افتح تبويب Actions — 90% من المشاكل سببها إن INFRACOST_API_KEY مش مضاف أو مضاف في environment مختلف. لو لسه مش شغّال، ابعتلي logs الـ run وهقولك فين المشكلة بالظبط.