12 يومًا من DigitalOcean (اليوم 5) – أتمتة تذكيرات عيد الميلاد مع المحفزات اليومية

مرحبًا بكم في اليوم الخامس من 12 يومًا من DigitalOcean! بالأمس، قمت بإعداد خدمة تذكير عيد الميلاد لتعمل على وظائف DigitalOcean، مما يعني أنها الآن بدون خادم وجاهزة للعمل في السحابة. 🎉 اليوم، ستأخذها خطوة أخرى من خلال أتمتتها لتعمل وفق جدولها الخاص – دون الحاجة إلى إدخال يدوي.

بنهاية هذا الدليل، ستعمل خدمتك (أو أي وظيفة أخرى تعمل عليها) تلقائيًا في وقت محدد كل يوم. هذا يعني أنه لا داعي لتذكر تشغيلها بنفسك – إنها تعمل ببساطة.

لماذا الأتمتة؟

كان نشر وظيفتك إلى السحابة انتصارًا كبيرًا بالأمس، لكن الحاجة إلى تشغيلها يدويًا تفسد الغرض من الأتمتة. تركيز اليوم هو على جدولة الخدمة لتعمل تلقائيًا – مثل الساعة – حتى تتمكن من ضبطها ونسيانها. تحتوي وظائف DigitalOcean على جدولة مدمجة باستخدام المحفزات لهذا الغرض بالذات، ولديك طريقتان لإعدادها.

🚀 ما ستتعلمه

بنهاية اليوم، ستعرف كيفية:

  1. إعداد مشغل يومي لتشغيل دالتك تلقائيًا.
  2. تعلم طريقتين للقيام بذلك – من خلال لوحة تحكم DigitalOcean أو باستخدام doctl CLI و project.yml.
  3. اختبر الإعداد للتأكد من أنه يعمل.

🛠 ما ستحتاجه

قبل البدء، تأكد من أنك تمتلك ما يلي:

  1. دالة تم نشرها بالفعل على DigitalOcean (على سبيل المثال، خدمة تذكير بعيد الميلاد من اليوم 4: بناء خدمة تذكير بعيد الميلاد) لتقوم بأتمتتها باستخدام المشغلات.
  2. إذا كنت تستخدم واجهة سطر الأوامر doctl، ستحتاج إلى ملف project.yml لوظيفتك. يمكنك الاطلاع على اليوم الرابع للحصول على تعليمات حول تثبيت وإعداد واجهة سطر الأوامر doctl، وإنشاء ملف project.yml.

🧑‍🍳 وصفة لليوم الخامس: أتمتة الوظائف باستخدام المحفزات

الخطوة 1: إعداد محفز لوظيفتك

تمنحك DigitalOcean خيارين لإعداد المحفزات:

  1. الخيار 1: استخدم لوحة التحكم للإعداد السريع والسهل.
  2. الخيار 2: استخدم واجهة سطر الأوامر doctl للحصول على تحكم أكثر قوة وبرمجياً.

تحذير: تذكر أن الزنادات التي تم إنشاؤها في لوحة التحكم تفقد إذا قمت بإعادة نشر الوظيفة باستخدام واجهة سطر الأوامر. إذا كنت ستقوم بإعادة النشر بشكل متكرر، استخدم الخيار 2 لإضافة الزنادات مباشرة إلى ملف project.yml.

الخيار 1: استخدام لوحة التحكم لإنشاء زناد

أسهل طريقة لإعداد زناد هي من خلال لوحة التحكم في DigitalOcean. إنها سريعة، ولا تتطلب إعدادًا، ومثالية لتكوينات بسيطة لمرة واحدة.

  • انتقل إلى صفحة الوظائف الرئيسية في لوحة تحكم DigitalOcean.
  • ابحث عن وظيفتك (على سبيل المثال، reminders/birthdays) وانقر على علامة التبويب الزنادات.

  • انقر على إنشاء زناد، وأضف اسماً للزناد الخاص بك. يمكن أن يكون أي وصف، مثل daily-birthday-trigger. يجب أن يحتوي الاسم على أحرف أبجدية رقمية فقط، وشرطات، ونقاط.
  • أضف تعبير cron لتحديد الجدول الزمني. على سبيل المثال، 0 9 * * * يعني أن الوظيفة ستعمل كل يوم في الساعة 9:00 صباحًا.

ملاحظة: إذا كنت غير متأكد من كيفية عمل cron؟ قم بزيارة crontab.guru للحصول على دليل مفيد.

  • احفظ الزناد.

بمجرد إنشاء الزناد الخاص بك، من الجيد اختباره للتأكد من أن كل شيء يعمل كما هو متوقع. انتقل إلى القسم اختبار التلقائي أدناه لمعرفة كيفية القيام بذلك.

