الـ 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