يا جماعة الخير، السلام عليكم ورحمة الله. اسمي أبو عمر، وبشتغل في عالم البرمجة والذكاء الاصطناعي من سنين طويلة. اليوم بدي أحكي لكم قصة صارت معي قبل فترة، قصة فيها شوية توتر، ودرس كبير، وحل عملي أنقذ الموقف، ولهلأ بدعي للي اخترعه.
كان يوم خميس، نهاية شهر، وأنا قاعد مرتاح البال بشرب فنجان القهوة الصباحي وبتصفح الإيميلات. فجأة، بتوصلني رسالة من قسم المحاسبة، عنوانها “استفسار عاجل بخصوص فاتورة GCP”. قلبي بلش يدق أسرع شوي. فتحت الرسالة وإذ بصورة من لوحة تحكم الفوترة، والرقم… يا ساتر! رقم أكبر بأربع أو خمس أضعاف من المعتاد. للحظة حسيت الدم هرب من وجهي، زي ما بنقول “قلبي وقع بين رجليّ”.
بعد شوية تحقيق وتحفير في سجلات GCP، اكتشفنا المصيبة. واحد من المطورين الجداد في الفريق، شب شاطر ومتحمس، كان بجرب خوارزمية تدريب لنموذج ذكاء اصطناعي على سيرفر (VM Instance) بمواصفات عالية جداً، فيه كروت شاشة (GPUs) من النوع الغالي. الشب خلص شغله و “نسي” السيرفر شغال لأكثر من أسبوعين! طبعاً العداد كان شغال ليل نهار، والتكلفة تراكمت بشكل جنوني.
دفعنا الفاتورة واحنا مش مبسوطين أبداً، بس الأهم من الدفع هو الدرس. في هديك اللحظة قررت: “هذا الأشي لازم ما يتكرر مرة ثانية”. الخطأ البشري وارد، والنسيان جزء من طبيعتنا، لكن الاعتماد على الذاكرة في عالم الحوسبة السحابية هو وصفة لكارثة مالية. من هنا بدأت رحلتي مع بناء نظام إنذار مبكر، وكان البطل في قصتنا هو n8n.
ما هي n8n ولماذا هي المنقذ؟
قبل ما ندخل في التفاصيل التقنية، خليني أبسّط لكم فكرة n8n. تخيلها زي علبة “ليغو” (Lego) بس للمبرمجين والمطورين. هي أداة أتمتة مفتوحة المصدر (Open-Source) بتخليك تربط بين تطبيقات وخدمات مختلفة (APIs) عن طريق واجهة رسومية سهلة جداً. بدل ما تكتب أكواد معقدة عشان تخلي خدمة “أ” تحكي مع خدمة “ب”، أنت بس بتسحب “مكعب” كل خدمة وبتربطهم ببعض.
أجمل ما في n8n بالنسبة لي:
- مفتوحة المصدر وقابلة للاستضافة الذاتية (Self-Hosted): بتقدر تنزلها على سيرفرك الخاص، وهذا بيعطيك تحكم كامل وخصوصية وأمان، وكمان بتوفر تكاليف الاشتراكات الشهرية الباهظة للأدوات المنافسة.
- مرونة هائلة: فيها مئات من “المكعبات” الجاهزة (Nodes) لأشهر الخدمات زي Slack, Telegram, Google Sheets, AWS, GCP, وغيرها كثير. وإذا في خدمة مش موجودة، بتقدر تبني لها “مكعب” خاص فيك بسهولة باستخدام الـ HTTP Request Node.
- مرئية وسهلة الفهم: بتقدر تشوف تدفق العمل (Workflow) قدامك، وهذا بيخلي اكتشاف الأخطاء وتعديل المنطق أسهل بكثير من قراءة مئات أسطر الكود.
الخطة: من رد الفعل إلى الفعل الاستباقي
كانت المشكلة واضحة: نحن نكتشف التكلفة العالية بعد فوات الأوان. الحل يجب أن يكون استباقياً. الخطة كانت بسيطة جداً من حيث المبدأ:
- كل يوم في ساعة محددة (مثلاً 9 صباحاً)، يقوم النظام بالعمل تلقائياً.
- يتصل بواجهة برمجة تطبيقات الفوترة في Google Cloud (GCP Billing API).
- يسأل: “كم صرفنا من بداية اليوم لحد الآن؟”.
- يقارن الرقم بحد أقصى مسموح به (مثلاً 50 دولار).
- إذا كان الصرف أعلى من الحد، يرسل تنبيهاً فورياً على قناة Slack الخاصة بفريق المطورين مع تفاصيل المبلغ.
هيك بنحول المشكلة من “صدمة نهاية الشهر” إلى “تنبيه يومي يمكن التعامل معه فوراً”.
بناء ورك فلو المراقبة على n8n خطوة بخطوة
يلا نشمّر عن إيدينا ونشوف كيف بنينا هذا الحل عملياً. الشرح للمبتدئين والمحترفين، فلا تقلق.
المتطلبات الأساسية
قبل ما نبدأ، لازم يكون عندك:
- حساب n8n شغال (سواء على n8n Cloud أو مستضاف ذاتياً).
- حساب Google Cloud Project مع صلاحيات للوصول إلى Billing API.
- إنشاء “Service Account” في GCP وتنزيل ملف الـ JSON الخاص به. هذا الملف هو بمثابة هوية وكلمة سر لتطبيقنا (n8n) عشان يقدر يحكي مع Google بأمان.
- قناة Slack أو حساب Telegram لتلقي التنبيهات.
نصيحة من أبو عمر: عند إنشاء الـ Service Account، أعطه أقل صلاحيات ممكنة (Least Privilege Principle). في حالتنا، هو يحتاج فقط صلاحية `Billing Account Viewer` أو صلاحيات مشابهة لقراءة بيانات الفوترة، لا أكثر. هذا يزيد من أمان النظام.
الخطوة الأولى: الجدولة (Schedule Node)
هذا هو “مُشغّل” الـ Workflow. هو اللي ببدأ كل العملية.
في n8n، نضيف نود جديد ونختار `Schedule`.
نضبط الإعدادات لتكون “كل يوم” (Every Day) في الساعة 9 صباحاً مثلاً. بسيطة جداً.
الخطوة الثانية: جلب بيانات الفوترة (HTTP Request Node)
هذه هي أهم خطوة. هنا سنتواصل مع Google Cloud API. للأسف، GCP لا توفر API مباشر يقول لك “أعطني تكلفة اليوم”، لكن يمكننا التحايل على هذا بذكاء باستخدام الـ Budgets API.
أولاً، في لوحة تحكم GCP:
- اذهب إلى قسم “Billing” ثم “Budgets & alerts”.
- أنشئ “Budget” جديد. سمّه مثلاً “Daily Cost Monitor”.
- في نطاق الميزانية (Scope)، اختر كل الخدمات (All services).
- في خانة المبلغ (Amount)، ضع مبلغاً كبيراً جداً لا يمكن الوصول إليه في يوم (مثلاً 100,000$). الهدف ليس تحديد ميزانية فعلية، بل استخدام هذه الأداة كعداد.
- أهم إعداد: في “Actions”، لا تضع أي تنبيهات عبر الإيميل. نحن سنتحكم بالتنبيهات عبر n8n.
ثانياً، في n8n:
سنستخدم الآن الـ Budget الذي أنشأناه. كل Budget له API خاص به يمكننا من معرفة التكلفة الحالية المتراكمة ضمنه.
- أضف نود `HTTP Request`.
- Method: `GET`
- URL: ستحتاج إلى بناء هذا الرابط. ابحث في GCP عن الـ Billing Account ID والـ Budget ID الذي أنشأته للتو. سيكون الرابط شيئاً كهذا:
https://billingbudgets.googleapis.com/v1/billingAccounts/YOUR_BILLING_ACCOUNT_ID/budgets/YOUR_BUDGET_ID - Authentication: اختر `Google API`.
- Credentials: أنشئ credentials جديدة من نوع `Google Service Account` والصق محتوى ملف الـ JSON الذي نزلته من GCP.
عند تشغيل هذا النود، ستحصل على رد JSON يحتوي على معلومات كثيرة، من ضمنها object اسمه `budgetStatus` وبداخله `costAmount` وهو يمثل التكلفة منذ بداية فترة الميزانية (التي هي شهرية افتراضياً). نحن سنقوم بتعديل بسيط لاحقاً للتعامل مع هذا.
تحديث مهم للمنطق: بما أن الـ Budget API يعطي التكلفة الشهرية، فالطريقة الأبسط هي تخزين قيمة اليوم السابق ومقارنتها بقيمة اليوم الحالي. لكن لتسهيل الشرح هنا، سأفترض أننا وجدنا طريقة (عبر فلترة متقدمة أو API آخر مثل Cost Management API) لجلب تكلفة اليوم فقط. في الواقع العملي، قد تحتاج لخطوة إضافية باستخدام نود `Function` لكتابة كود JavaScript بسيط يقوم بحساب الفرق بين تكلفة الأمس واليوم.
الخطوة الثالثة: التحقق من الشرط (IF Node)
هذا هو العقل المدبر. يأخذ الرقم من الخطوة السابقة ويقرر هل يطلق الإنذار أم لا.
- أضف نود `IF`.
- في “Value 1″، سنضع تعبيراً (Expression) لجلب قيمة التكلفة من النود السابق. سيبدو التعبير هكذا (قد يختلف قليلاً حسب بنية الـ JSON العائد):
{{$json["budgetStatus"]["costAmount"]["units"]}} - في “Operation”، اختر `Larger Than`.
- في “Value 2″، ضع الحد الأقصى الذي حددته (مثلاً `50`).
هذا النود له مخرجان: `true` (إذا تحقق الشرط) و `false` (إذا لم يتحقق). نحن سنهتم فقط بمخرج الـ `true`.
الخطوة الرابعة: إرسال التنبيه (Slack/Telegram Node)
هذا هو جرس الإنذار.
- اربط مخرج الـ `true` من نود الـ IF بنود جديد من نوع `Slack` (أو `Telegram`).
- قم بربط حسابك في Slack (عادة عبر Webhook URL).
- في حقل “Text”، اكتب الرسالة التي تريد إرسالها. وهنا تظهر قوة n8n، حيث يمكنك دمج بيانات من النودات السابقة في الرسالة.
مثال على رسالة مفيدة:
🚨 *تحذير: تجاوز الإنفاق اليومي على Google Cloud* 🚨
يا فريق، انتبهوا! ✋
التكلفة اليومية المسجلة حتى الآن هي: *{{$node["HTTP Request"].json.budgetStatus.costAmount.units}} {{$node["HTTP Request"].json.budgetStatus.costAmount.currencyCode}}*
الحد المسموح به هو: 50$.
يرجى التحقق من الموارد التي تعمل حالياً على GCP فوراً عبر الرابط:
https://console.cloud.google.com/billing
وهكذا، اكتمل النظام! الآن كل يوم في التاسعة صباحاً، سيتم فحص التكلفة، وإذا كانت مرتفعة، سيصل تنبيه فوري ومباشر للفريق المعني، مما يسمح لهم بالتحرك السريع وإيقاف أي موارد منسية قبل أن تتفاقم الفاتورة.
خلاصة ونصيحة من أخوكم أبو عمر 🚀
صدمة الفاتورة تلك كانت درساً قاسياً، لكنها قادتنا لحل أفضل وأكثر استدامة. تعلمنا أن الاعتماد على الانضباط البشري وحده لا يكفي في بيئة سريعة ومعقدة مثل الحوسبة السحابية. الأتمتة ليست رفاهية، بل هي ضرورة وحزام أمان.
باستخدام أداة بسيطة وقوية مثل n8n، تمكنا من بناء شبكة أمان مخصصة لنا في أقل من ساعة، وبدون كتابة أكواد معقدة. هذا النظام لا يراقب GCP فقط، بل قمنا بتوسيعه لاحقاً لمراقبة تكاليف AWS وبعض الاشتراكات الأخرى.
نصيحتي لك: لا تنتظر الصدمة لتبدأ بالتحرك. كن استباقياً. سواء كنت تعمل وحدك أو ضمن فريق كبير، خذ نصف ساعة من وقتك اليوم وابدأ ببناء ورك فلو بسيط لمراقبة تكاليفك. ابدأ بشيء صغير، ثم طوّره مع الوقت. ستشكر نفسك في نهاية كل شهر عندما ترى فواتيرك تحت السيطرة، وستنام قرير العين وأنت تعلم أن “أبو عمر” الصغير الذي بنيته في n8n يراقب الأوضاع بدلاً عنك.
بالتوفيق يا جماعة، وإذا عندكم أي سؤال، أنا حاضر.