تحذير: بينما تكون لوحة التحكم بسيطة وفعالة، فإن أي مشغلات تقوم بإنشائها هنا ستتم كتابة فوقها أو حذفها إذا قمت بإعادة نشر الوظيفة باستخدام واجهة سطر الأوامر (CLI). للتحديثات المتكررة أو النشر البرمجي، انتقل إلى الخيار 2.

الخيار 2: استخدام واجهة سطر الأوامر doctl مع project.yml

يمكنك أيضًا إنشاء مشغلات عن طريق إضافتها مباشرة إلى ملفك project.yml. هذه الطريقة أكثر موثوقية للتجديدات المتكررة لأنها تضمن أن مشغلاتك مضمنة دائمًا في تكوين الوظيفة. على عكس خيار لوحة التحكم الموصوف سابقًا، تمنع هذه الطريقة المشغلات من الكتابة فوقها أو فقدانها أثناء إعادة النشر.

إليك كيف يمكنك إعداد ذلك:

  • افتح ملف project.yml الخاص بك من اليوم الرابع: نشر إشعارات عيد الميلاد باستخدام وظائف DigitalOcean. قد يبدو شيء مثل هذا:

    packages:
      - name: reminders
        shared: false
        environment:
          DO_DB_NAME: "${DB_NAME}"
          DO_DB_USER: "${DB_USER}"
          DO_DB_PASSWORD: "${DB_PASSWORD}"
          DO_DB_HOST: "${DB_HOST}"
          DO_DB_PORT: "${DB_PORT}"
          TWILIO_ACCOUNT_SID: "${TWILIO_ACCOUNT_SID}"
          TWILIO_AUTH_TOKEN: "${TWILIO_AUTH_TOKEN}"
          TWILIO_PHONE_FROM: "${TWILIO_PHONE_FROM}"
          TWILIO_PHONE_TO: "${TWILIO_PHONE_TO}"
        functions:
          - name: birthdays
            runtime: python:default
    
  • أضف قسم triggers إلى تكوين وظيفتك لتحديد الجدول الزمني:

    triggers:
      - name: يومياً-تنبيه-بالميلاد
        sourceType: جدول زمني
        sourceDetails:
        cron: "0 9 * * *"
    
  • ملف project.yml المحدث النهائي:

    packages:
      - name: reminders
        shared: false
        environment:
          DO_DB_NAME: "${DB_NAME}"
          DO_DB_USER: "${DB_USER}"
          DO_DB_PASSWORD: "${DB_PASSWORD}"
          DO_DB_HOST: "${DB_HOST}"
          DO_DB_PORT: "${DB_PORT}"
          TWILIO_ACCOUNT_SID: "${TWILIO_ACCOUNT_SID}"
          TWILIO_AUTH_TOKEN: "${TWILIO_AUTH_TOKEN}"
          TWILIO_PHONE_FROM: "${TWILIO_PHONE_FROM}"
          TWILIO_PHONE_TO: "${TWILIO_PHONE_TO}"
        functions:
          - name: birthdays
            runtime: python:default
            triggers:
              - name: daily-birthday-trigger
                sourceType: scheduler
                sourceDetails:
                  cron: "0 9 * * *"
    

    هذا يخبر DigitalOcean بتشغيل وظيفة birthdays كل يوم في الساعة 9:00 صباحًا.

    1. triggers القسم: يحدد الاسم والنوع والجدول الزمني للمشغل. يمكنك تسمية المشغل الخاص بك بأي شيء وصفي، مثل daily-birthday-trigger.

    2. cron: يحدد الوقت الذي ستعمل فيه الوظيفة يوميًا بتوقيت UTC. على سبيل المثال، تعبير الكرون 0 9 * * * يحدد تشغيل الوظيفة كل يوم في الساعة 9:00 صباحًا.

  • احفظ الملف ونشره عن طريق تشغيل الأمر التالي من الدليل الذي يحتوي على مجلد my-birthday-reminder-service:

    doctl serverless deploy my-birthday-reminder-service
    

    مهم: تأكد من تشغيل الأمر من الدليل الأب، وليس داخل مجلد my-birthday-reminder-service. تشغيله من الموقع الخاطئ يمكن أن يؤدي إلى خطأ مثل هذا:

    ❯ doctl serverless deploy my-birthday-reminder-service
    خطأ: ENOENT: لا يوجد مثل هذا الملف أو الدليل، lstat
    
  • بمجرد أن يتم النشر بنجاح، سترى رسالة تأكيد مشابهة لهذه:

    الوظائف المنشورة
      - reminders/birthdays
    المحفزات المنشورة:
      - daily-birthday-trigger
    

  • انتقل إلى لوحة التحكم الخاصة بك للتحقق مما إذا تم إنشاء المشغل تحت قسم الوظائف.

