數字洋蔥的12天(第5天)-使用每日觸發器自動化生日提醒

歡迎來到第5天12天DigitalOcean昨天,您設置了您的生日提醒服務以在DigitalOcean Functions上運行,這意味著它現在是無伺服器且雲端就緒的。🎉 今天,您將進一步將其自動化以按其自己的計劃運行—無需手動輸入。

通過本指南的最後,您的服務(或任何其他您正在工作的功能)將每天在設定的時間自動運行。這意味著不再需要記住自己觸發它—它就可以運行。

為什麼自動化?

將您的功能部署到雲端昨天是一大勝利,但手動運行它違背了自動化的目的。今天的重點是將服務安排自動運行—如時鐘般精準—這樣您就可以設定它並忘記它。DigitalOcean Functions具有內建的觸發器的排程,用於此確切目的,您有兩種設置它的方式。

🚀 你將學到什麼

在今天結束前,你將知道如何:

  1. 設置每日觸發器自動運行你的函數。
  2. 學習兩種方法來實現這一點——通過 DigitalOcean 控制面板或使用 doctl CLI 和 project.yml
  3. 測試設置以確保其正常運行。

🛠 你需要的東西

在開始之前,確保你擁有以下內容:

  1. 一個已經部署在 DigitalOcean 上的函數(例如,第 4 天:構建生日提醒服務中的生日提醒服務)以便通過觸發器自動化。
  2. 如果使用 doctl CLI,您需要 project.yml 文件用于您的功能。您可以查看第4天有关安装和设置 doctl CLI,并创建 project.yml 文件的说明。

🧑‍🍳 第5天食谱:使用触发器自动化函数

步骤1:为您的函数设置触发器

在设置触发器方面,DigitalOcean 为您提供了两个选项:

  1. 选项1: 使用控制面板进行快速简便设置。
  2. 选项2: 使用 doctl CLI 进行更稳健和程序化的控制。

警告: 請記住,如果您使用 CLI 重新部署功能,則在 控制面板 中創建的觸發器將會丟失。如果您經常重新部署,請使用 選項 2 直接將觸發器添加到 project.yml 文件中。

選項 1:使用控制面板創建觸發器

設置觸發器最簡單的方法是通過 DigitalOcean 控制面板。這很快速,無需設置,並且非常適合簡單的一次性配置。

  • 在 DigitalOcean 控制台中導航到 主功能頁面
  • 找到您的功能(例如,reminders/birthdays),然後點擊 觸發器 標籤。

  • 點擊 創建觸發器,為您的觸發器添加 名稱。這可以是任何描述性的名稱,例如 daily-birthday-trigger。名稱只能包含字母數字字符、破折號和句點。
  • 添加 cron 表達式 以設置時間表。例如,0 9 * * * 意味著該功能將在每天上午 9:00 運行。

注意: 如果您不確定 cron 是如何工作的?請查看 crontab.guru 獲取方便的指南。

  • 保存 觸發器。

一旦您創建了觸發器,最好進行測試以確保一切如預期運行。跳轉到下面的 測試自動化 部分了解如何進行測試。

警告: 雖然儀表板簡單且有效,但如果您使用 CLI 重新部署該功能,您在此創建的任何觸發器將會被 覆蓋或刪除。對於頻繁更新或程式化部署,請跳到 選項 2

選項 2:使用 doctl CLI 和 project.yml

您也可以通過直接將觸發器添加到您的 project.yml 文件來創建觸發器。這種方法對於頻繁重新部署更可靠,因為它確保您的觸發器始終包含在功能的配置中。與之前描述的控制面板選項不同,這種方法可以防止觸發器在重新部署過程中被覆蓋或丟失。

以下是您可以如何設置:

  • 打開你的 project.yml 檔案,來自 第 4 天:使用 DigitalOcean Functions 部署生日通知。它可能看起來像這樣:

    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: daily-birthday-trigger
        sourceType: scheduler
        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 每天上午 9:00 執行 birthdays 函數。

    1. triggers 區段: 定義觸發器的名稱、類型和時間表。你可以將觸發器命名為任何描述性的名稱,例如 daily-birthday-trigger

    2. cron 指定函數每日在 UTC 的運行時間。例如,cron 表達式 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表達式設定為幾分鐘後(例如,如果現在是上午9:25,則設定為28 9 * * *)。確認它可以運作後,將其更新回您預期的排程並重新部署。

第2步:測試自動化

讓我們測試您的觸發器,確保它們可以運作。您可以暫時將它們設定為在幾分鐘後運行,而不必等待它們按照通常的排程運作。以下是操作步驟:

  • 將您的觸發器的cron表達式設定為幾分鐘後的當前時間(使用UTC)。例如,如果是UTC上午9:25,設定cron表達式為28 9 * * *,這樣該功能將在UTC上午9:28運行。

    注意:不確定如何將本地時間轉換為UTC?諸如時區轉換器之類的工具可以幫助。

  • 保存更新的觸發器(如果使用控制面板)或重新部署您的更新 project.yml 文件(如果使用 CLI):

    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

這確認了觸發器已啟動並且功能已成功啟用! 🎉

注意:一旦您確認一切正常,請將 cron 表達式更新為您預定的時間表(例如,0 9 * * * 表示每天 UTC 上午 9:00)並保存或重新部署。

關於日誌的簡要說明

雖然啟用日誌命令是檢查最近執行的好方法,但有時您需要更詳細的日誌來調試或調查您的功能的問題。DigitalOcean 也提供選項將這些日誌轉發到外部日誌服務,使您隨著時間的推移更容易監控和排除應用程序的故障。

在第六天,您將學會如何直接查看日誌,有效解讀它們,並設置日誌轉發到外部服務,如 Logtail 或 Papertrail。這些工具將幫助您輕鬆掌握功能的性能。

🎁 總結

今天您完成了以下內容:

  1. 您自動化了生日提醒服務(或任何其他功能)以每日運行。
  2. 您學會了兩種設置觸發器的方法——通過控制面板和使用 doctl CLI。
  3. 您測試了您的設置,以確保它按預期工作。

以下是本系列的先前教程:

接下來: 現在您的服務已獨立運行,下一步是有效地監控它。在下一個教程中,您將學習如何查看函數日誌並將其轉發到外部服務,以簡化追蹤和故障排除。到時見!

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