نصيحة محترف: لاختبار المشغل الخاص بك، قم بتعيين التعبير cron مؤقتًا إلى بضع دقائق من الآن (على سبيل المثال، 28 9 * * * إذا كانت الساعة 9:25 صباحًا). بعد التأكد من أنه يعمل، قم بتحديثه مرة أخرى إلى الجدول الزمني المقصود وأعِد نشره.

الخطوة 2: اختبار التلقائي

لنختبر المشغلات الخاصة بك للتأكد من أنها تعمل. بدلاً من الانتظار حتى يتم تنفيذها وفقًا لجدولها الزمني المعتاد، يمكنك تعيينها مؤقتًا لتشغيلها بضع دقائق من الآن. إليك كيفية فعل ذلك:

  • قم بتعيين التعبير cron الخاص بالمشغل إلى بضع دقائق من الوقت الحالي (بتوقيت UTC). على سبيل المثال، إذا كانت الساعة 9:25 صباحًا بتوقيت UTC، فقم بتعيين التعبير cron إلى 28 9 * * * حتى تعمل الوظيفة في الساعة 9:28 صباحًا بتوقيت UTC.

    ملاحظة: غير متأكد كيفية تحويل الوقت المحلي إلى UTC؟ يمكن أن تساعد الأدوات مثل محول التوقيت.

  • احفظ المشغل المحدث (إذا كنت تستخدم لوحة التحكم) أو أعد نشر ملف project.yml المحدث الخاص بك (إذا كنت تستخدم واجهة سطر الأوامر):

    doctl serverless deploy my-birthday-reminder-service
    
  • انتظر حتى يتم تنفيذ المشغل، ثم تحقق من سجلات التفعيل لتأكيد أن الوظيفة قد تم تشغيلها بنجاح:

    doctl serverless activations logs --function reminders/birthdays --last
    

ملاحظة: تسجل سجلات التفعيل تفاصيل حول متى تم تنفيذ الوظيفة الخاصة بك، بما في ذلك ما إذا كانت قد نجحت في التشغيل أو واجهت أخطاء. إنها وسيلة مفيدة للتحقق من أن الزناد قد تم تفعيله في الوقت المحدد.

ستعيد هذه الأمر تفاصيل عن أحدث تفعيل لوظيفتك. على سبيل المثال، قد ترى شيئًا مثل هذا:

=== 59e8e4f482874d79a8e4f48287dd79ef success 12/23 07:46:33 reminders/birthdays:0.0.6
2024-12-23T07:46:33.323205805Z stdout: Message sent for Charlie Brown. Message SID: SM85f5caeb3ec09239e0d8bdaaba2b158b

هذا يؤكد أن الزناد قد تم تفعيله وأن الوظيفة قد تم تفعيلها بنجاح! 🎉

ملاحظة: بمجرد التحقق من أن كل شيء يعمل، قم بتحديث تعبير الكرون إلى الجدول الزمني المطلوب (على سبيل المثال، 0 9 * * * ل9:00 صباحًا بتوقيت غرينتش يوميًا) واحفظ أو أعد نشر.

ملاحظة سريعة حول السجلات

بينما يعد الأمر سجلات التفعيل وسيلة رائعة للتحقق من عمليات التشغيل الأخيرة، في بعض الأحيان ستحتاج إلى سجلات أكثر تفصيلاً لاستكشاف الأخطاء أو التحقيق في مشكلات مع وظيفتك. توفر DigitalOcean أيضًا خيارات لإعادة توجيه هذه السجلات إلى خدمات تسجيل خارجية، مما يسهل المراقبة وحل المشاكل في تطبيقك مع مرور الوقت.

في اليوم السادس، ستتعلم كيفية عرض السجلات مباشرة، تفسيرها بشكل فعال، وإعداد تحويل السجلات إلى خدمات خارجية مثل Logtail أو Papertrail. ستساعدك هذه الأدوات على البقاء على اطلاع بأداء وظائفك بسهولة.

🎁 الخاتمة

إليك ما أنجزته اليوم:

  1. لقد قمت بأتمتة خدمة تذكير عيد الميلاد الخاصة بك (أو أي وظيفة أخرى) لتعمل يوميًا.
  2. لقد تعلمت طريقتين لإعداد المحفزات—من خلال لوحة التحكم ومع doctl CLI.
  3. لقد اختبرت إعدادك للتأكد من أنه يعمل كما هو متوقع.

إليك الدروس السابقة من هذه السلسلة:

التالي: الآن بعد أن تعمل خدمتك بشكل مستقل، الخطوة التالية هي مراقبتها بفعالية. في البرنامج التعليمي التالي، ستتعلم كيفية عرض سجلات وظائفك وإرسالها إلى خدمات خارجية لتبسيط التتبع وحل المشكلات. أراك حينئذ!

Source:
https://www.digitalocean.com/community/tutorials/automating-birthday-reminders-with-triggers